PDFlib Cookbook

cookbook

path_objects/starter_path

Starter sample for path objects: create basic examples of path object construction and use.

Download Java Code  Switch to PHP Code  Show Output 

/*
 * Starter sample for path objects:
 * Create some basic examples of path object construction and use
 *
 * Required software: PDFlib/PDFlib+PDI/PPS 10
 * Required data: none
 */
package com.pdflib.cookbook.pdflib.path_objects;

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

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

            /* This is where the data files are. Adjust as necessary. */
            final String searchpath = "../input";

            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. ";

            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", "starter_path");

            /* 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=NotoSerif-Regular 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=NotoSerif-Regular fontsize=10 alignment=justify");
            /* Use text twice to fill the arrow */
            tf = p.add_textflow(tf, text,
                "fontname=NotoSerif-Regular fontsize=10 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.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);
        }
    }
}