ข้ามไปยังเนื้อหา
getnextpdf.com

สร้าง CMYK และ spot color ที่พร้อมพิมพ์

สีบนหน้าจอเป็น RGB สีในงานพิมพ์ไม่ใช่ เมื่อแท่นพิมพ์หรือ proofing RIP รับ PDF ของคุณ มันต้องการหมึก process (CMYK) หมึกที่มีชื่อเป็นครั้งคราว (สี spot หรือ Separation) และการประกาศเงื่อนไขการผลิตที่มันควรถือว่าเป็น สูตรนี้แสดงเส้นทางการปล่อยสีสามแบบที่ NextPDF ให้คุณสำหรับผู้รับนั้น

  • Device CMYK การเติมและการตีเส้น — setFillColorCmyk() / setDrawColorCmyk()
  • Spot / Separation หมึกตามค่า tint — registerSpotColor() จากนั้น setSpotFillColor() / setSpotDrawColor()
  • ICC output intent ที่ประกาศเงื่อนไข working/output แบบ RGB สำหรับทั้งเอกสาร — Config::withOutputColorProfile() profile ที่บันเดิลไว้เป็น RGB working space นี่ไม่ได้ประกาศเงื่อนไขการพิมพ์ CMYK press / PDF/X ที่แท้จริง

หมายเหตุเรื่องขอบเขตก่อน: นี่คือ การปล่อย สี NextPDF เขียนตัวเลข CMYK พื้นที่ Separation และการประกาศ output-intent ที่คุณขอ มันไม่รัน color-management transform — มันจะไม่เรนเดอร์งานศิลป์ RGB ของคุณใหม่ลงใน CMYK gamut ปลายทาง ไม่ soft-proof มัน หรือรับประกันการตรงกันทางสายตา จัดหาสีที่ระบุไว้สำหรับเงื่อนไขของคุณแล้ว

Terminal window
composer require nextpdf/core:^3

ไม่ต้องการ extension เสริมใดๆ API ของสีเสถียรมาตั้งแต่ 1.2.0 และรันบน backport matrix 8.1–8.4

