PDFlib Cookbook

cookbook

color/devicen_color

Define and use several DeviceN colors.

Download Java Code  Switch to PHP Code  Show Output 

/*
 * 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("NotoSerif-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.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);
        }
    }
}