PDFlib Cookbook

cookbook

graphics/fill_pattern

Download Java Code     Switch to PHP Code        Show Output PDF

/*
 * $Id: fill_pattern.java,v 1.14 2016/10/26 09:47:40 tm Exp $
 *
 * Fill pattern:
 * Define some hatching patterns and use them to fill arbitrary shapes.
 * 
 * Create a green pattern with a hatching of rising lines and fill a rectangle
 * with it. Create pattern with a hatching of falling lines and fill a
 * rectangle with it using the colors currently being set. Create a colored pie
 * chart using the two hatchings and various stroke colors. Create a more
 * complex hatching pattern and fill a circle with it.
 * 
 * Required software: PDFlib/PDFlib+PDI/PPS 9.0.2
 * Required data: none
 */
package com.pdflib.cookbook.pdflib.graphics;

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

public class fill_pattern
{
    public static void main (String argv[])
    {
	/* This is where the data files are. Adjust if necessary. */
	String searchpath = "../input";
	String outfile = "fill_pattern.pdf";
	String title = "Fill Pattern";

	pdflib p = null;
	
	double w, h;
	int pattern1, pattern2, pattern3;
	int exitcode = 0;

	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 + " $Revision: 1.14 $");

	    
	    /* -----------------------------------------------------------------
	     * Define Pattern I, a green pattern with a hatching of rising lines
	     * -----------------------------------------------------------------
	     * 
	     * Define a pattern with a width of w and a height of h. When
	     * repeatedly placing the pattern an x-offset of w and an y-offset
	     * of h is used. The stroke color is defined within the pattern
	     * (painttype=colored, which is default).
	     */
	    w = 10;
	    h = 10;
	    
	    pattern1 = p.begin_pattern_ext(w, h, "");

	    /* Set the stroke color for the pattern to green.
	     * Draw three lines with an angle of sin(h/w). For a smooth transition
	     * from one line segment to the adjacent when output the pattern 
	     * repeatedly: First, set the line cap to beyond the line end. Second, 
	     * stroke not one but three line elements with a distance of w between
	     * each other (while having a pattern's x-offset of w).
	     */
	    p.setlinewidth(w / 20);
	    p.set_graphics_option("linecap=2");
	    p.setcolor("stroke", "rgb", 0.0, 0.5, 0.5, 0);
	    
	    p.moveto(0, 0);
	    p.lineto(w, h);
	    
	    p.moveto(w, 0);
	    p.lineto(2*w, h);
	    
	    p.moveto(-w, 0);
	    p.lineto(0, h);
	    
	    p.stroke();

	    p.end_pattern();
	    
	    
	    /* --------------------------------------------------
	     * Define Pattern II with a hatching of falling lines
	     * --------------------------------------------------
	     * 
	     * Define a pattern with a width of w and a height of h. When
	     * repeatedly placing the pattern an x-offset of w and an y-offset
	     * of h is used. The pattern will have no color on its own but will
	     * be colorized later by the fill color which is set at the time the 
	     * pattern will be used (painttype=uncolored).
	     */
	    w = 10;
	    h = 10;
	    
	    pattern2 = p.begin_pattern_ext(w, h, "painttype=uncolored");
	    
	    /* Draw three lines with an angle of -sin(h/w). For a smooth transition
	     * from one line segment to the adjacent when output the pattern 
	     * repeatedly: First, set the line cap to beyond the line end. Second, 
	     * stroke not one but three line elements with a distance of w between
	     * each other (while having a pattern's x-offset of w).
	     */
	    
	    /* Set the stroke line width for the pattern */
	    p.setlinewidth(w / 20);
	    
	    /* Set the line cap beyond the line ends */
	    p.set_graphics_option("linecap=2");
	    
	    /* Define and stroke the path for the pattern */
	    p.moveto(0, h);
	    p.lineto(w, 0);
	    
	    p.moveto(w, h);
	    p.lineto(2*w, 0);
	    
	    p.moveto(-w, h);
	    p.lineto(0, 0);
	    
	    p.stroke();

	    p.end_pattern();
	    
	    
	    /* ---------------------------------------------------------------
	     * Define Pattern III, a more complex light green hatching pattern
	     * ---------------------------------------------------------------
	     * 
	     * The stroke color is defined within the pattern (painttype=colored,
	     * which is default) as a shade of green.
	     */
	    w = 5;
	    h = 10;
	    
