Baskı öncesi evi işi geri gönderir: aynı spot mürekkep iki kalıba ayrıştırılmış. HotPDF bunu yazım zamanında önler: NChannel uzayını ISO 32000-2 beş öğeli DeviceN biçiminde yazar ve tüm belge için spot adı başına tek bir kanonik yedek uzay ve ton dönüşümü tutar; çakışan ikinci tanımı yaymak yerine reddeder
NChannel bir renk uzayı ailesi adı değildir
Unutulması gereken ilk şey adın kendisi. NChannel, Separation ve DeviceN gibi bir renk uzayı ailesi değildir. ISO 32000-2 §8.6.6.5 onu DeviceN uzayının bir alt türü olarak tanımlar; bu yüzden uyumlu bir NChannel uzayı beş öğeli [/DeviceN names alternateSpace tintTransform attributes] dizisi olarak yazılır ve attributes sözlüğü /Subtype /NChannel taşır. Belirtimde [/NChannel ...] dizisi yoktur. Bir kez elle kurup bir RIP tarafından omuz silkildiğini gördüyseniz, nedeni budur
HotPDF bunu bir zamanlar yanlış yaptı ve sonra düzeltti; bileşenin bugünkü davranışını biçimlendirdiği için bunu açıkça söylemeye değer. Eski HotPDF sürümleri aile adı biçimini yayardı. THotPDF.RegisterNChannelColorSpace artık yalnızca standart DeviceN artı attributes biçimini yayar ve NChannel alt türü PDF 1.6 ile geldiği için üretici giriş noktası RequirePDFVersion(pdf16, ...) ile kapılar ve daha eski hedeflerde basitçe reddeder. İşleme tarafı yazıcıdan bilerek daha hoşgörülüdür: HPDFResolveColorSpace, eski yazıcıdan gelen dosyalar işlenmeye devam etsin diye eski /NChannel simgesini bir DeviceN ailesi olarak hâlâ kabul eder; ama HotPDF ürününün dışarı yazdığı her şey standart kodlamayı kullanır. Girdide hoşgörülü, çıktıda katı olmak burada doğru asimetridir; çünkü okuyucunuz kendi oluşturmadığı dosyalarla baş etmek zorundayken yazıcınızın böyle bir mazereti yoktur
Tek bir spot adı nasıl iki kalıpta biter?
Çünkü spot colorant adı yerel bir bağımsız değişken değil, belge genelinde bir kalıp kimliğidir. İkisi de Orange adını veren ama farklı bir yedek uzay teslim eden ya da aynı yedek uzayı farklı ton dönüşümüyle teslim eden iki çağrı, etiketi paylaşan iki farklı mürekkebi tanımlar. Ayrıştırma kuran bir RIP bunu uzlaştıramaz; bu yüzden tek dürüst şeyi yapar ve size iki kalıp verir. HotPDF bu yüzden colorant adı başına belge başına kanonik bir imza tutar. RegisterSpotColorantDefinition bu imzayı yedek renk uzayından ve ton işlevinin biçiminden kurar; her RegisterSeparation, RegisterSeparationFunc, RegisterSeparationLUT ve NChannel spot tanımı onun üzerinden geçer. İkinci bir tanım uyuşmadığında çağrı, sessizce ikinci bir varyant kaydetmek yerine hata fırlatır ve ileti hata kipinde bilerek belirgindir; çünkü alternatifi bunu üç hafta sonra bir kalıp provasında keşfetmektir
// Orange, tam tonda 0 / 0.55 / 1 / 0 ton dönüşümüyle
// DeviceCMYK karşısında zaten kayıtlıydı.
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' iletisini verir
LogPrepressWarning(E.Message);
end;
Ana adları process ve spot olarak bölmek
Eksiksiz bir NChannel, ana colorant adlarının her birini tam olarak bir kez — process bileşeni ya da spot colorant olarak — hesaba katmalıdır. Gelişmiş RegisterNChannelColorSpace aşırı yüklemesi; ana ColorantNames, ProcessColorantNames, yedek uzay, genel ton dönüşümü, THPDFNChannelSpotColorant kayıtlarından bir dizi ve isteğe bağlı bir baskı sırası alır. Her spot kaydı kendi adını, kendi tek girdili Separation ton dönüşümünü, isteğe bağlı bir solidity değerini ve isteğe bağlı bir nokta kazancı işlevini taşır. Genel ton dönüşümü N girdiyi yedek uzay bileşen sayısına eşlemelidir; her spot tonu bir girdiyi aynı sayıya eşlemelidir
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);
Bu çağrıdan HotPDF, belirtimin istediği attributes sözlüğünü yayar: /Subtype /NChannel; /ColorSpace öğesi process uzayı, /Components öğesi process adlarını o uzayın bileşen sırasında listeleyen bir /Process sözlüğü; her spot için gerçek bir [/Separation name alternate tintfn] dizisi tutan bir /Colorants sözlüğü ve sağladıysanız /Solidities, /PrintingOrder ile /DotGain taşıyan bir /MixingHints sözlüğü. Dönen kaynak adı, Separation ve DeviceN spot renk işleme makalesinde ele alınan daha basit uzaylarla aynı şekilde SetFillColorSpace ya da SetStrokeColorSpace çağrısına gider
Tutarlılık denetimi aslında neyi reddeder?
Uzay içindeki yapısal tutarsızlığı reddeder ve bunu tek bir nesne yazılmadan önce yapar. Colorant adları benzersiz olmalı ve boş, All ya da None olmamalıdır. Process ve spot tanımları birlikte ana adları tam olarak kapsamalıdır; hiçbir colorant iki rolde birden görünmez ve hiçbiri tanımsız kalmaz. Yedek uzay DeviceCMYK olduğunda process bileşenleri bu sırayla Cyan, Magenta, Yellow, Black olmalı ve process ad sayısı yedek bileşen sayısıyla eşleşmelidir. Her ton dönüşümü ve nokta kazancı işlevi, doğru girdi ve çıktı arity değerine sahip dolaylı bir işlev nesnesi olmalıdır. Solidity, 0..1 içinde sonlu bir değer olmalıdır. Baskı sırası boş ya da ana adların tam bir permütasyonu olmalıdır, asla kısmi bir liste değil. Yapmadığı şey renk yargılamaktır: burada hiçbir şey Orange ton dönüşümünüzün kutudaki mürekkebe gerçekten benzediğini, CMYK karşılığının makul bir vekil olduğunu ya da verdiğiniz solidity değerinin yüzey üzerindeki ölçülen davranışla eşleştiğini denetlemez. Bunlar baskı makinesi ve ölçüm sorularıdır ve bileşenin bunları yanıtlama yetkisi yoktur. Daha basit olan yalnızca process aşırı yüklemesi tasarım gereği daha da katıdır: yalnızca process NChannel üretir ve bilerek spot adı kabul etmez; çünkü eşleşen bir /Colorants girdisi olmadan names dizisine spot yazmak yapısal olarak uyumsuz bir dosya üretirdi ve varsayılan bir tanım uydurmak başarısız olmaktan daha kötü olurdu
PDF/X-6n çıktı amaçları kayıtlı her spot öğesini kapsamalı
N colorant içeren bir PDF/X-6n dosyası colorant öğelerini iki kez bildirir ve iki bildirim uyuşmalıdır. AddPDFX6ExternalOutputIntent, harici ICC profil başvurusunu ColorantTable ile yazar ve bunu yapmadan önce ValidateRegisteredSpotOutputColorants belgenin kaydettiği her spot öğesini gezer ve biri tabloda eksikse hata fırlatır. Denetim iki yönde çalışır: bir çıktı amacı colorant listesini yayınladıktan sonra, o liste dışındaki bir ad için sonraki bir spot kaydı da reddedilir. AddPDFX6ExternalOutputIntentSpotData bunun üzerine mürekkep başına meta veriyi ekler ve kendi kurallarını zorlar; özellikle bir colorant öğesinin ya bir solidity değeri ya da CxF/X-4 spektral verisi taşıması, asla ikisini birden taşımaması kuralını. Bu, PDF/A, PDF/X ve PDF/UA doğrulaması yazısında ele alınan uygunluk yüzeyinin aynısıdır
Spectral := TMemoryStream.Create;
try
LoadCxFForInk('Orange', Spectral); // ISO 17972-4 yükü
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], // bir colorant için solidity
Order,
['Orange'], [Spectral]); // bir diğeri için spektral veri
finally
Spectral.Free;
end;
İki işlemsel ayrıntıyı gözden kaçırmak kolaydır. Bütün bunların arkasındaki kayıt defteri belge başınadır ve belge sınırlarında temizlenir; bu yüzden aynı THotPDF örneğine yeni bir dosya yüklemek önceki belgenin spot kimliklerini devralmaz. Yalıtım amacın kendisidir; çünkü sızan bir imza, sonraki işteki tamamen geçerli bir çalışmayı reddederdi. Profil tarafının da kendi katı sınırları vardır: harici bir çıktı amacı PDF 2.0 hedefi, mutlak bir HTTP ya da HTTPS profil URL, dört baytlık bir ICC renk uzayı imzası ve PDF/X-6n için eşleşen 2CLR ile FCLR arası imzayla 2 ile 15 arasında colorant gerektirir
Denetimin durduğu yer
CxF/X-4 işleme kısmı, dürüst olunması gereken yerdir. HotPDF, spektral akışa sınırlı yapısal güvenlik denetimleri uygular ve içindeki mürekkep kimliğinin adlandırdığınız colorant ile eşleştiğini doğrular. Yük boyutunu sınırlar, gömülü null baytları reddeder, DOCTYPE ya da ENTITY bildirimi içeren herhangi bir akışı reddeder, tanınabilir bir CxF kökü ister ve colorant adınıza eşit tam olarak bir SpotInkName taşıyan tam olarak bir SpotInkCharacterisation öğesi ister. Bu, bozuk ve düşmanca girdiye karşı bir kapıdır, şema doğrulayıcı değildir. Tam bir ISO 17972-4 gerçeklemesi değildir, spektral ölçümlerinizi doğrulamaz ve keyfi önceden var olan üçüncü taraf nesne grafiklerini ya da gömülü bir ICC profilinin içindeki colorant tablolarını geriye dönük denetlemez. İş akışınız tam CxF uygunluğuna dayanıyorsa, dosyayı bileşene teslim etmeden önce özel bir araçla doğrulayın
Yakınlardaki bir kısıt, onunla karşılaşmayı hiç beklemeyenleri ısırır. Parlaklık yumuşak maskesi, şeffaflık grubu /CS öğesi olarak Separation, DeviceN ya da NChannel kullanamaz; grup karıştırma uzayı bir aygıt ya da CIE tabanlı uzay olmak zorundadır, bu yüzden grup içindeki spot boya, parlaklık hesaplanmadan önce ton dönüşümü üzerinden yedek uzaya çözümlenir. RegisterLuminositySoftMaskState, tam olarak bunun yanlışlıkla bozulamaması için bir DeviceGray grubu kurar. Pratik sonuç şudur: bu şekilde maskelenen spot ağırlıklı bir tasarım, mürekkebi üzerinden değil CMYK vekili üzerinden değerlendirilir; bu da onu üst baskı provası ve işleme aygıtları notlarında anlatıldığı gibi ayrıştırılmış bir provayla karşılaştırdığınızda önem taşır
Bunların hiçbiri kalıp provası ihtiyacını ortadan kaldırmaz ama baskı öncesi retlerinin koca bir sınıfını baskı odasından derleme aşamasına geri taşır. Burada anlatılan NChannel, Separation ve PDF/X-6n çıktı amacı API parçaları, Delphi ve C++Builder için standart HotPDF Delphi Component paketiyle gelir; başvuru belgesi tam kayıt düzenlerini ve her çağrının hangi koşullarda kapalı başarısız olduğunu belgeler