PDFlib Cookbook

cookbook

color/devicen_color

Download Java Code     Switch to PHP Code     Show Output PDF

/*
 * DeviceN color and shadings with spot colors:
 * - Define DeviceN colors with N=2/3/4 process colors and use them to construct a shading
 * 
 * The required PostScript tint transform functions for DeviceN color based
 * on a subset of the Cyan, Magenta, Yellow and Black process colors are
 * listed in the PDFlib Tutorial.
 * 
 * The PostScript tint transform functions required for DeviceN color spaces
 * are defined below as transformFunc<N> for N=2/3/4/5. They work only with
 * Lab as alternate color space and need the Lab values of the DeviceN
 * components at the start of the code. The PostScript code is written for
 * clarity, not efficiency.
 * 
 * The PostScript functions below are not used by the code, but are only
 * provided here for information.
 * The functions are required only for explicitly constructing a DeviceN
 * color space. PDFlib automatically creates a suitable DeviceN color
 * space for shadings based on spot colors (see spot_color_shading).
 *
 * Required software: PDFlib/PDFlib+PDI/PPS 9.1
 * Required data: none
 */
package com.pdflib.cookbook.pdflib.color;

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

public class devicen_color
{
	/* FOR INFORMATION ONLY: PostScript tint transfer functions for use
	 * in a DeviceN color with N=2,3,4,5.
	 * These functions create a simple weighted blend of the Lab values of
	 * the underlying colors. The Lab values of the colors in the DeviceN
	 * color space must be defined at the start of the PostScript code.
	 */
	static final String transformFunc2 =
		"% DeviceN transform function for N=2 in CIE L*a*b* color space\n" +
		"% Copyright (c) 2016 PDFlib GmbH\n"				+
		"% Lab color values of input colors must be listed here:\n" 	+
		"80 28 75			% color 1: PANTONE 123 U\n" 	+
		"31.76 0 -17			% color 2: PANTONE 289 U\n" 	+
		"% blend L values\n" 					+
		"7 index 6 index mul	% t1*L1\n" 			+
		"7 index 4 index mul	% t2*L2\n" 			+
		"add\n" 						+
		"9 1 roll		% bottom: L\n" 	                +
		"% blend a values\n" 					+
		"7 index 5 index mul	% t1*a1\n" 			+
		"7 index 3 index mul	% t2*a2\n" 			+
		"add\n" 						+
		"9 1 roll		% bottom: a\n" 	                +
		"% blend b values\n" 					+
		"7 index 4 index mul	% t1*b1\n" 			+
		"7 index 2 index mul	% t2*b2\n" 			+
		"add\n" 						+
		"9 1 roll		% bottom: b\n" 	                +
		"pop pop pop pop pop pop pop pop\n";

	static final String transformFunc3 =
		"% DeviceN transform function for N=3 in CIE L*a*b* color space\n" +
		"% Copyright (c) 2016 PDFlib GmbH\n"				+	
		"% Lab color values of input colors must be listed here:\n" 	+
		"80 28 75		% color 1: PANTONE 123 U\n" 	        +
		"31.76 0 -17		% color 2: PANTONE 289 U\n" 		+
		"53.73 61 3		% color 3: PANTONE Rubine Red U\n" 	+
		"% blend L values\n" 					+
		"11 index 9 index mul		% t1*L1\n" 		+
		"11 index 7 index mul		% t2*L2\n" 		+
		"11 index 5 index mul		% t3*L3\n" 		+
		"add add\n" 						+
		"13 1 roll			% bottom: L\n" 	        +
		"% blend a values\n" 					+
		"11 index 8 index mul		% t1*a1\n" 		+
		"11 index 6 index mul		% t2*a2\n" 		+
		"11 index 4 index mul		% t3*a3\n" 		+
		"add add\n" 						+
		"13 1 roll			% bottom: a\n" 	        +
		"% blend b values\n" 					+
		"11 index 7 index mul		% t1*b1\n" 		+
		"11 index 5 index mul		% t2*b2\n" 		+
		"11 index 3 index mul		% t3*b3\n" 		+
		"add add\n" 						+
		"13 1 roll					% bottom: b\n" 	+
		"pop pop pop pop pop pop pop pop pop pop pop pop\n";

