สร้าง 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 มัน หรือรับประกันการตรงกันทางสายตา จัดหาสีที่ระบุไว้สำหรับเงื่อนไขของคุณแล้ว
การติดตั้ง
หัวข้อที่มีชื่อว่า “การติดตั้ง”composer require nextpdf/core:^3ไม่ต้องการ extension เสริมใดๆ API ของสีเสถียรมาตั้งแต่ 1.2.0 และรันบน backport matrix 8.1–8.4
การเติมและการตีเส้น Device CMYK
หัวข้อที่มีชื่อว่า “การเติมและการตีเส้น Device CMYK”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 / Separation ตามค่า tint
หัวข้อที่มีชื่อว่า “หมึก Spot / Separation ตามค่า tint”สี 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 แบบกำหนดเอง ซึ่งอยู่นอกเหนือสูตรนี้
ประกาศ ICC output intent
หัวข้อที่มีชื่อว่า “ประกาศ ICC output intent”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.1DisplayP3,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 คือค่า normalised0.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 ถูกปฏิเสธโดยเอนจิน)
ความสอดคล้องตามมาตรฐาน
หัวข้อที่มีชื่อว่า “ความสอดคล้องตามมาตรฐาน”| ข้อความ | Spec | Clause |
|---|---|---|
k และ K คือตัวดำเนินการสีที่ตั้งสี DeviceCMYK non-stroking / stroking | ISO 32000-2 | §8.6.8 |
| DeviceCMYK คือพื้นที่สี process สี่ส่วนประกอบแบบ subtractive | ISO 32000-2 | §8.6.4.4 |
| พื้นที่สี Separation ตั้งชื่อ colourant หนึ่งตัวที่ tint ของมันจับคู่กับพื้นที่ทางเลือกผ่าน tint transform | ISO 32000-2 | §8.6.6.4 |
พื้นที่สี ICCBased ฝัง ICC profile stream พร้อมจำนวนส่วนประกอบ /N | ISO 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 แบบกำหนดเองไม่ได้ถูกอ้างโดยสูตรนี้