blocks/nested_blocks
Create nested Blocks.
Download Java Code Switch to PHP Code Show Output Show Input (A3_imposition_2x2.pdf) Show Input (businesscard_blocks.pdf)
/*
* Nested_blocks:
* Nested Block processing is used to implement both imposition and
* personalization with Blocks:
*
* - The first-level Block container page contains several large PDF Blocks
* which indicate the major areas on the paper to be printed on. The
* arrangement of PDF Blocks reflects the intended postprocessing of the
* paper (e.g. folding).
* - Each of the first-level PDF Blocks is then filled with a second-level
* container PDF page which contains Text, Image, or PDF Blocks to be filled
* with variable text for personalization.
*
* Required software: PPS 10
* Required data:
* - first-level Block container with PDF Blocks named "Block_<nr>"
* - second-level Block container with arbitrary Blocks
* - variable data for filling second-level Blocks (provided in an inline array)
*/
package com.pdflib.cookbook.pdflib.blocks;
import com.pdflib.pdflib;
import com.pdflib.PDFlibException;
public class nested_blocks {
public static void main(String argv[]) {
/* This is where the data files are. Adjust as necessary. */
String searchpath = "../input";
/* By default annotations are also imported. In some cases this
* requires the Noto fonts for creating annotation appearance streams.
* We therefore set the searchpath to also point to the font directory.
*/
String fontpath = "../resource/font";
String outfile = "nested_blocks.pdf";
String title = "Nested Blocks";
pdflib p = null;
String infilename1 = "A3_imposition_2x2.pdf";
String infilename2 = "businesscard_blocks.pdf";
int record, block, inpage1, inpage2, indoc1, indoc2;
int exitcode = 0;
int pagespersheet; // number of imposed pages per sheet
/* Names of the blocks contained in the imported page */
String blocknames[] = { "name", "business_title",
"business_address_line1", "business_address_city",
"business_telephone_voice", "business_telephone_fax",
"business_email", "business_homepage" };
int nblocks = blocknames.length; // number of blocks to be filled
/* Data related to various persons used for personalization */
String persons[][] = {
{ "Victor Kraxi", "Chief Paper Officer", "17, Aviation Road",
"Paperfield", "7079-4301", "7079-4391", "victor@kraxi.com",
"www.kraxi.com" },
{ "Paula Kraxi", "Chief Paper Pilot", "17, Aviation Road",
"Paperfield", "7079-4302", "7079-4392", "paula@kraxi.com",
"www.kraxi.com" },
{ "Serge Kraxi", "Chief Paper Folder", "17, Aviation Road",
"Paperfield", "7079-4303", "7079-4393", "serge@kraxi.com",
"www.kraxi.com" },
{ "Lena Kraxi", "Chief Financial Officer", "17, Aviation Road",
"Paperfield", "7079-4304", "7079-4394", "lena@kraxi.com",
"www.kraxi.com" },
{ "Dana Kraxi", "Auxiliary Paper Folder", "17, Aviation Road",
"Paperfield", "7079-4305", "7079-4395", "dana@kraxi.com",
"www.kraxi.com" },
{ "Anna Kraxi", "Accounting Assistant", "17, Aviation Road",
"Paperfield", "7079-4306", "7079-4396", "anna@kraxi.com",
"www.kraxi.com" } };
int recordcount = persons.length; // number of personalization records
try {
p = new pdflib();
p.set_option("searchpath={" + searchpath + "}");
p.set_option("searchpath={" + fontpath + "}");
/* 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_apiname() + ": "
+ p.get_errmsg());
p.set_info("Creator", "PDFlib Cookbook");
p.set_info("Title", title);
/* Open the first-level Block container with imposition Blocks */
indoc1 = p.open_pdi_document(infilename1, "");
if (indoc1 == -1)
throw new Exception("Error: " + p.get_apiname() + ": "
+ p.get_errmsg());
/* Open the first page and prepare the page boxes for cloning */
inpage1 = p.open_pdi_page(indoc1, 1, "cloneboxes");
if (inpage1 == -1)
throw new Exception("Error: " + p.get_apiname() + ": "
+ p.get_errmsg());
/* Query the number of Blocks to keep the code flexible */
pagespersheet = (int) p.pcos_get_number(indoc1,
"length:pages[0]/blocks");
/*
* Open the second-level Block container with personalization Blocks
*/
indoc2 = p.open_pdi_document(infilename2, "");
if (indoc1 == -1)
throw new Exception("Error: " + p.get_apiname() + ": "
+ p.get_errmsg());
/* Open the first page */
inpage2 = p.open_pdi_page(indoc2, 1, "");
if (inpage2 == -1)
throw new Exception("Error: " + p.get_apiname() + ": "
+ p.get_errmsg());
for (record = 0; record < recordcount; record++) {
/* Start a new output page if required */
if (record % pagespersheet == 0) {
/* The page size will be adjusted with "cloneboxes" */
p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
/*
* Place the first-level Block container page on the output
* page
*/
p.fit_pdi_page(inpage1, 0, 0, "cloneboxes");
}
/*
* Imposition: fill first-level PDF Blocks with second-level
* container page
*/
if (p.fill_pdfblock(inpage1, "Block_" + record % pagespersheet,
inpage2, "fitmethod=meet") == -1) {
System.err.println("Warning: " + p.get_errmsg());
continue;
}
/*
* Personalization: fill second-level Blocks with variable data
*/
for (block = 0; block < nblocks; block++) {
if (p.fill_textblock(inpage2, blocknames[block],
persons[record][block], "") == -1) {
System.err.println("Warning: " + p.get_errmsg());
}
}
/*
* Finish the page if no more space, or no more records
* available
*/
if (record % pagespersheet == pagespersheet - 1
|| record == recordcount - 1) {
p.end_page_ext("");
}
}
p.close_pdi_page(inpage1);
p.close_pdi_page(inpage2);
p.end_document("");
p.close_pdi_document(indoc1);
p.close_pdi_document(indoc2);
}
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);
exitcode = 1;
}
finally {
if (p != null) {
p.delete();
}
System.exit(exitcode);
}
}
}