	static final String transformFunc4 =
		"% DeviceN transform function for N=4 in CIE L*a*b* color space\n" +
		"% Copyright (c) 2016 PDFlib GmbH\n"				+	
		"% Lab color values of input colors must be listed here:\n" 	+
		"80 28 75		% color 1: PANTONE 123 U\n" 		+
		"31.76 0 -17		% color 2: PANTONE 289 U\n" 		+
		"53.73 61 3		% color 3: PANTONE Rubine Red U\n" 	+
		"90.59 4 47		% color 4: PANTONE 1215 U\n" 		+
		"% blend L values\n" 					+
		"15 index 12 index mul		% t1*L1\n" 		+
		"15 index 10 index mul		% t2*L2\n" 		+
		"15 index 8 index mul		% t3*L3\n" 		+
		"15 index 6 index mul		% t4*L4\n" 		+
		"add add add\n" 					+
		"17 1 roll			% bottom: L\n" 	        +
		"% blend a values\n" 					+
		"15 index 11 index mul		% t1*a1\n" 		+
		"15 index 9 index mul		% t2*a2\n" 		+
		"15 index 7 index mul		% t3*a3\n" 		+
		"15 index 5 index mul		% t4*a4\n" 		+
		"add add add\n" 					+
		"17 1 roll			% bottom: a\n" 	        +
		"% blend b values\n" 					+
		"15 index 10 index mul		% t1*b1\n" 		+
		"15 index 8 index mul		% t2*b2\n" 		+
		"15 index 6 index mul		% t3*b3\n" 		+
		"15 index 4 index mul		% t4*b4\n" 		+
		"add add add\n" 					+
		"17 1 roll			% bottom: b\n" 	        +
		"pop pop pop pop pop pop pop pop pop pop pop pop pop pop pop pop\n";

	static final String transformFunc5 =
		"% DeviceN transform function for N=5 in CIE L*a*b* color space\n" +
		"% Copyright (c) 2016 PDFlib GmbH\n"				+
		"% Lab color values of input colors must be listed here:\n" 	+
		"80 28 75		% color 1: PANTONE 123 U\n" 	        +
		"31.76 0 -17		% color 2: PANTONE 289 U\n" 		+
		"53.73 61 3		% color 3: PANTONE Rubine Red U\n" 	+
		"90.59 4 47		% color 4: PANTONE 1215 U\n" 		+
		"60 0 -2		% color 5: PANTONE Cool Gray 8 U\n" 	+
		"% blend L values\n" 						+
		"19 index 15 index mul		% t1*L1\n" 		+
		"19 index 13 index mul		% t2*L2\n" 		+
		"19 index 11 index mul		% t3*L3\n" 		+
		"19 index 9 index mul		% t4*L4\n" 		+
		"19 index 7 index mul		% t5*L5\n" 		+
		"add add add add\n" 					+
		"21 1 roll			% bottom: L\n" 	        +
		"% blend a values\n" 					+
		"19 index 14 index mul		% t1*a1\n" 		+
		"19 index 12 index mul		% t2*a2\n" 		+
		"19 index 10 index mul		% t3*a3\n" 		+
		"19 index 8 index mul		% t4*a4\n" 		+
		"19 index 6 index mul		% t5*a5\n" 		+
		"add add add add\n" 					+
		"21 1 roll			% bottom: a\n" 	        +
		"% blend b values\n" 					+
		"19 index 13 index mul		% t1*b1\n" 		+
		"19 index 11 index mul		% t2*b2\n" 		+
		"19 index 9 index mul		% t3*b3\n" 		+
		"19 index 7 index mul		% t4*b4\n" 		+
		"19 index 5 index mul		% t5*b5\n" 		+
		"add add add add\n" 					+
		"21 1 roll			% bottom: b\n" 	        +
		"pop pop pop pop pop pop pop pop pop pop pop pop pop pop pop pop pop pop pop pop\n";

