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