PDFlib ブロックを含む PDF ページをインポートし、すべてのブロックに処理を行います。PDFlib ブロックは pCOS 経由で取得され、ブロック配置関数は出力ページ上にブロックを視覚できるようにします。実用例としては、ブロックに外部のデータソースから取得したデータを配置するような場合が考えられます。
/*
* Block starter:
* Import a PDF page containing blocks and fill text and image
* blocks with some data. For each addressee of the simulated
* mailing a separate page with personalized information is
* generated.
* A real-world application would fill the Blocks with data from
* some external data source. We simulate this with static data.
*
* Required software: PPS 9
* Required data: input PDF, image
*/
package com.pdflib.cookbook.pdflib.blocks;
import com.pdflib.pdflib;
import com.pdflib.PDFlibException;
public class starter_block {
public static void main(String argv[]) {
/* This is where the data files are. Adjust as necessary. */
String searchpath = "../input";
String outfile = "starter_block.pdf";
String infile = "block_template.pdf";
String imagefile = "new.jpg";
pdflib p = null;
int i, j, no_of_input_pages, pageno, indoc, image;
String optlist, objtype;
int exitcode = 0;
/* Names of the recipient-specific Blocks contained on the imported page */
String addressblocks[] = { "name", "street", "city" };
/* Personalization data for the recipients */
String recipients[][] = {
{ "Mr Maurizio Moroni", "Strada Provinciale 124", "Reggio Emilia" },
{ "Ms Dominique Perrier", "25, rue Lauriston", "Paris" },
{ "Mr Liu Wong", "55 Grizzly Peak Rd.", "Butte" } };
/* Static text simulates database-driven main contents */
String blockdata[][] = {
{"intro", "Dear Paper Planes Fan,"},
{"announcement",
"Our BEST PRICE OFFER includes today:"
+ "\n\n"
+ "Long Distance Glider\nWith this paper rocket you can send all your "
+ "messages even when sitting in a hall or in the cinema pretty near "
+ "the back.\n\n"
+ "Giant Wing\nAn unbelievable sailplane! It is amazingly robust and "
+ "can even do aerobatics. But it is best suited to gliding.\n\n"
+ "Cone Head Rocket\nThis paper arrow can be thrown with big swing. "
+ "We launched it from the roof of a hotel. It stayed in the air a "
+ "long time and covered a considerable distance.\n\n"
+ "Super Dart\nThe super dart can fly giant loops with a radius of 4 "
+ "or 5 meters and cover very long distances. Its heavy cone point is "
+ "slightly bowed upwards to get the lift required for loops.\n\n"
+ "Visit us on our Web site at www.kraxi.com!"},
{"goodbye", "Yours sincerely,\nVictor Kraxi"} };
try {
p = new pdflib();
/*
* This means we must check return values of load_font() etc.
* Set the search path for fonts and images etc.
*/
p.set_option("errorpolicy=return SearchPath={{" + searchpath + "}}");
if (p.begin_document(outfile,
"destination={type=fitwindow} pagelayout=singlepage") == -1) {
throw new Exception("Error: " + p.get_errmsg());
}
p.set_info("Creator", "PDFlib starter sample");
p.set_info("Title", "starter_block");
/* Open the Block template which contains PDFlib Blocks */
indoc = p.open_pdi_document(infile, "");
if (indoc == -1) {
throw new Exception("Error: " + p.get_errmsg());
}
no_of_input_pages = (int) p.pcos_get_number(indoc, "length:pages");
/* Prepare all pages of the input document. We assume a small
* number of input pages and a large number of generated output
* pages. Therefore it makes sense to keep the input pages
* open instead of opening the pages again for each recipient.
*/
int[] pagehandles = new int[no_of_input_pages+1];
for (pageno = 1; pageno <= no_of_input_pages; pageno++){
/* Open the first page and clone the page size */
pagehandles[pageno] = p.open_pdi_page(indoc, pageno, "cloneboxes");
if (pagehandles[pageno] == -1) {
throw new Exception("Error: " + p.get_errmsg());
}
}
image = p.load_image("auto", imagefile, "");
if (image == -1) {
throw new Exception("Error: " + p.get_errmsg());
}
/* Duplicate input pages for each recipient and fill Blocks */
/*
* Based on the imported page generate several pages with the blocks
* being filled with data related to different persons
*/
for (i = 0; i < recipients.length; i++) {
/* Loop over all pages of the input document */
for (pageno = 1; pageno <= no_of_input_pages; pageno++){
/* Start the next output page. The page size will be
* replaced with the cloned size of the input page.
*/
p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
/*
* Place the imported page on the output page, and clone all
* page boxes which are present in the input page; this will
* override the dummy size used in begin_page_ext().
*/
p.fit_pdi_page(pagehandles[pageno], 0, 0, "cloneboxes");
/* Option list for text blocks */
optlist = "encoding=winansi embedding";
/* Loop over all recipient-specific Blocks. Fill each
* Block with the corresponding person's address data.
*/
for (j = 0; j < addressblocks.length; j++) {
/* Check whether the Block is present on the imported page;
* type "dictionary" means that the Block is present.
*/
objtype = p.pcos_get_string(indoc,
"type:pages[" + (pageno-1) + "]/blocks/" + addressblocks[j]);
if (objtype.equals("dict")){
if (p.fill_textblock(pagehandles[pageno], addressblocks[j],
recipients[i][j], optlist) == -1)
System.err.println("Warning: " + p.get_errmsg());
}
}
/* Loop over the remaining text Blocks. These are filled with
* the same data for each recipient.
*/
for (j = 0; j < blockdata.length; j++) {
/* Check whether the Block is present on the page */
objtype = p.pcos_get_string(indoc,
"type:pages[" + (pageno-1) + "]/blocks/" + blockdata[j][0]);
if (objtype.equals("dict")){
if (p.fill_textblock(pagehandles[pageno], blockdata[j][0],
blockdata[j][1], optlist) == -1)
System.err.println("Warning: " + p.get_errmsg());
}
}
/* Fill the icon Block if it is present on the imported page */
objtype = p.pcos_get_string(indoc,
"type:pages[" + (pageno-1) + "]/blocks/icon");
if (objtype.equals("dict")){
if (p.fill_imageblock(pagehandles[pageno], "icon", image, "") == -1)
System.err.println("Warning: " + p.get_errmsg());
p.end_page_ext("");
}
}
}
/* Close all input pages */
for (pageno = 1; pageno <= no_of_input_pages; pageno++){
p.close_pdi_page(pagehandles[pageno]);
}
p.close_pdi_document(indoc);
p.close_image(image);
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);
exitcode = 1;
}
finally {
if (p != null) {
p.delete();
}
System.exit(exitcode);
}
}
}