/* * Table contact sheet: * Create a contact sheet with photos and their labels * * Create a table and place a number of photos in it. For each photo, an image * is placed in one cell, and a text label is placed in the cell below. * * 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_contact_sheet { public static void main (String argv[]) { /* This is where the data files are. Adjust as necessary. */ String searchpath = "../input"; String outfile = "table_contact_sheet.pdf"; String title = "Table Contact Sheet"; pdflib p = null; int exitcode = 0; int i, j, row, col, tbl=-1, image=-1, regularfont, boldfont; final double fontsize = 12; String result; final double pagewidth = 842, pageheight = 595; /* table coordinates */ final int llx = 50, urx = (int) pagewidth - llx; final int lly = 80, ury = (int) pageheight - lly; final int yheading = ury + 2 * 15; /* fixed number of table columns, variable number of rows */ final int nocols = 5; /* column width for all columns */ final int cw = 100; /* row height for image rows and text rows */ final double img_rowheight = 100; final double txt_rowheight = 30; /* margins for image and text cells */ final int img_margin = 6, txt_margin = 6; final String imagefiles [] = { "cambodia_angkor_thom.jpg", "cambodia_angkorwat1.jpg", "cambodia_angkorwat2.jpg", "cambodia_banteay_samre.jpg", "cambodia_bayon1.jpg", "cambodia_bayon2.jpg", "cambodia_bayon3.jpg", "cambodia_neak_pean.jpg", "cambodia_preah_khan1.jpg", "cambodia_preah_khan2.jpg", "cambodia_preah_khan3.jpg", "cambodia_preah_khan4.jpg", "cambodia_pre_rup1.jpg", "cambodia_pre_rup2.jpg", "cambodia_woman.jpg", "cambodia_bayon1.jpg", "cambodia_bayon2.jpg", "cambodia_bayon3.jpg", "cambodia_neak_pean.jpg", "cambodia_preah_khan1.jpg", "cambodia_preah_khan2.jpg", "cambodia_preah_khan3.jpg", "cambodia_preah_khan4.jpg", "cambodia_pre_rup1.jpg", "cambodia_pre_rup2.jpg", "cambodia_woman.jpg", "cambodia_angkorwat2.jpg", "cambodia_banteay_samre.jpg", "cambodia_bayon1.jpg", "cambodia_bayon2.jpg", "cambodia_bayon3.jpg", "cambodia_neak_pean.jpg", "cambodia_preah_khan1.jpg", "cambodia_preah_khan2.jpg", "cambodia_preah_khan3.jpg", "cambodia_preah_khan4.jpg", "cambodia_pre_rup1.jpg" }; 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, ""); /* Output the heading */ p.setfont(boldfont, fontsize); p.fit_textline("Contact Sheets", llx, yheading, ""); /* ------------------------------------------------------------------ * For each photo add a cell containing an image and a text line with * the image file name * ------------------------------------------------------------------ */ /* Loop over all photos */ col = 1; row = 1; for (i = 0; i < imagefiles.length; i++) { image = -1; /* Load the photo */ image = p.load_image("auto", imagefiles[i], ""); if (image == -1) throw new Exception("Error: " + p.get_errmsg()); /* Add the cell containing the image. * * "fitmethod=auto" scales the image so that it entirely fits into * the cell while preserving its aspect ratio. * "rowjoingroup" keeps image and text together on the same page. */ String img_opts = " image=" + image + " fitimage={fitmethod=auto}" + " colwidth=" + cw + " rowheight=" + img_rowheight + " margin=" + img_margin + " rowjoingroup=group" + i; tbl = p.add_table_cell(tbl, col, row, "", img_opts); if (tbl == -1) throw new Exception("Error adding cell: " + p.get_errmsg()); /* Add the cell containing the text with the image file name. * * "fitmethod=auto" scales the text so that it entirely fits into * the cell. Note that if this option is not used the cell width * will be increased until the text fits completely into the cell. * "rowjoingroup" keeps image and text together on the same page. */ String txt_opts = "fittextline={font=" + regularfont + " fitmethod=auto" + " fontsize=9 fillcolor={gray 1} position={center}}" + " colwidth=" + cw + " rowheight=" + txt_rowheight + " margin=" + txt_margin + " rowjoingroup=group" + i; tbl = p.add_table_cell(tbl, col, row + 1, imagefiles[i], txt_opts); if (tbl == -1) throw new Exception("Error adding cell: " + p.get_errmsg()); if (col < nocols) { col++; } else { col = 1; row += 2; } } /* for */ /* ------------------------------------ * Place the table on one or more pages * ------------------------------------ */ /* Prepare the option list for fitting the table. * The "stroke" option will stroke every vertical line and every * second horizontal line in white with a line width of 0.3. * The "fill" option fills the complete table with a dark gray. */ String stroke_opts = "stroke={{line=vertother strokecolor={gray 1} linewidth=0.3}"; for (i = 0, j = 2; i < imagefiles.length; i += nocols, j+=2) { stroke_opts += " {line=hor" + j + " strokecolor={gray 1} linewidth=0.3}"; } stroke_opts += "} "; String fill_opts = "fill={{area=table fillcolor={rgb 0.1 0.1 0.1}}}"; String fittab_opts = stroke_opts + fill_opts; /* 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") || result.equals("_boxempty")) throw new Exception ("Couldn't place table: " + p.get_errmsg()); /* Start a new page */ if (result.equals("_boxfull")) { 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); } } }