CMYK เป็นค่าเริ่มต้นสำหรับการพิมพ์ process แบบ offset และดิจิทัล: สี่ช่อง cyan / magenta / yellow / black (“key”) ตั้งสีเติมหรือสีตีเส้น แล้ววาดตามปกติ

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->addPage();
// Components are percentages, 0–100 (cyan, magenta, yellow, key).
$doc->setFillColorCmyk(0, 95, 100, 0); // a process "red"
$doc->rect(20, 30, 60, 40, 'F');
$doc->setDrawColorCmyk(100, 0, 0, 0); // pure cyan rule
$doc->setLineWidth(1.0);
$doc->rect(20, 30, 60, 40, 'S');
$doc->setTextColorCmyk(0, 0, 0, 100); // rich-free 100% K text
$doc->setFont('helvetica', '', 12);
$doc->text(20, 85, 'Process CMYK');
$doc->save(getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/cmyk.pdf');

การเรียกแต่ละครั้งปล่อยตัวดำเนินการสี DeviceCMYK ลงใน content stream: k สำหรับสี non-stroking (เติม/ข้อความ) และ K สำหรับสี stroking โดยสี่ส่วนประกอบถูกปรับเป็นช่วง 0.0–1.0 ที่ PDF ใช้ภายใน ISO 32000-2 §8.6.8 (Colour Operators, Table 73) นิยาม k และ K เป็นตัวดำเนินการตั้งสี DeviceCMYK §8.6.4.4 นิยามพื้นที่สี DeviceCMYK เอง

value object ที่อยู่เบื้องหลังคือ NextPDF\Graphics\Color หากคุณสร้างสีโดยตรง Color::cmyk($c, $m, $y, $k) รับเปอร์เซ็นต์ 0–100 เดียวกัน และเป็นสิ่งที่ทุกเมธอดเอกสาร …Cmyk เรียก

สี spot คือหมึกที่มีชื่อเดียว — Pantone, HKS, วาร์นิช, แผ่น “cut” สำหรับการ die-cut — ที่แท่นพิมพ์ใส่เป็นเพลตของตัวเองแทนที่จะสร้างจากหมึก process ใน PDF มันคือพื้นที่สี Separation: ชื่อ colourant บวกกับพื้นที่ทางเลือก (ในที่นี้คือ DeviceCMYK) และ tint-transform ที่จับคู่ค่า tint ใน [0, 1] กับพื้นที่ทางเลือก เพื่อให้ตัวเรนเดอร์ที่ไม่ใช่ spot ยังแสดงค่าประมาณได้

ลงทะเบียนหมึกหนึ่งครั้งพร้อม CMYK fallback ของมัน จากนั้นตั้งเป็นสีเติมหรือสีตีเส้นตามเปอร์เซ็นต์ tint

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->addPage();
// Register the ink and its CMYK fallback (percentages, 0–100).
$doc->registerSpotColor('PANTONE 485 C', 0, 95, 100, 0);
// Full-strength fill.
$doc->setSpotFillColor('PANTONE 485 C'); // tint defaults to 100
$doc->rect(20, 30, 50, 30, 'F');
// 40% tint of the same ink.
$doc->setSpotFillColor('PANTONE 485 C', 40);
$doc->rect(80, 30, 50, 30, 'F');
// Same ink as a stroke at 75%.
$doc->setSpotDrawColor('PANTONE 485 C', 75);
$doc->setLineWidth(1.5);
$doc->line(20, 75, 130, 75);
$doc->save(getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/spot.pdf');

คุณต้อง registerSpotColor() ก่อนที่จะเลือกมัน ชื่อที่ไม่ได้ลงทะเบียนจะ throw PageLayoutException การลงทะเบียนเขียนทรัพยากร Separation และ tint transform setSpotFillColor() / setSpotDrawColor() จากนั้นปล่อย /CS_<token> cs <tint> scn สำหรับการเติม (หรือรูปแบบ stroking ตัวพิมพ์ใหญ่ /CS_<token> CS <tint> SCN) กับทรัพยากร Separation ที่ลงทะเบียนนั้น มีสองชื่อที่แตกต่างกันที่เกี่ยวข้องในที่นี้ และเอนจินจัดการแยกกัน

  • KEY ของทรัพยากร — โทเคน /CS_… ที่ตัวดำเนินการ content-stream อ้างอิงถึงและที่ dictionary /Resources /ColorSpace ของหน้าถูกตั้งคีย์ภายใต้ — มาจากชื่อหมึกโดยการแทนที่อักขระที่ไม่ใช่ word ทุกตัวด้วย _ ดังนั้น 'PANTONE 485 C' เลือกทรัพยากร /CS_PANTONE_485_C (สำหรับชื่อหมึกที่มี _ ตามตัวอักษร เครื่องหมายยัติภังค์ หรือเครื่องหมายวรรคตอนอื่นๆ จะมีการต่อท้ายด้วย suffix สั้นๆ แบบกำหนดได้แน่นอนเพื่อให้คีย์ปลอด collision ดังนั้นชื่อที่เกือบเหมือนกันสองชื่อจึงไม่เคยใช้พื้นที่สีเดียวกัน)
  • ชื่อ colourant ของ Separation เอง — ชื่อที่นำพาภายใน array พื้นที่สี [/Separation /<name> …] — ถูกเก็บไว้ตามเดิมและเข้ารหัสโดยตัวเขียนเป็น PDF name object โดย hex-escape (#XX) delimiter หรือ non-printing byte ใดๆ มันไม่ถูก flatten เป็นโทเคน CS_… คีย์ของทรัพยากรและชื่อ colourant ถูกคำนวณแยกกันต่างหาก

argument tint ที่คุณส่งเป็นเปอร์เซ็นต์ 0 (กระดาษ) ถึง 100 (หมึกเต็ม) แต่ operand ที่เขียนลงใน content stream คือค่า normalised 0.0–1.0 ดังนั้น tint 40 ปล่อย /CS_PANTONE_485_C cs 0.400000 scn ISO 32000-2 §8.6.6.4 ครอบคลุมพื้นที่สี Separation และ tint transform ของมัน

tint transform เริ่มต้นคือการ interpolate เชิงเส้นจาก [0 0 0 0] (กระดาษที่ tint 0) ไปยัง CMYK fallback ที่ลงทะเบียน (หมึกเต็มที่ tint 1) นั่นถูกต้องสำหรับหมึก spot ทั่วไป หมึกที่ไม่เป็นเชิงเส้นหรือ profile ที่วัดได้ต้องการ transform แบบกำหนดเอง ซึ่งอยู่นอกเหนือสูตรนี้

PDF สามารถนำพาการประกาศระดับเอกสารของเงื่อนไขสีที่สีของมันถูกจัดเตรียมไว้ — output intent: dictionary ที่ตั้งชื่อเงื่อนไขการผลิต พร้อม ICC profile ปลายทางที่ฝังเป็น ICCBased stream ใน workflow การพิมพ์/PDF-X ที่แท้จริง นี่คือเงื่อนไข CMYK press (profile FOGRA หรือ GRACoL แบบ coated เป็นต้น) อย่างไรก็ตาม profile ที่ NextPDF บันเดิลไว้เป็น RGB working space — ดังนั้นสิ่งที่ Config::withOutputColorProfile() ประกาศคือเงื่อนไข output แบบ RGB viewing / working-space ไม่ใช่ปลายทาง CMYK ดูหมายเหตุใต้ตัวอย่างก่อนพึ่งพามันสำหรับเอาต์พุตงานพิมพ์

NextPDF เปิดเผยสิ่งนี้ผ่าน Config ของเอกสาร เลือก profile working-space ที่บันเดิลไว้หนึ่งตัว สร้าง config แล้วสร้างเอกสารจากมัน

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Config;
use NextPDF\Core\Document;
use NextPDF\Core\OutputColorProfile;
// Declare an explicit, embedded output intent for the document.
$config = (new Config())
->withOutputColorProfile(OutputColorProfile::Srgb);
$doc = Document::createStandalone($config);
$doc->addPage();
$doc->setFillColorCmyk(0, 95, 100, 0);
$doc->rect(20, 30, 60, 40, 'F');
$doc->save(getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/with-intent.pdf');

OutputColorProfile เป็น enum ของ working space ที่เอนจินบันเดิล profile ไว้ให้ เคสที่มี profile รองรับทั้งหมดเป็น RGB working space สามส่วนประกอบ DeviceRGB เป็น sentinel เริ่มต้นและไม่ปล่อย output intent ไม่มี profile ปลายทาง CMYK ที่บันเดิลไว้

  • DeviceRGB — ค่าเริ่มต้น ไม่มี การปล่อย output intent: ไม่มีการประกาศเงื่อนไข output ระดับ PDF และไปป์ไลน์ PDF/A (หากทำงานอยู่) ยังคงควบคุม array /OutputIntents แต่เพียงผู้เดียว ใช้สิ่งนี้เมื่อคุณไม่ต้องการประกาศ output intent (เนื้อหา DeviceRGB ของ PDF ที่ไม่มี output intent ขึ้นอยู่กับอุปกรณ์ — มันไม่ใช่ sRGB ที่ประกาศไว้)
  • Srgb — ปล่อย dictionary output-intent ที่ฝัง sRGB.icc ที่บันเดิลไว้ พร้อมตัวระบุเงื่อนไขมาตรฐาน sRGB IEC61966-2.1
  • DisplayP3, Rec2020, A98RGB, ProphotoRGB — RGB working space แบบ wide-gamut แต่ละตัวฝัง ICC profile ที่บันเดิลไว้ภายใต้ตัวระบุเงื่อนไขแบบกำหนดเอง (NextPDF wide-gamut …)

เคสใดก็ตามนอกเหนือจาก DeviceRGB ทำให้ตัวเขียนปล่อย dictionary output-intent ที่อ้างอิง ICCBased stream ที่ฝังไว้ (พร้อมจำนวนส่วนประกอบ /N 3 ของมัน) ISO 32000-2 §14.11.5 นิยาม dictionary output-intent §8.6.5.5 นิยามพื้นที่สี ICCBased ที่นำพา profile ที่ฝังไว้ ในเอนจินปัจจุบัน dictionary นี้ถูกเขียนด้วย PDF/X output-intent subtype /GTS_PDFX ไม่ว่าคุณจะเลือก profile ที่บันเดิลตัวใด (เส้นทางการเก็บถาวร PDF/A ใช้ subtype /GTS_PDFA1 ของตัวเองและถูกปล่อยแยกต่างหาก)

ข้อควรระวังสำคัญ: เพราะ profile ที่บันเดิลทั้งหมดเป็น RGB สิ่งนี้ประกาศ RGB working space และ viewing intent ของเอกสาร — มัน ไม่ใช่ profile ปลายทาง CMYK และมันไม่ transform สิ่งใดเป็น CMYK เอนจินไม่ให้คุณจัดหา ICC ปลายทาง CMYK แบบกำหนดเองผ่าน withOutputColorProfile() output intent CMYK แบบ print/PDF-X ที่แท้จริงต้องการ workflow ที่ฝัง ICC profile CMYK ของคุณเองเป็นปลายทาง สำหรับ output intent การเก็บถาวรที่เชื่อมเข้ากับ array /OutputIntents เดียวกัน ดู เอาต์พุต PDF/A-4

  • Device CMYK — ค่าเริ่มต้นสำหรับงานศิลป์ใดก็ตามที่มุ่งไปยังแท่นพิมพ์ process ระบุสีของคุณเป็น CMYK ตั้งแต่เริ่มต้น เพื่อไม่ให้มีการเดา RGB→CMYK เกิดขึ้นใน downstream
  • Spot / Separation — สีของแบรนด์ที่ต้องตรงกับหมึกที่แน่นอน บวกกับเพลตที่ไม่ใช่ process (วาร์นิช, สีขาว, เมทัลลิก, die-cut, ฟอยล์) ลงทะเบียนครั้งเดียว ลงสีที่ tint ใดก็ได้
  • Output intent — ตั้งมันเมื่อคุณต้องการให้ไฟล์อธิบายตัวเองเกี่ยวกับเงื่อนไข working/output แบบ RGB ของมัน หรือเมื่อผู้รับ (ตัวแสดงผล, color-managed RIP, ตัวตรวจสอบ) คาดหวังเงื่อนไข output ที่ประกาศไว้ profile ที่บันเดิลไว้ประกาศเฉพาะเงื่อนไข working/output แบบ RGB เท่านั้น มันไม่ประกาศเงื่อนไขการพิมพ์ CMYK press / PDF/X ที่แท้จริง
  • ส่วนประกอบ CMYK เป็นเปอร์เซ็นต์ (0–100) ไม่ใช่ 0–1 เมธอดเอกสาร …Cmyk และ Color::cmyk() รับแต่ละช่องเป็นเปอร์เซ็นต์ 0–100 และหารด้วย 100 เมื่อเขียนตัวดำเนินการ operand ของ content-stream คือค่า normalised 0.0–1.0 ส่ง 100 สำหรับหมึกเต็ม ไม่ใช่ 1.0 (ซึ่งเอนจินจะถือว่าเป็นหมึก 1%)
  • ลงทะเบียนก่อนที่จะเลือก spot setSpotFillColor() / setSpotDrawColor() จะ throw หากชื่อไม่เคยถูกลงทะเบียน ชื่อจับคู่ตรงเป๊ะ รวมถึงตัวพิมพ์และช่องว่าง
  • สถานะสีคงอยู่ สี CMYK หรือ spot ยังคงมีผลจนกว่าคุณจะเปลี่ยนมัน รีเซ็ตก่อนบล็อกที่ไม่เกี่ยวข้อง
  • CMYK fallback เป็นค่าประมาณ tint transform ของ Separation มีอยู่เพื่อให้ตัวเรนเดอร์ที่ไม่ใช่ spot แสดง บางอย่าง ได้ มันไม่ใช่เอาต์พุตงานพิมพ์ หมึกจริงคือสิ่งที่เพลตที่มีชื่อผลิตออกมา
  • output intent คือการประกาศ ไม่ใช่การแปลง การประกาศ OutputColorProfile::Srgb ไม่ได้ transform สีของคุณเป็น sRGB มันระบุเงื่อนไขที่ตั้งใจไว้ ความแม่นยำของสีเป็นความรับผิดชอบของคุณใน upstream

การเลือกสีแต่ละครั้งเป็นตัวดำเนินการ content-stream เดียว spot ยังเขียนทรัพยากร Separation หนึ่งตัวต่อหมึกที่ลงทะเบียน profile output-intent ที่ฝังถูกเขียนหนึ่งครั้งต่อเอกสาร ทุกเส้นทางอยู่ในงบประมาณ 2000 ms / 64 MB อย่างสบาย

สูตรนี้ปล่อยเฉพาะสีและ profile ที่โค้ดของคุณระบุ มันไม่แยกวิเคราะห์อินพุตที่ไม่น่าเชื่อถือและไม่เข้าถึงเครือข่าย หากชื่อ colourant หรือส่วนประกอบ CMYK มาจากข้อมูลภายนอก ให้ตรวจสอบมัน: clamp ส่วนประกอบเป็น 0–100 และปฏิเสธอักขระควบคุมในชื่อ spot (NUL byte ในชื่อ Separation ถูกปฏิเสธโดยเอนจิน)

ข้อความSpecClause
k และ K คือตัวดำเนินการสีที่ตั้งสี DeviceCMYK non-stroking / strokingISO 32000-2§8.6.8
DeviceCMYK คือพื้นที่สี process สี่ส่วนประกอบแบบ subtractiveISO 32000-2§8.6.4.4
พื้นที่สี Separation ตั้งชื่อ colourant หนึ่งตัวที่ tint ของมันจับคู่กับพื้นที่ทางเลือกผ่าน tint transformISO 32000-2§8.6.6.4
พื้นที่สี ICCBased ฝัง ICC profile stream พร้อมจำนวนส่วนประกอบ /NISO 32000-2§8.6.5.5
output intent ประกาศเงื่อนไขการผลิตเป้าหมาย GTS_PDFX ตั้งชื่อ subtype งานพิมพ์ISO 32000-2§14.11.5

Reproducibility profile — structural การปล่อยสีไม่มี entropy ของตัวเอง แต่ทุกเอกสารที่บันทึกนำพา trailer /ID และ date atom และ ICC stream ที่ฝังเสถียรในระดับไบต์เฉพาะกับ profile ที่บันเดิลแบบคงที่ ข้อกล่าวอ้างที่รองรับคือความเท่ากันเชิงโครงสร้างหลังการ normalise ด้วย qpdf สูตรนี้อธิบายว่า NextPDF ผลิตโครงสร้างอย่างไร มันไม่ยืนยันความสอดคล้องตาม ISO 32000-2 แบบครอบจักรวาล

ไม่เกี่ยวข้อง Device CMYK, สี spot/Separation และการประกาศ output-intent เป็นความสามารถของ Core โดยไม่มี Premium gate Core รองรับการประกาศ output-intent แบบ RGB ที่บันเดิลไว้ที่แสดงในที่นี้ workflow ICC เงื่อนไขการพิมพ์ CMYK แบบกำหนดเองไม่ได้ถูกอ้างโดยสูตรนี้