PDFlib Cookbook

cookbook

graphics/starter_path

Download Java Code      Switch to PHP Code      Show Output PDF

/*
 * $Id: starter_path.java,v 1.3 2013/01/15 10:11:59 stm Exp $
 *
 * Starter sample for path objects:
 * Create some basic examples of path object construction and use
 *
 * Required software: PDFlib/PDFlib+PDI/PPS 9
 * Required data: none
 */
package com.pdflib.cookbook.pdflib.graphics;

import com.pdflib.pdflib;
import com.pdflib.PDFlibException;

class starter_path {
    public static void main(String argv[]) {
        final String outfile = "starter_path.pdf";
        
        pdflib p = null;
        
        try {
            p = new pdflib();
            int path, tf, n;
            String result;
            double x, y;
            String optlist;

            final String text =
    "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " +
    "sed do eiusmod tempor incididunt ut labore et dolore magna " +
    "aliqua. Ut enim ad minim veniam, quis nostrud exercitation " +
    "ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
    "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum " +
    "dolore eu fugiat nulla pariatur. Excepteur sint occaecat " +
    "cupidatat non proident, sunt in culpa qui officia deserunt mollit anim " +
    "id est laborum. ";

            /* 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", "starter_path $Revision: 1.3 $");

            /* Start an A4 page */
            p.begin_page_ext(0, 0, "width=a4.width height=a4.height");

            /* Construct a path object for an arrow shape */
            path = -1;

            /* The tip of the arrow gets rounded corners */
            path = p.add_path_point(path, 200.0,  25.0, "move", "round=10");
            path = p.add_path_point(path, 200.0,  75.0, "line", "");
            /* assign a name to the arrow's tip */
            path = p.add_path_point(path, 300.0,   0.0, "line", "name=tip");
            path = p.add_path_point(path, 200.0, -75.0, "line", "");
            path = p.add_path_point(path, 200.0, -25.0, "line", "");

            /* Start a new subpath for the straight base of the arrow */
            path = p.add_path_point(path, 200.0, -25.0, "move", "");
            path = p.add_path_point(path,   0.0, -25.0, "line", "");

            /* The center of the base can serve as a named attachment point */
            path = p.add_path_point(path,   0.0,   0.0, "line", "name=base");
            path = p.add_path_point(path,   0.0,  25.0, "line", "");
            path = p.add_path_point(path, 200.0,  25.0, "line", "");

            x = 100.0;
            y = 850.0;

            /* ----------------------------------------
             * Place arrow in its original direction
             * ----------------------------------------
             */
            y -= 100.0;
            p.draw_path(path, x, y,
                "stroke linewidth=3 fill fillcolor=Turquoise "
                + "linecap=projecting attachmentpoint=base ");

            /* ----------------------------------------
             * Scale down arrow and align it to north east
             * ----------------------------------------
             */
            y -= 200.0;
            p.draw_path(path, x, y,
                "stroke linewidth=3 fill fillcolor=Turquoise "
                + "linecap=projecting attachmentpoint=base scale=0.5 "
                + "align={1 1}");

            /* ----------------------------------------
             * Scale to 50%, use the arrow tip as attachment point,
             * and align the arrow to the left
             * ----------------------------------------
             */
            y -= 100.0;
            p.draw_path(path, x, y,
                "stroke linewidth=3 fill fillcolor=Turquoise "
                + "linecap=projecting attachmentpoint=tip "
        		+ "scale=0.5 align={-1 0}");

            /* ----------------------------------------
             * Place text on the path; round all corners to
             * allow smoother text at the corners
             * ----------------------------------------
             */
            y -= 100.0;

            optlist = "textpath={path=" + path + " round=10} "
                    + "position={center bottom} "
                    + "fontname=Helvetica encoding=winansi fontsize=8";
            p.fit_textline(text, x, y, optlist);

            /* ----------------------------------------
             * Use the path as clipping path for a Textflow
             * ----------------------------------------
            */
            y -= 300.0;

            /* Feed the text to the Textflow object */
            tf = p.add_textflow(-1, text,
                "fontname=Helvetica fontsize=10 encoding=winansi "
                + "alignment=justify");
            /* Use text twice to fill the arrow */
            tf = p.add_textflow(tf, text,
                "fontname=Helvetica fontsize=10 encoding=winansi "
                + "alignment=justify");
            if (tf == -1) {
                throw new Exception("Error: " + p.get_errmsg());
            }

            /* Attach the path's reference point to the middle left (0%, 50%)
             * of the fitbox, and wrap the text inside the path (inversefill)
             */
            optlist = "wrap={inversefill paths={{path=" + path
                    + " refpoint={0% 50%} scale=1.5 }}}";
            result = p.fit_textflow(tf, x, y, x+450, y+225, optlist);

            if (result.equals("_stop"))
            {
                /* In this example we don't care about overflow text */
            }
            p.delete_textflow(tf);

            /* ----------------------------------------
             * Query information about the path object
             * ----------------------------------------
            */
            n = (int) p.info_path(path, "numpoints", "");
            System.out.println("Number of points in path: " + n);
            
            p.delete_path(path);
            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();
            }
        }
    }
}