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 */ /* 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. */ $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"; $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"; $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"; $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"; /* This is where the data files are. Adjust as necessary. */ $searchpath = dirname(__FILE__,3)."/input"; $title = "DeviceN color"; $y = 600; $x = 30; $width=700; $height=50; $fontsize=12; $leading=21; $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("", ""); $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(""); $buf = $p->get_buffer(); $len = strlen($buf); header("Content-type: application/pdf"); header("Content-Length: $len"); header("Content-Disposition: inline; filename=devicen_color.pdf"); print $buf; } catch (PDFlibException $e) { echo("PDFlib exception occurred in devicen_color sample:" . "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " . $e->get_errmsg()); exit(1); } catch (Throwable $e) { echo($e); exit(1); } $p= 0;