PDFlib Cookbook

cookbook

table/table_contact_sheet

Download Java Code        Switch to PHP Code      Show Output PDF

/* $Id: table_contact_sheet.java,v 1.4 2013/01/15 10:12:07 stm Exp $
 * 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 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 + " $Revision: 1.4 $");

        /* 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.print("PDFlib exception occurred:\n");
            System.err.print("[" + e.get_errnum() + "] " + e.get_apiname() +
                ": " + e.get_errmsg() + "\n");
        } catch (Exception e) {
            System.err.println(e.toString());
        } finally {
            if (p != null) {
                p.delete();
            }
        }
    }
}