BASKET
Search
PDFlib

pdf_import/pdfimpose

Download Java Code        Switch to PHP Code     Show Output PDF

/* $Id: pdfimpose.java,v 1.6 2013/01/15 10:12:02 stm Exp $

 * PDF impose:

 * Import all pages from one more existing PDFs, and place c x r pages on each

 * sheet of the output PDF (imposition).

 *

 * Required software: PDFlib+PDI/PPS 9

 * Required data: PDF documents

 */

package com.pdflib.cookbook.pdflib.pdf_import;


import com.pdflib.pdflib;

import com.pdflib.PDFlibException;


public class pdfimpose

{

    public static void main (String argv[])

    {

    /* This is where the data files are. Adjust as necessary. */

    String searchpath = "../input";

    String outfile = "pdfimpose.pdf";

    String title = "PDF Impose";


    pdflib p = null;

    String pdffiles[] =

    {

        "PDFlib-real-world.pdf",

        "PDFlib-datasheet.pdf",

        "TET-datasheet.pdf",

        "PLOP-datasheet.pdf",

        "pCOS-datasheet.pdf"

    };

    int i, c = 0, r = 0;

    String optlist;

    double scale = 1;          // scaling factor of a page

    double rowheight = 0;      // row height for the page to be placed

    double colwidth = 0;       // column width for the page to be placed

    double sheetwidth = 595;   // width of the sheet

    double sheetheight = 842// height of the sheet

    int cols = 3, rows = 4;    // cols x rows pages will be placed on one sheet


    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.6 $");

       

        /* ---------------------------------------------------------------------

         * Define the sheet width and height, and the number of rows and columns

         * and calculate the scaling factor and cell dimensions for the

         * multi-page imposition

         * ---------------------------------------------------------------------

         */

        if (rows > cols)

            scale = 1.0 / rows;

        else

            scale = 1.0 / cols;


        rowheight = sheetheight * scale;

        colwidth = sheetwidth * scale;


        boolean pageopen = false; // is a page open that must still be closed?

       

        /* Loop over all input documents */

        for (i=0; i < pdffiles.length; i++) {

            int indoc, endpage, pageno, page;


            /* Open the input PDF */

            indoc = p.open_pdi_document(pdffiles[i], "");

            if (indoc == -1){

                System.err.println("Error: " + p.get_errmsg());

                continue;

            }

   

            endpage = (int) p.pcos_get_number(indoc, "length:pages");

           

            /* Loop over all pages of the input document */

            for (pageno = 1; pageno <= endpage; pageno++) {

                page = p.open_pdi_page(indoc, pageno, "");


                if (page == -1) {

                    System.err.println("Error: " + p.get_errmsg());

                    continue;

                }

               

                /* Start a new page */

                if (r == 0 && c == 0) {

                    p.begin_page_ext(sheetwidth, sheetheight, "");

                    pageopen = true;

                }

               

                /* The save/restore pair is required to get the clipping

                 * right, and helps PostScript printing manage its memory

                 * efficiently.

                 */

                p.save();

                p.rect(c * colwidth, sheetheight - (r + 1) * rowheight,

                    colwidth, rowheight);

                p.clip();


                optlist = "boxsize {" + colwidth + " " + rowheight + "}" +

                    " position 0 fitmethod meet";

                   

                p.fit_pdi_page(page, c * colwidth,

                    sheetheight - (r + 1) * rowheight, optlist);


                p.close_pdi_page(page);

               

                /* Draw a frame around the mini page */

                p.setlinewidth(scale);

                p.rect(c * colwidth, sheetheight - (r + 1) * rowheight,

                    colwidth, rowheight);

                p.stroke();

               

                p.restore();


                c++;

                if (c == cols) {

                    c = 0;

                    r++;

                }

                if (r == rows) {

                    r = 0;

                    p.end_page_ext("");

                    pageopen = false;

                }

            }

            p.close_pdi_document(indoc);

        }

       

        if (pageopen) {

            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.getMessage());

        } finally {

            if (p != null) {

                p.delete();

            }

        }

    }

}