blocks/nested_blocks
Create nested Blocks.
Download PHP Code Switch to Java Code Show Output Show Input (A3_imposition_2x2.pdf) Show Input (businesscard_blocks.pdf)
<?php
/*
* 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)
*/
/* This is where the data files are. Adjust as necessary. */
$searchpath = dirname(__FILE__,3)."/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.
*/
$fontpath = dirname(__FILE__,3)."/resource/font";
$outfile = "";
$title = "Nested Blocks";
$infilename1 = "A3_imposition_2x2.pdf";
$infilename2 = "businesscard_blocks.pdf";
/* Names of the blocks contained in the imported page */
$blocknames = array( "name", "business_title",
"business_address_line1", "business_address_city",
"business_telephone_voice", "business_telephone_fax",
"business_email", "business_homepage" );
$nblocks = count($blocknames); // number of blocks to be filled
/* Data related to various persons used for personalization */
$persons = array(
array( "Victor Kraxi", "Chief Paper Officer", "17, Aviation Road",
"Paperfield", "7079-4301", "7079-4391", "victor@kraxi.com",
"www.kraxi.com" ),
array( "Paula Kraxi", "Chief Paper Pilot", "17, Aviation Road",
"Paperfield", "7079-4302", "7079-4392", "paula@kraxi.com",
"www.kraxi.com" ),
array( "Serge Kraxi", "Chief Paper Folder", "17, Aviation Road",
"Paperfield", "7079-4303", "7079-4393", "serge@kraxi.com",
"www.kraxi.com" ),
array( "Lena Kraxi", "Chief Financial Officer", "17, Aviation Road",
"Paperfield", "7079-4304", "7079-4394", "lena@kraxi.com",
"www.kraxi.com" ),
array( "Dana Kraxi", "Auxiliary Paper Folder", "17, Aviation Road",
"Paperfield", "7079-4305", "7079-4395", "dana@kraxi.com",
"www.kraxi.com" ),
array( "Anna Kraxi", "Accounting Assistant", "17, Aviation Road",
"Paperfield", "7079-4306", "7079-4396", "anna@kraxi.com",
"www.kraxi.com" ) );
$recordcount = count($persons); // 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, "") == 0)
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 == 0)
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 == 0)
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 == 0)
throw new Exception("Error: " . $p->get_apiname() . ": "
. $p->get_errmsg());
/* Open the first page */
$inpage2 = $p->open_pdi_page($indoc2, 1, "");
if ($inpage2 == 0)
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) {
/* Page size may 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") == 0) {
print("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], "") == 0) {
print("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);
$buf = $p->get_buffer();
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=nested_blocks.pdf");
print $buf;
}
catch (PDFlibException $e) {
echo("PDFlib exception occurred in nested_blocks sample:\n" .
"[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
$e->get_errmsg() . "\n");
exit(1);
}
catch (Throwable $e) {
echo($e);
exit(1);
}
$p = 0;
?>