	    pattern3 = p.begin_pattern_ext(w, h, "");

	    /* Define a custom color for the pattern */
	    p.setcolor("stroke", "rgb", 0.4, 0.5, 0.2, 0);
	    p.setlinewidth(w / 10);
	    
	    /* Set the line cap beyond the line end */
	    p.set_graphics_option("linecap=2");
	    
	    /* Define and stroke the path for the pattern to be used */
	    p.moveto(0, 0);
	    p.lineto(w, h / 2);
	    p.lineto(0, h);
	    p.stroke();

	    p.moveto(0, h / 2);
	    p.lineto(w / 2, h / 4);
	    p.stroke();

	    p.moveto(w, h);
	    p.lineto(w / 2, 3 * h / 4);
	    p.stroke();

	    p.end_pattern();
	    
	    p.begin_page_ext(500, 500, "");
	    
	    
	    /* ------------------------------
	     * Output graphics with pattern I
	     * ------------------------------
	     * 
	     * Set the stroke color to black.
	     * Set the green pattern I as the fill color.
	     */
	    p.setcolor("stroke", "gray", 0.0, 0.0, 0.0, 0);
	    p.setcolor("fill", "pattern", pattern1, 0, 0, 0);
	    
	    /* Draw a rectangle with the current fill color, i.e. filled with 
	     * pattern I repeatedly applied. The rectangle will have a border
	     * colored with the current stroke color which as been set to black 
	     * above.
	     */
	    p.rect(50, 300, 150, 100);
	    p.fill_stroke();
	   
	    /* -------------------------------
	     * Output graphics with pattern II
	     * -------------------------------
	     * 
	     * Set the fill and stroke color to light red. 
	     * Set pattern II as the fill color. Since pattern II has no inherent 
	     * stroke color it will use the stroke color currently being set. 
	     */
	    p.setcolor("fillstroke", "rgb", 1.0, 0.5, 0.5, 0);
	    p.setcolor("fill", "pattern", pattern2, 0, 0, 0);
	    
	    /* Draw a rectangle with the current fill color, i.e. filled with 
	     * pattern II repeatedly applied. Set the line width of the rectangle
	     * borders to the line width of the pattern
	     */
	    p.setlinewidth(0.5);
	    p.rect(250, 300, 150, 100);
	    p.fill_stroke();
	    
	    /* Set the current stroke color to green. Draw an arc segment
	     * as part of a pie chart. The arc will be filled with the green 
	     * pattern II set as current fill color above. The borders will be
	     * stroked with the stroke color currently being set to green.
	     */
	    p.setlinewidth(1);
	    p.setcolor("stroke", "rgb", 0.0, 0.5, 0.5, 0);
	    p.moveto(100, 150);
	    p.lineto(100, 200);
	    p.arcn(100, 150, 50, 90, 120);
	    p.closepath_fill_stroke();
	    
	    /* Set pattern I as the current fill color */
	    p.setcolor("fill", "pattern", pattern1, 0, 0, 0);
	    
	    /* Set the current stroke color to light red */
	    p.setcolor("stroke", "rgb", 1.0, 0.5, 0.5, 0);
	    
	    /* Draw another smaller arc segment as part of the pie chart */
	    p.moveto(100, 150);
	    p.lineto(100, 200);
	    p.arc(100, 150, 50, 90, 120);
	    p.closepath_fill_stroke();
      
	 
	    /* --------------------------------
	     * Output graphics with pattern III
	     * --------------------------------
	     * 
	     * Set pattern III as the fill color
	     */
	    p.setcolor("fill", "pattern", pattern3, 0, 0, 0);
	    
	    /* Draw a circle with the current fill color, i.e. filled with 
	     * the light green pattern III repeatedly being applied
	     */
	    p.circle(350, 150, 100);
	    p.fill();
	    
	    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");
	    exitcode = 1;
        } catch (Exception e) {
            System.err.println(e.getMessage());
	    exitcode = 1;
        } finally {
            if (p != null) {
                p.delete();
            }
	    System.exit(exitcode);
        }
    }
}