    public static void main (String argv[])
    {
	/* This is where the data files are. Adjust as necessary. */
	String searchpath = "../input";
	String outfile = "devicen_color.pdf";
	String title = "DeviceN color";

	pdflib p = null;
	int font, devicen, sh, shp;
	int y = 600, x = 30, width=700, height=50, fontsize=12, leading=21;
	int exitcode = 0;

	try {
	    p = new pdflib();

	    p.set_option("searchpath={" + searchpath + "}");

	    /* This means that errors in load_font() etc. throw an exception */
	    p.set_option("errorpolicy=exception");

	    p.begin_document(outfile, "");

	    p.set_info("Creator", "PDFlib Cookbook");
	    p.set_info("Title", title);
	    
	    /* Load the font */
	    font = p.load_font("Helvetica-Bold", "unicode", "");
	    
	    /* Start the page */
	    p.begin_page_ext(0, 0, "width=a4.height height=a4.width");
	    
	    p.setfont(font, fontsize);

	    
	    /* *******************************************************
	     * Define DeviceN color based on two process colors
	     */
	    devicen = p.create_devicen(
	    	"names={Magenta Yellow} alternate=devicecmyk transform={{0 0 4 1 roll}}");

	    p.fit_textline("DeviceN-based shading with N=2 (process colors Magenta/Yellow) and stop colors 1/0 and 0/1:",
	    		x, y -= 2*leading, "fillcolor=black");

	    y -= height + fontsize;
	    
	    /* Create axial shading based on DeviceN color */ 
            sh = p.shading("axial", x, y, x+width, y, 0, 0, 0, 0,
                 "startcolor={devicen " + devicen + " 1 0} " +
                 "  endcolor={devicen " + devicen + " 0 1}");

            shp = p.shading_pattern(sh, "");
            p.set_graphics_option("fillcolor={pattern " + shp + "}");
    
            /* Fill a rectangle with the shading */
            p.rect(x, y, width, height);
            p.fill();


            /* *******************************************************
             * Define DeviceN color based on three process colors
             */
            devicen = p.create_devicen(
                "names={Cyan Magenta Black} alternate=devicecmyk transform={{0 exch}}");

            p.fit_textline("DeviceN-based shading with N=3 (process colors Cyan/Magenta/Black) and stop colors 1/0/0, 0/1/0 and 0/0/1:",
                        x, y -= 2*leading, "fillcolor=black");

            y -= height + fontsize;
            
            /* Create axial shading based on DeviceN color */ 
            sh = p.shading("axial", x, y, x+width, y, 0, 0, 0, 0,
                 "stopcolors={  0%  {devicen " + devicen + " 1 0 0} " +
                             " 50%  {devicen " + devicen + " 0 1 0} " +
                             "100%  {devicen " + devicen + " 0 0 1} }");

            shp = p.shading_pattern(sh, "");
            p.set_graphics_option("fillcolor={pattern " + shp + "}");
    
            /* Fill a rectangle with the shading */
            p.rect(x, y, width, height);
            p.fill();


            /* *******************************************************
             * Define DeviceN color based on four process colors;
             * Since all CMYK components are used an empty transfer function
             * can be provided.
             */
            devicen = p.create_devicen(
                "names={Cyan Magenta Yellow Black} alternate=devicecmyk transform={{}}");

            p.fit_textline("DeviceN-based shading with N=4 (process colors Cyan/Magenta/Yellow/Black) and stop colors 1/0/0/0, 0/1/0/0, 0/0/1/0 and 0/0/0/1:",
                        x, y -= 2*leading, "fillcolor=black");

            y -= height + fontsize;
            
            /* Create axial shading based on DeviceN color */ 
            sh = p.shading("axial", x, y, x+width, y, 0, 0, 0, 0,
                 "stopcolors={  0%  {devicen " + devicen + " 1 0 0 0} " +
                             " 33%  {devicen " + devicen + " 0 1 0 0} " +
                             " 66%  {devicen " + devicen + " 0 0 1 0} " +
                             "100%  {devicen " + devicen + " 0 0 0 1} }");

            shp = p.shading_pattern(sh, "");
            p.set_graphics_option("fillcolor={pattern " + shp + "}");

            /* Fill a rectangle with the shading */
            p.rect(x, y, width, height);
            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);
        }
    }
}