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);
}
}
}