Perusahaan pra-cetak mengirim pekerjaan itu kembali: tinta spot yang sama terpisah ke dua pelat. HotPDF mencegahnya saat penulisan dengan menulis NChannel sebagai bentuk DeviceN lima elemen versi ISO 32000-2 dan dengan mempertahankan satu ruang alternatif kanonik dan satu tint transform per nama spot untuk seluruh dokumen, menolak definisi kedua yang bertentangan alih-alih menuliskannya
NChannel bukan nama keluarga ruang warna
Hal pertama yang harus dilupakan adalah nama itu sendiri. NChannel bukan keluarga ruang warna sebagaimana Separation dan DeviceN adalah keluarga. ISO 32000-2 §8.6.6.5 menggambarkannya sebagai subtype dari DeviceN, jadi ruang NChannel yang sesuai ditulis sebagai array lima elemen [/DeviceN names alternateSpace tintTransform attributes], dan kamus attributes membawa /Subtype /NChannel. Tidak ada array [/NChannel ...] dalam spesifikasi. Jika Anda pernah membangunnya manual dan menyaksikan RIP mengabaikannya, itulah alasannya
HotPDF pernah keliru soal ini lalu memperbaikinya, dan itu layak dinyatakan terus terang karena membentuk perilaku komponen hari ini. Rilis HotPDF lama menulis bentuk nama-keluarga. THotPDF.RegisterNChannelColorSpace kini hanya menulis bentuk standar DeviceN-plus-attributes, dan karena subtype NChannel hadir di PDF 1.6, titik masuk producer menggerbang lewat RequirePDFVersion(pdf16, ...) dan sekadar menolak di target lebih tua. Sisi render sengaja lebih memaafkan daripada penulisnya: HPDFResolveColorSpace masih menerima token warisan /NChannel sebagai keluarga DeviceN sehingga file dari penulis lama tetap terender, tetapi apa pun yang HotPDF tulis ulang memakai pengodean standar. Longgar di input, ketat di output adalah asimetri yang tepat di sini, karena pembaca Anda harus menghadapi file yang tidak ia buat sedangkan penulis Anda tak punya alasan seperti itu
Mengapa satu nama spot berakhir di dua pelat?
Karena nama colorant spot adalah identitas pelat tingkat dokumen, bukan argumen lokal. Dua panggilan yang sama-sama menyebut Orange tetapi menyerahkan ruang alternatif berbeda, atau ruang alternatif sama dengan tint transform berbeda, menggambarkan dua tinta berbeda yang kebetulan berbagi label. RIP yang membangun separasi tak punya cara mendamaikannya, jadi ia melakukan satu-satunya hal jujur dan memberi Anda dua pelat. Karena itu HotPDF memelihara satu signature kanonik per dokumen untuk setiap nama colorant. RegisterSpotColorantDefinition menyusun signature itu dari ruang warna alternatif dan bentuk fungsi tint, dan setiap RegisterSeparation, RegisterSeparationFunc, RegisterSeparationLUT, serta definisi spot NChannel melewatinya. Saat definisi kedua tak sepaham, panggilan itu melempar alih-alih diam-diam mendaftarkan varian kedua, dan pesannya sengaja spesifik tentang mode kegagalannya, karena alternatifnya adalah menemukannya di bukti pelat tiga minggu kemudian
// Orange was already registered against DeviceCMYK with the
// tint transform 0 / 0.55 / 1 / 0 at full tint.
Conflicting := Pdf.RegisterExponentialFunction(
Domain1, NoInk, OtherOrangeCMYK, 1, []);
try
Pdf.RegisterSeparationFunc('Orange', 'DeviceCMYK', Conflicting);
except
on E: Exception do
// 'Spot colourant "Orange" has inconsistent alternate colour
// space or tint definition in this document'
LogPrepressWarning(E.Message);
end;
Membelah nama master menjadi process dan spot
NChannel yang lengkap harus memperhitungkan setiap nama master colorant-nya tepat satu kali, sebagai komponen process atau colorant spot. Overload lanjutan RegisterNChannelColorSpace menerima ColorantNames master, ProcessColorantNames, ruang alternatif, tint transform keseluruhan, array record THPDFNChannelSpotColorant, dan urutan pencetakan opsional. Setiap record spot membawa namanya sendiri, tint transform Separation input-tunggalnya sendiri, solidity opsional, dan fungsi dot-gain opsional. Tint transform keseluruhan harus memetakan N input ke jumlah komponen ruang alternatif; setiap tint spot harus memetakan satu input ke jumlah yang sama
const
Colorants: array[0..4] of AnsiString =
('Cyan', 'Magenta', 'Yellow', 'Black', 'Orange');
ProcessNames: array[0..3] of AnsiString =
('Cyan', 'Magenta', 'Yellow', 'Black');
Order: array[0..4] of AnsiString =
('Yellow', 'Magenta', 'Cyan', 'Orange', 'Black');
Domain5: array[0..9] of Single = (0, 1, 0, 1, 0, 1, 0, 1, 0, 1);
Range4: array[0..7] of Single = (0, 1, 0, 1, 0, 1, 0, 1);
Domain1: array[0..1] of Single = (0, 1);
NoInk: array[0..3] of Single = (0, 0, 0, 0);
OrangeCMYK: array[0..3] of Single = (0, 0.55, 1, 0);
GainC0: array[0..0] of Single = (0);
GainC1: array[0..0] of Single = (1);
var
Pdf: THotPDF;
Spots: array[0..0] of THPDFNChannelSpotColorant;
CSName: AnsiString;
begin
Pdf.Version := pdf20;
Pdf.BeginDoc;
Spots[0].Name := 'Orange';
Spots[0].TintTransform := Pdf.RegisterExponentialFunction(
Domain1, NoInk, OrangeCMYK, 1, []);
Spots[0].HasSolidity := True;
Spots[0].Solidity := 0.82;
Spots[0].DotGainFunction := Pdf.RegisterExponentialFunction(
Domain1, GainC0, GainC1, 1, []);
CSName := Pdf.RegisterNChannelColorSpace(Colorants, ProcessNames,
'DeviceCMYK',
Pdf.RegisterPostScriptFunction(Domain5, Range4,
'{ pop pop pop pop pop 0 0 0 0 }'),
Spots, Order);
Dari panggilan itu HotPDF menulis kamus attributes yang diminta spesifikasi: /Subtype /NChannel, kamus /Process yang /ColorSpace-nya adalah ruang process dan /Components-nya mendaftar nama process dalam urutan komponen ruang itu, kamus /Colorants yang menyimpan array [/Separation name alternate tintfn] sungguhan untuk setiap spot, serta kamus /MixingHints yang membawa /Solidities, /PrintingOrder, dan /DotGain saat Anda menyuplainya. Nama resource yang kembali menuju SetFillColorSpace atau SetStrokeColorSpace persis seperti ruang-ruang yang lebih sederhana dalam artikel tentang rendering warna spot Separation dan DeviceN
Apa yang benar-benar ditolak pemeriksaan konsistensi?
Ia menolak inkonsistensi struktural di dalam ruang, dan melakukannya sebelum satu objek pun ditulis. Nama colorant harus unik dan tidak boleh kosong, All, atau None. Definisi process dan spot secara bersamaan harus menutup nama master dengan tepat, tanpa colorant yang muncul di dua peran dan tanpa yang tertinggal tanpa definisi. Saat ruang alternatifnya DeviceCMYK, komponen process harus Cyan, Magenta, Yellow, Black dalam urutan itu, dan jumlah nama process harus cocok dengan jumlah komponen alternatif. Setiap tint transform dan fungsi dot-gain harus objek fungsi indirect dengan input dan output aritas yang benar. Solidity harus nilai berhingga di dalam 0..1. Urutan pencetakan harus kosong atau permutasi penuh nama master, tidak pernah daftar parsial. Yang tidak ia lakukan adalah menghakimi warna: tidak ada di sini yang memeriksa apakah tint transform Orange Anda benar-benar mirip tinta di kaleng, apakah build CMYK-nya proksi yang masuk akal, atau apakah solidity yang Anda suplai cocok dengan perilaku terukur di substrat. Itu pertanyaan press dan pengukuran, dan komponen tak punya kewenangan menjawabnya. Overload process-only yang lebih sederhana lebih ketat lagi secara desain: ia menghasilkan NChannel process-only dan sengaja menolak menerima nama spot, karena menulis spot ke array names tanpa entri /Colorants yang cocok akan menghasilkan file yang tak sesuai secara struktural, dan memfabrikasi definisi bawaan lebih buruk daripada gagal
Output intent PDF/X-6n harus menutup setiap spot terdaftar
File N-colorant PDF/X-6n mendeklarasikan colorant-nya dua kali, dan kedua deklarasi harus sepaham. AddPDFX6ExternalOutputIntent menulis referensi profil ICC eksternal beserta ColorantTable-nya, dan sebelum melakukannya, ValidateRegisteredSpotOutputColorants menyusuri setiap spot yang didaftarkan dokumen dan melempar jika satu pun hilang dari tabel. Pemeriksaan berjalan dua arah: begitu output intent menerbitkan daftar colorant-nya, registrasi spot berikutnya untuk nama di luar daftar itu juga ditolak. AddPDFX6ExternalOutputIntentSpotData menambahkan metadata per-tinta di atasnya, dan ia menegakkan aturannya sendiri, terutama bahwa sebuah colorant membawa nilai solidity atau data spektral CxF/X-4, tidak pernah keduanya. Ini permukaan kesesuaian yang sama yang dibahas dalam tulisan tentang validasi PDF/A, PDF/X, dan PDF/UA
Spectral := TMemoryStream.Create;
try
LoadCxFForInk('Orange', Spectral); // ISO 17972-4 payload
Pdf.AddPDFX6ExternalOutputIntentSpotData(
'ECG-5', 'Five-colour output condition',
'https://profiles.example.com/ecg-5.icc', '5CLR',
Colorants,
'00112233445566778899AABBCCDDEEFF', #4#3#0#0,
['Cyan'], [0.70], // solidity for one colorant
Order,
['Orange'], [Spectral]); // spectral data for another
finally
Spectral.Free;
end;
Dua detail operasional mudah terlewat. Registry yang menopang semua ini bersifat per dokumen dan dibersihkan di batas dokumen, jadi memuat file baru ke instance THotPDF yang sama tidak mewarisi identitas spot dokumen sebelumnya; isolasi itu justru intinya, karena signature yang bocor akan menolak pekerjaan yang sepenuhnya sah di pekerjaan berikutnya. Dan sisi profil punya batas keras sendiri: output intent eksternal menuntut target PDF 2.0, URL profil HTTP atau HTTPS absolut, signature ruang warna ICC empat byte, dan untuk PDF/X-6n antara 2 sampai 15 colorant dengan signature 2CLR sampai FCLR yang cocok
Di mana pemeriksaan itu berhenti
Penanganan CxF/X-4 adalah bagian yang harus diakui dengan jujur. HotPDF menerapkan pemeriksaan keselamatan struktural berbatas pada stream spektral dan memastikan identitas tinta di dalamnya cocok dengan colorant yang Anda namai. Ia menutup ukuran payload, menolak byte null tersemat, menolak stream apa pun yang memuat deklarasi DOCTYPE atau ENTITY, menuntut akar CxF yang dikenali, dan menuntut tepat satu elemen SpotInkCharacterisation yang membawa tepat satu SpotInkName sama dengan nama colorant Anda. Itu gerbang terhadap input cacat dan bermusuhan, bukan validator skema. Itu bukan implementasi ISO 17972-4 lengkap, tidak memverifikasi pengukuran spektral Anda, dan tidak melakukan audit-balik grafik objek pihak ketiga yang sudah ada sebelumnya maupun tabel colorant internal di dalam profil ICC tersemat. Jika alur kerja Anda bergantung pada kesesuaian CxF penuh, validasi file dengan alat khusus sebelum menyerahkannya ke komponen
Satu kendala yang bersebelahan menggigit orang yang tak pernah menyangka akan menjumpainya. Soft mask luminositas tidak boleh memakai Separation, DeviceN, atau NChannel sebagai /CS grup transparansinya; ruang blending grup harus ruang berbasis perangkat atau CIE, sehingga cat spot di dalam grup di-resolve lewat tint transform-nya ke ruang alternatif sebelum luminositas dihitung. RegisterLuminositySoftMaskState membangun grup DeviceGray persis agar ini tak bisa salah secara tak sengaja. Konsekuensi praktisnya, desain yang kaya spot dan dimask dengan cara ini dievaluasi lewat proksi CMYK-nya, bukan tintanya, dan itu penting saat Anda membandingkannya dengan bukti terpisah sebagaimana dijelaskan dalam catatan tentang proofing overprint dan perangkat render
Tidak satu pun dari ini menghapus kebutuhan bukti pelat, tetapi ia memindahkan satu kelas utuh penolakan pra-cetak dari ruang press kembali ke proses build. API NChannel, Separation, dan output intent PDF/X-6n yang dijelaskan di sini dikirim dalam HotPDF Delphi Component standar untuk Delphi dan C++Builder, tempat referensinya mendokumentasikan tata letak record penuh dan kondisi persis saat setiap panggilan gagal tertutup