/* * Table rotated text: * Create a table containing rotated text * * Create a table with rotated text lines and Textflow spanning several rows. * * Required software: PDFlib/PDFlib+PDI/PPS 9 * Required data: none */ package com.pdflib.cookbook.pdflib.table; import com.pdflib.pdflib; import com.pdflib.PDFlibException; public class table_rotated_text { public static void main (String argv[]) { /* This is where the data files are. Adjust as necessary. */ String searchpath = "../input"; String outfile = "table_rotated_text.pdf"; String title = "Table Rotated Text"; pdflib p = null; int row, tf=-1, tbl=-1; int i, j, regularfont, boldfont; int exitcode = 0; String htlcell_opts, vtlcell_opts, tfcell_opts, tf_opts, fittab_opts; String result; final double pagewidth = 595, pageheight = 842; final double fontsize = 12; final double capheight = 8.5; final int margin = 4; final String leading = "120%"; final int c_table = 1, c_numbers = 1, c_description = 4; final int c_models = 2, c_category = 1, c_model = 2, c_plane = 3; final int r_model = 4, r_plane = 4, r_description = 4; /* The table coordinates are fixed */ final int llx = 50, urx = (int) pagewidth - llx; final int lly = 30, ury = (int) pageheight - lly; final int yoffset = 10; final int ycontinued = lly - yoffset; /* Row height */ final double rowheight = 16; /* Column widths */ final int cwfirst = 50, cwplane = 50, cwdescription = 100; final int maxcols = 4; /* Projects */ final String models [] = { "Rockets", "Gliders", "Arrows", "Darts" }; final String descriptions [] = { "With the paper rockets you can send all your messages even when " + "sitting in a hall or in the cinema pretty near the back.", "Unbelievable sailplanes! They are amazingly robust and can even do " + "aerobatics. But they are best suited to gliding.", "The paper arrows can be thrown with big swing. We launched it from " + "the roof of a hotel. It stayed in the air a long time and covered " + "a considerable distance.", "The super darts can fly giant loops with a radius of 4 or 5 meters " + "and can cover long distances. Its heavy cone point is slightly " + "bowed upwards to get the lift required for loops" }; /* Three planes belong to each model */ final String planes [][] = { { "Long Distance Glider", "Giant Wing", "Spider Glider" }, { "Cone Head Rocket", "Turbo Flyer", "Red Baron" }, { "Free Gift", "Bare Bone Kit", "Witty Kitty" }, { "Super Dart", "Giga Trash", "Cool Carve" } }; try { p = new pdflib(); p.set_option("searchpath={" + searchpath + "}"); /* This means we must check return values of load_font() etc. */ p.set_option("errorpolicy=return"); if (p.begin_document(outfile, "") == -1) throw new Exception("Error: " + p.get_errmsg()); p.set_info("Creator", "PDFlib Cookbook"); p.set_info("Title", title); /* Load the bold and regular styles of a font */ boldfont = p.load_font("Helvetica-Bold", "unicode", ""); if (boldfont == -1) throw new Exception("Error: " + p.get_errmsg()); regularfont = p.load_font("Helvetica", "unicode", ""); if (regularfont == -1) throw new Exception("Error: " + p.get_errmsg()); /* Start the output page */ p.begin_page_ext(pagewidth, pageheight, ""); /* Prepare the general option list for horizontal and vertical text line * cells: * The height of an uppercase letter is exactly represented by the * capheight value of the font. For this reason use the capheight in the * font size specification. For example, to match a row height of 16, * you could use a capheight of 8.5 and a margin of 4. * "colwidth" defines a fixed column width. * "rowheight" defines a fixed row height. * "margin" adds some empty space between the text and the cell borders. */ htlcell_opts = "fittextline={font=" + boldfont + " fontsize={capheight=" + capheight + "} position={left top}} " + " colwidth=" + cwfirst + " rowheight=" + rowheight + " margin=" + margin; vtlcell_opts = "fittextline={font=" + regularfont + " fontsize={capheight=" + capheight + "} position={center}" + " orientate=west} " + " colwidth=" + cwfirst + " rowheight=" + rowheight + " margin=" + margin; /* -------------------------------------------------------------- * In the first four rows, add the text line cells containing the * headings * -------------------------------------------------------------- */ row = 1; /* Add the "Plane Table" heading spanning all columns */ tbl = p.add_table_cell(tbl, c_table, row++, "Plane Table", htlcell_opts + " colspan=" + maxcols); if (tbl == -1) throw new Exception("Error adding cell: " + p.get_errmsg()); /* Add the column number headings */ for (i = c_numbers; i <= maxcols; i++) { tbl = p.add_table_cell(tbl, i, row, String.valueOf(i), htlcell_opts); if (tbl == -1) throw new Exception("Error adding cell: " + p.get_errmsg()); } row++; /* Add the "Description" heading */ tbl = p.add_table_cell(tbl, c_description, row, "Description", htlcell_opts); if (tbl == -1) throw new Exception("Error adding cell: " + p.get_errmsg()); /* Add the "Models" heading */ tbl = p.add_table_cell(tbl, c_models, row++, "Models", htlcell_opts + " colspan=2"); if (tbl == -1) throw new Exception("Error adding cell: " + p.get_errmsg()); /* --------------------------------------------------------------------- * In the first column add a heading as text line cell orientated to the * west and spanning as much rows as planes are available * --------------------------------------------------------------------- */ int nplanes = planes.length * planes[0].length; tbl = p.add_table_cell(tbl, c_category, row, "Paper Planes Standard Collection", vtlcell_opts + " rowspan=" + nplanes); if (tbl == -1) throw new Exception("Error adding cell: " + p.get_errmsg()); /* ------------------------------------------------------------------- * In the second column add the individual model headings as text line * cells orientated to the west and spanning three rows each * ------------------------------------------------------------------- */ row = r_model; for (i = 1; i <= models.length; i++) { tbl = p.add_table_cell(tbl, c_model, row, models[i-1], vtlcell_opts + " rowspan=3"); if (tbl == -1) throw new Exception("Error adding cell: " + p.get_errmsg()); row += 3; } /* -------------------------------------------------------------------- * In the third column add the individual planes as Textflow cells with * all cells having the same height * -------------------------------------------------------------------- */ row = r_plane; /* Prepare the option list for adding a Textflow. * "leading" specifies the distance between to text lines. */ tf_opts = "font=" + regularfont + " fontsize={capheight=" + capheight + "} leading=" + leading; for (i = 0; i < planes.length; i++) { for (j = 0; j < planes[i].length; j++) { /* Add the Textflow */ tf = p.add_textflow(-1, planes[i][j], tf_opts); if (tf == -1) throw new Exception("Error: " + p.get_errmsg()); /* Prepare the option list for adding the Textflow cell * To avoid any space from the top add the Textflow cell using * "fittextflow={firstlinedist=capheight}". * "verticalalign=top" will place the text at the top of the * cell. * "rowheight" defines the row height, and "colwidth" specifies * the column width. * "margin" adds some empty space between the text and the cell * borders. * "rowscalegroup=myscaling" assigns the group "myscaling" to * each of the cells to ensure that all cells will be scaled to * have the same height. */ tfcell_opts = "textflow=" + tf + " fittextflow={firstlinedist=capheight verticalalign=top}" + " rowheight=" + rowheight + " colwidth=" + cwplane + " margin=" + margin + " rowscalegroup=myscaling"; /* Add the table cell */ tbl = p.add_table_cell(tbl, c_plane, row++, "", tfcell_opts); if (tbl == -1) throw new Exception("Error: " + p.get_errmsg()); } } /* ----------------------------------------------------------------- * Add the descriptions as Textflow cells orientated to the west and * spanning three rows each * ----------------------------------------------------------------- */ row = r_description; /* Prepare the option list for adding a Textflow. For a description see * above. */ tf_opts = "font=" + regularfont + " fontsize={capheight=" + capheight + "} leading=" + leading; for (i = 0; i < descriptions.length; i++) { /* Add the Textflow */ tf = p.add_textflow(-1, descriptions[i], tf_opts); if (tf == -1) throw new Exception("Error: " + p.get_errmsg()); /* Prepare the option list for adding the Textflow cell. * "orientate=west" orientates the Textflow to the west. * "rowheight" and "colwidth" specify the height of the row and the * width of the column. * "margin" adds some empty space between the text and the cell * borders. * With "rowspan=3" the cell will span three rows. */ tfcell_opts = "textflow=" + tf + " fittextflow={firstlinedist=capheight verticalalign=top" + " orientate=west}" + " rowheight=" + rowheight + " colwidth=" + cwdescription + " margin=" + margin + " rowspan=3"; /* Add the table cell */ tbl = p.add_table_cell(tbl, c_description, row, "", tfcell_opts); if (tbl == -1) throw new Exception("Error: " + p.get_errmsg()); row += 3; } /* ------------------------------------ * Place the table on one or more pages * ------------------------------------ */ /* Prepare the option list for fitting the table. * "header=4" will repeat the first four rows at the beginning of * each new page. The "stroke" option will stroke lines with two * different line widths. The table frame is stroked with a line width * of 1, all other lines are stroked with a line width of 0.3. */ fittab_opts = "header=3 stroke={" + "{line=frame linewidth=1} {line=other linewidth=0.3} }"; /* Loop until all of the table is placed; create new pages as long as * more table instances need to be placed */ do { /* Place the table instance */ result = p.fit_table(tbl, llx, lly, urx, ury, fittab_opts); if (result.equals("_error")) throw new Exception ("Couldn't place table: " + p.get_errmsg()); /* A return value of "break" has been explicitly specified in * add_table_cell() when adding the cell for a certain time interval * after which a new page shall be started. */ if (result.equals("_boxfull") || result.equals("break")) { p.setfont(regularfont, fontsize); p.fit_textline("-- Continued --", urx, ycontinued, "position {right top}"); p.end_page_ext(""); p.begin_page_ext(pagewidth, pageheight, ""); } } while (result.equals("_boxfull") || result.equals("break")); p.end_page_ext(""); p.end_document(""); } catch (PDFlibException e) { System.err.println("PDFlib exception occurred:"); System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() + ": " + e.get_errmsg()); exitcode = 1; } catch (Exception e) { System.err.println(e.toString()); exitcode = 1; } finally { if (p != null) { p.delete(); } System.exit(exitcode); } } }