Priprava za tisk pošlje delo nazaj: isto posebno barvilo se je ločilo na dve plošči. HotPDF temu prepreči že ob nastajanju, tako da NChannel zapiše v petelementarni obliki DeviceN po ISO 32000-2 in za celoten dokument ohrani en kanoničen nadomestni prostor in tintno pretvorbo na ime posebnega barvila; drugo, nasprotujočo definicijo zavrne, namesto da bi jo izdal
NChannel ni ime družine barvnih prostorov
Prva stvar, ki jo je treba odučiti, je ime samo. NChannel ni družina barvnih prostorov, kot sta ji družini Separation in DeviceN. ISO 32000-2 §8.6.6.5 ga opisuje kot podtip DeviceN, zato se skladen prostor NChannel zapiše kot petelementarna tabela [/DeviceN names alternateSpace tintTransform attributes], slovar atributov pa nosi /Subtype /NChannel. V specifikaciji ni tabele [/NChannel ...]. Če ste jo kdaj zgradili ročno in gledali, kako se RIP le zmarsne, je razlog prav ta
HotPDF se je tu enkrat zmotil in to potem popravil, kar je vredno jasno povedati, ker oblikuje vedenje komponente danes. Starejše izdaje HotPDF so izdajale obliko z imenom družine. THotPDF.RegisterNChannelColorSpace zdaj izdaja le standardno obliko DeviceN z atributi in, ker je podtip NChannel prišel v PDF 1.6, vstopna točka izdelovalca vrata na RequirePDFVersion(pdf16, ...) ter na starejših ciljih preprosto odkloni. Stran izrisa je namerno bolj popustljiva kot zapisovalnik: HPDFResolveColorSpace še vedno sprejme zastareli žeton /NChannel kot družino DeviceN, tako da datoteke iz starega zapisovalnika še naprej izrisujejo, vse, kar HotPDF zapiše nazaj, pa uporablja standardno kodiranje. Popustljivo na vhodu, strogo na izhodu je tu prava asimetrija, saj se mora vaš bralec spopasti z datotekami, ki jih ni ustvaril, vašemu zapisovalniku pa takšna opravičila manjkajo
Zakaj eno ime posebnega barvila pristane na dveh ploščah?
Ker je ime barvila posebne barve identiteta plošče za celoten dokument in ne krajevni argument. Dva klica, ki oba poimenujeta Orange, a izročita drugačen nadomestni prostor, ali isti nadomestni prostor z drugačno tintno pretvorbo, opisujeta dve različni barvili, ki sta po naključji dobili isto oznako. RIP, ki gradi ločitve, tega ne zna spraviti skupaj, zato stori edino pošteno stvar in vam da dve plošči. HotPDF zato vzdržuje kanonični podpis dokumenta na ime barvila. RegisterSpotColorantDefinition ta podpis sestavi iz nadomestnega barvnega prostora in oblike tintne funkcije, skozenj pa gre vsak RegisterSeparation, RegisterSeparationFunc, RegisterSeparationLUT in definicija posebnega barvila NChannel. Ko druga definicija ne soglaša, klic sproži izjemo, namesto da bi tiho registriral drugo varianto, sporočilo pa je namerno natanko glede načina odpovedi, ker je alternativa odkriti težavo na dokazu plošče tri tedne pozneje
// Orange je bil že registriran proti DeviceCMYK s tintno
// pretvorbo 0 / 0.55 / 1 / 0 pri polnem tintu.
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;
Razdelitev glavnih imen na procesna in posebna
Popoln NChannel mora vsako od svojih glavnih imen barvil upoštevati točno enkrat, bodisi kot procesno komponento bodisi kot posebno barvilo. Napredna preobremenitev RegisterNChannelColorSpace sprejme glavna ColorantNames, ProcessColorantNames, nadomestni prostor, skupno tintno pretvorbo, tabelo zapisov THPDFNChannelSpotColorant in neobvezen vrstni red tiskanja. Vsak zapis posebnega barvila nosi svoje ime, svojo tintno pretvorbo Separation z enim vhodom, neobvezno trdnost in neobvezno funkcijo dot-gain. Skupna tintna pretvorba mora preslikati N vhodov v število komponent nadomestnega prostora; vsak tint posebnega barvila mora preslikati en vhod v isto število
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);
Iz tega klica HotPDF izda slovar atributov, ki ga zahteva specifikacija: /Subtype /NChannel, slovar /Process, katerega /ColorSpace je procesni prostor in katerega /Components našteje procesna imena v vrstnem redu komponent tega prostora, slovar /Colorants z pravo tabelo [/Separation name alternate tintfn] za vsako posebno barvilo in slovar /MixingHints z /Solidities, /PrintingOrder in /DotGain, kadar ste jih podali. Vrnjeno ime vira gre v SetFillColorSpace ali SetStrokeColorSpace točno tako kot pri enostavnejših prostorih iz članka o izrisu posebnih barv Separation in DeviceN
Kaj preverjanje doslednosti dejansko zavrne?
Zavrne strukturno neskladnost znotraj prostora in to, preden je zapisan kateri koli predmet. Imena barvil morajo biti edinstvena in ne smejo biti prazna, All ali None. Procesne in posebne definicije skupaj morajo glavna imena pokriti točno, brez barvila, ki bi se pojavilo v obeh vlogah, in brez nedefiniranega. Ko je nadomestni prostor DeviceCMYK, morajo biti procesne komponente Cyan, Magenta, Yellow, Black v tem vrstnem redu, število procesnih imen pa se mora ujemati s številom komponent nadomestnega prostora. Vsaka tintna pretvorba in funkcija dot-gain mora biti posreden predmet funkcije z pravo vhodno in izhodno ariteto. Trdnost mora biti končna vrednost znotraj 0..1. Vrstni red tiskanja mora biti prazen ali popolna permutacija glavnih imen, nikoli delni seznam. Kar ne stori, je sodba o barvi: nič tu ne preverja, da vaša tintna pretvorba za Orange res spominja na barvilo v vedru, da je njegova sestava CMYK razumna nadomestna vrednost ali da se trdnost, ki ste jo podali, ujema z izmerjenim vedenjem na podlagi. To so vprašanja tiska in merjenja, komponenta pa nima mandata, da bi odgovorila. Enostavnejša preobremenitev samo za proces je po zasnovi še strožja: naredi NChannel samo s procesom in namenoma zavrne posebna imena, saj bi zapis posebnega barvila v tabelo imen brez ujemajočega vnosa /Colorants naredil strukturno neskladen dokument, izmišljanje privzete definicije pa bi bilo hujše od odpovedi
Izhodni nameni PDF/X-6n morajo pokriti vsako registrirano posebno barvilo
Datoteka PDF/X-6n z N barvili razglasi svoja barvila dvakrat, obe razglasitvi pa se morata ujemati. AddPDFX6ExternalOutputIntent zapiše referenco zunanjega profila ICC s svojo ColorantTable, preden pa to stori, ValidateRegisteredSpotOutputColorants obhodi vsako posebno barvilo, ki ga je dokument registriral, in sproži izjemo, če kakšno manjka iz tabele. Preverjanje teče v obeh smereh: ko izhodni namen enkrat objavi svoj seznam barvil, je tudi poznejša registracija posebnega barvila z imenom zunaj tega seznama zavrnjena. AddPDFX6ExternalOutputIntentSpotData doda še metapodatke po barvilu in uveljavlja svoja pravila, posebej to, da barvilo nosi ali vrednost trdnosti ali spektralne podatke CxF/X-4, nikoli oboje. To je ista površina skladnosti, o kateri govori članek o preverjanju PDF/A, PDF/X in PDF/UA
Spectral := TMemoryStream.Create;
try
LoadCxFForInk('Orange', Spectral); // tovor ISO 17972-4
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], // trdnost za eno barvilo
Order,
['Orange'], [Spectral]); // spektralni podatki za drugega
finally
Spectral.Free;
end;
Dve operativni podrobnosti sta lahko spregledani. Register, ki stoji za vsem tem, velja na dokument in se počisti na mejah dokumentov, zato nalaganje nove datoteke v isti primerek THotPDF ne podeduje identitet posebnih barvil prejšnjega dokumenta; ta izolacija je bistvo, saj bi uhajajoč podpis zavrnil popolnoma veljavno delo v naslednjem delu. In stran profila ima svoje trde meje: zunanji izhodni namen zahteva cilj PDF 2.0, absolutni URL profila HTTP ali HTTPS, štiribajtni podpis barvnega prostora ICC, za PDF/X-6n pa od 2 do 15 barvil z ujemajočim podpisom od 2CLR do FCLR
Kjer se preverjanje ustavi
O ravnanju s CxF/X-4 je treba biti iskren. HotPDF na spektralni tok uporabi omejene strukturne varnostne preglede in potrdi, da se identiteta barvila znotraj njega ujema z barvilom, ki ste ga poimenovali. Omeji velikost tovora, zavrne vdelane ničelne bajte, odkloni vsak tok, ki vsebuje razglasitev DOCTYPE ali ENTITY, zahteva prepoznaven koren CxF in zahteva točno en element SpotInkCharacterisation s točno enim SpotInkName, ki se ujema z vašim imenom barvila. To je vrata proti deformiranemu in sovražnemu vhodu in ne preverjevalnik shem. Ni popolna implementacija ISO 17972-4, ne preveri vaših spektralnih meritev in ne izvaja povratnega pregleda poljubnih že obstoječih predmetnih grafov tretjih strani ali notranjih tabel barvil znotraj vdelanega profila ICC. Če vaš potek dela sloni na polni skladnosti CxF, datoteko preverite z namenskim orodjem, preden jo izročite komponenti
Ena sosednja omejitev ugrizne ljudi, ki je nikoli niso pričakovali srečati. Mehka maska svetlosti ne sme uporabiti Separation, DeviceN ali NChannel kot svojo /CS skupine prosojnosti; prostor mešanja skupine mora biti prostor naprave ali temelječ na CIE, zato se barva posebnega barvila znotraj skupine razreši prek njene tintne pretvorbe v nadomestni prostor, preden se izračuna svetlost. RegisterLuminositySoftMaskState zgradi skupino DeviceGray točno zato, da se to ne more pokvariti po nesreči. Praktična posledica je, da je zasnova, bogata s posebnimi barvili in maskirana na ta način, vrednotena skozi svoj CMYK nadomestek in ne skozi svoje barvilo, kar šteje, ko jo primerjate z ločenim dokazom, kot je opisano v zapiskih o preizkusu overprinta in napravah izrisa
Nič od tega ne odpravi potrebe po dokazu plošče, a prestavi celoten razred zavrnitev priprave za tisk iz tiskarske dvorane nazaj v izgradnjo. API-ji NChannel, Separation in izhodnega namena PDF/X-6n, opisani tukaj, prihajajo v standardni komponenti HotPDF Delphi Component za Delphi in C++Builder, kjer referenca dokumentira celotne postavitve zapisov in točne pogoje, pod katerimi vsak klic odpove varno