/* * Tiling pattern: * Define a tiling pattern containing an image and use it to cover the page * background with tiles. * * Required software: PDFlib/PDFlib+PDI/PPS 9.0.2 * Required data: image file */ package com.pdflib.cookbook.pdflib.images; import com.pdflib.pdflib; import com.pdflib.PDFlibException; public class tiling_pattern { public static void main(String argv[]) { /* This is where the data files are. Adjust as necessary. */ String searchpath = "../input"; String outfile = "tiling_pattern.pdf"; String title = "Tiling Pattern"; pdflib p = null; int exitcode = 0; String imagefile = "background_image.png"; int font, image, pattern; int pagewidth = 595, pageheight = 842; double imagewidth, imageheight, resx, resy; 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); /* Load the background image */ image = p.load_image("auto", imagefile, ""); if (image == -1) throw new Exception("Error: " + p.get_errmsg()); /* Retrieve the image dimensions */ imagewidth = p.info_image(image, "imagewidth", ""); imageheight = p.info_image(image, "imageheight", ""); /* * The image may have a resolution above 72 dpi. If we used the * returned dimensions (in points) for the pattern height and width * and placed our image into the pattern, it wouldn't match the * pattern size, and a white margin would be left. To make the * pattern the same size as the image we calculate the image size * based on its resolution. * * Retrieve the original image resolution: */ resx = p.info_image(image, "resx", ""); resy = p.info_image(image, "resy", ""); /* Calculate the image dimensions for 72 dpi */ if (resx > 0) { imagewidth = imagewidth * 72 / resx; imageheight = imageheight * 72 / resy; } /* * Create a pattern using the retrieved image dimensions. The * painttype parameter must be set to 1 since a colorized image is * used (as opposed to an image mask). */ pattern = p.begin_pattern_ext(imagewidth, imageheight, ""); p.fit_image(image, 0, 0, ""); p.end_pattern(); p.close_image(image); /* Start page */ p.begin_page_ext(pagewidth, pageheight, ""); /* * Set a fill color and create and fill a rectangle with the * dimensions of the page. Encapsulate the setcolor() call with * save() and restore() to be able to proceed with the original * colors. */ p.save(); p.setcolor("fill", "pattern", pattern, 0, 0, 0); p.rect(0, 0, pagewidth, pageheight); p.fill(); p.restore(); /* Output some page contents */ font = p.load_font("Helvetica-Bold", "unicode", ""); if (font == -1) throw new Exception("Error: " + p.get_errmsg()); int fontsize = 14; p.set_text_option("font=" + font + " fontsize=" + fontsize); p.fit_textline( "The page background consists of a small image pattern", 20, 700, ""); p.fit_textline( "which will be output on the page repeatedly.", 20, 700 - fontsize, ""); p.end_page_ext(""); 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); } } }