Teknik Makale

PDF/A Cihaz Rengi, OutputIntent ve Şeffaflık: Delphi

veraPDF, hiç RGB çizmeyen bir dosyada, çıplak bir re fi kalibresiz sayan bir dosyada ya da birebir aynı sayfa 1 geçerken düşen sayfa 2de ISO 19005-1 6.2.3.3ü işaretler. PDF/A o kuralları her sayfanın ne boyadığıyla hükmeder; dolayısıyla Delphi için PDFium Component PDF/A doğrulayıcısı, renk ve şeffaflık hükmünden önce her sayfayı formlara, patternlara, gliflere ve annotationlara kadar izler

6.2.3.3 ile 6.2.4.3 aslında ne ister?

ISO 19005-1 6.2.3.3, üç bağımsız kuralı tek paragrafta toplar. Uyumlu bir dosya DeviceRGB ya da DeviceCMYK kullanabilir ama ikisini birden kullanamaz; herhangi bir kalibresiz renk uzayı kullanıldıysa dosya bir PDF/A-1 OutputIntent taşımak zorundadır; DeviceRGB yalnızca profili RGB olan bir intentle, DeviceCMYK ise yalnızca CMYK olanla serbesttir. DeviceGray bu listenin dışında bırakılmıştır; çünkü madde, griyi her iki intent altında dönüştürmeyi açıklamaya devam eder. Intentin kendisi isteğe bağlıdır: 6.2.2, bir dosyanın belirtebileceğini söyler ve yalnızca OutputIntents girdisini sayar; o girdi /S /GTS_PDFA1 taşımalı ve /DestOutputProfileinde geçerli bir ICC profil akışı bulunmalıdır. Dolayısıyla her dosyadan intent isteyen bir denetçi, hiç cihaz rengi boyamayan uyumlu belgeleri reddeder. Bölüm 1, DefaultRGBden ya da DefaultCMYKden söz etmez; ama bunlar üzerinden yeniden eşlenen bir renk, CIE tabanlı bir uzayda çizilir (ISO 32000-1 §8.6.5.6) ve bu, 6.2.3.1in cihaz bağımsızlığı talebini karşılar; 6.2.3.3ün veraPDF test paketi onu kalibre edilmiş sayar ve PDFium Component da maddeyi aynı şekilde okur. Karıştırma yasağı ayrı durur: hem RGB hem CMYK boyayan bir PDF/A-1 dosyası, Default girdileri ikisini de kalibre etse bile düşer. ISO 19005-2 6.2.4.3 o yasağı kaldırır ve her uzayı kendi koşullarıyla kalibre eder; aşağıda sağ sütunun gösterdiği gibi. PDFium Component bu yüzden her bölüm için tek tarama koşturur ve karıştırma denetimini yalnızca PDF/A-1 iddialarına uygular

Boyanan cihaz uzayıPDF/A-1 (ISO 19005-1 6.2.3.3)PDF/A-2 ve sonrası (ISO 19005-2 6.2.4.3)
DeviceRGBDefaultRGB kapsamda ya da bir RGB intent; DeviceCMYK ile beraber değilDefaultRGB kapsamda, ya da bir RGB OutputIntent
DeviceCMYKDefaultCMYK kapsamda ya da bir CMYK intent; DeviceRGB ile beraber değilDefaultCMYK kapsamda, ya da bir CMYK OutputIntent
DeviceGrayDefaultGray kapsamda, ya da herhangi bir PDF/A-1 OutputIntentDefaultGray kapsamda, ya da herhangi bir PDF/A OutputIntent

Bir renk uzayı ne zaman kullanılmış sayılır?

Bir renk uzayını kullanmak, onunla bir görüntüleyicinin çizeceği bir yol üzerinde boyamak demektir. Bildirmek yetmez. veraPDF paketi bu noktayı 6.2.3.3ü geçen bir dosyayla koyar: adlandırılmış bir Form XObject, K ile k ile CMYK kurar, sayfanın kaynak sözlüğünde durur, sayfa içeriğinden hiç başvurulmaz ve dosyanın OutputIntenti RGBdir. Dosya genelinde cihaz renk adları araması o dosyayı düşürür ve yalnızca bir CMYK intenti altında DeviceRGB boyayan, iki adın çatışmadığı bir dosyayı kaçırır. PDFium Component bunun yerine çizim grafiğini yürür ve bu yürüyüş, kendi bayt düzeyli PDF/A preflight tarayıcısı üzerine kuruludur. Her sayfadan itibaren yürüyüş, şu kaynakların boyadığı rengi sayar:

  • sayfa içerik akışları ve bunların Do ile çağırdığı her Form XObject; iç içe formlar dâhil
  • scn ya da SCN ile seçilen bir pattern; patternın kendi Resourcesu ile okunur
  • Tf ile seçilen bir Type 3 fontun CharProcsu
  • görüntü XObjectları ile satır içi görüntüler; kendi sözlüklerinin adlandırdığı renk uzayına göre
  • annotation görünüm akışları; sayfanın üstüne boyanır. Bir widgetın /AP /Nsi bir durum sözlüğü iken her durum sayılır; çünkü fieldı çevirmek, /ASin seçmediği durumu boyar

Erişilebilirliğin incelikli yarısı, içeriğin hiç adını vermediği renktir. q 0 0 10 10 re f Q hiçbir renk işleci içermez. Yine de boyar. Grafik durumunun başlangıç renk uzayı DeviceGraydir (ISO 32000-1 tablo 52); dolayısıyla dolgu, bir PDF/A OutputIntenti ya da DefaultGray yokken her bölüm altında kalibresiz olan DeviceGray siyahtır. Tarama bu yüzden, şimdiye kadar bir şeyin renk seçip seçmediğini izler: rg, k, g ve konturlu biçimleri bir cihaz uzayı seçer, cs ile CS adlandırdıklarını seçer ve herhangi bir seçimden önceye düşen bir dolgu, kontur ya da metin işleci DeviceGray kaydeder. /CS0 cs 1 0 0 /P0 scn çoktan bir uzay seçmiştir; o scn gri değildir

PDFium Componentin Delphide PDF/A cihaz rengine hükmetmeden önce yürüdüğü erişilebilir boya yolu: formlar, patternlar, Type 3 glifleri, görseller ve annotation görünüm akışları
bir renk uzayı bildirmek yetmez — yürüyüş her sayfanın ne boyadığını sayar; çıplak bir re fin başlangıç durumundan aldığı cihaz grisi dâhil

Satır içi görüntüler, renk uzaylarını ve ham örneklerini içeriğin kendisine getirir; bir tarayıcı ikisini de dikkatle okumak zorundadır. /CS bir kısaltma olabilir (G, RGB, CMYK, I) ya da [/Indexed /DeviceRGB 255 13 0 R]e çözülen bir kaynak adı olabilir; bunun tabanı sayılır. ID ile EI arasındaki baytlar keyfi ikilidir; EI görüntüyü yalnızca boşluk karakterleri arasında bitirir, yoksa sıkıştırılmış örneklerin içindeki bir rg hayalet bir işlece dönüşür

% sayfa 1: DefaultRGB kapsam içinde ve hiçbir şeyin çağırmadığı bir XObject
4 0 obj << /Type /Page /Parent 2 0 R /Contents 5 0 R
           /Resources << /ColorSpace << /DefaultRGB 9 0 R >>
                         /XObject << /Fm0 6 0 R >> >> >>
endobj
% sayfa 2: aynı içerik akışı, ColorSpace alt sözlüğü yok
7 0 obj << /Type /Page /Parent 2 0 R /Contents 5 0 R /Resources << >> >>
endobj
5 0 obj << /Length 46 >> stream
1 0 0 rg 72 72 200 100 re f
q 0 0 10 10 re f Q
endstream
endobj
6 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 50 50] /Length 24 >> stream
0 0 0 1 k 0 0 50 50 re f
endstream
endobj
9 0 obj [/ICCBased 10 0 R]
endobj

Girişteki her belirti bu parçadan düşer. /Fm0 hiçbir Do ile karşılaşmaz; onun ksi ilgisizdir. İki sayfadaki çıplak re f, onu kalibre edecek hiçbir şeyi olmayan DeviceGraydir. Sayfa 1deki rg, sayfa 1in boyadığı kaynaklardaki DefaultRGB tarafından kapsanır; sayfa 2, eşlemesi olmayan kaynaklara karşı aynı akışı koşturur, dolayısıyla aynı baytlar orada kalibresizdir. PDF/A-1b iddiası için Beklenen: pvaiMissingOutputIntent ile pvaiMissingIccProfile; sayfa 2nin RGBsi ve iki sayfanın grisi bunları sürükler. Form hiçbir katkı vermez; çağrılsaydı onun CMYKi, üstüne PDF/A-1 karıştırma yasağını da eklerdi

Default renk uzayları, boyayan kaynak sözlüğüne aittir

Default eşlemeleri, geçerli kaynak sözlüğünün ColorSpace alt sözlüğünde aranır (ISO 32000-1 §8.6.5.6); bu, onları kaynakların kendisi kadar yerel kılar; bir belgenin küresel bir defaultu yoktur. Bir görüntü XObjectının kendi Resourcesu yoktur; dolayısıyla sözlüğü /ColorSpace /DeviceCMYK diyen bir görüntü, onu çizen hangi sayfa ya da formun DefaultCMYKiyle kalibre edilir ve iki yerden çizilen aynı görüntü birinde kalibre edilip ötekinde edilmez. Form XObjectları, döşeme patternları ve Type 3 glif yordamları kendi Resourceslarını taşır; bir sayfanın DefaultCMYKi onların içine girmez, ama kendi sözlüklerindeki bir eşleme girer. PDFium Component eşlemeleri aynı şekilde kapsamlar. Hüküm, bir TPdfAValidationResult kaydı olarak döner: saptanan Conformance artı bir Issues kümesi. Bir klasörü sınıflandırmak için bu yeter

uses
  System.SysUtils, System.Classes, System.TypInfo, FPdfPdfa;

procedure ReportColorFindings(const FileName: string; Log: TStrings);
const
  ColorRules: TPdfAValidationIssues = [pvaiMissingOutputIntent,
    pvaiMissingIccProfile, pvaiMixedDeviceColorSpaces, pvaiBlendSpaceUndefined];
var
  Source: TFileStream;
  Res: TPdfAValidationResult;
  Found: TPdfAValidationIssues;
  Issue: TPdfAValidationIssue;
begin
  Source := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Res := ValidatePdfACompliance(Source);   // 0 konumundan okur
  finally
    Source.Free;
  end;
  Log.Add(ExtractFileName(FileName) + ': ' +
    GetEnumName(TypeInfo(TPdfAConformance), Ord(Res.Conformance)));
  Found := Res.Issues * ColorRules;
  for Issue in Found do
    case Issue of
      pvaiMissingOutputIntent:
        Log.Add('  reachable uncalibrated device color, no PDF/A OutputIntent');
      pvaiMissingIccProfile:
        Log.Add('  no OutputIntent with a DestOutputProfile ICC stream');
      pvaiMixedDeviceColorSpaces:
        Log.Add('  RGB/CMYK use disagrees with the intent, or PDF/A-1 paints both');
      pvaiBlendSpaceUndefined:
        Log.Add('  transparent page without a blending color space');
    end;
  if Found = [] then
    Log.Add('  device color and blending rules satisfied');
end;

pvaiMissingOutputIntent ile pvaiMissingIccProfile, yürüyüş kalibresiz cihaz rengine ulaştığında ve hiçbir PDF/A OutputIntenti yokken birlikte görünür. Tek başına bir pvaiMissingIccProfile, bir intentin var olduğunu ama profil taşımadığını gösterir; 6.2.2 onu bir PDF/A intenti olarak kabul etmez. pvaiMixedDeviceColorSpaces, hem PDF/A-1 karıştırma yasağını hem bileşen uyuşmazlığını kapsar: dört bileşenli bir intent altında kalibresiz DeviceRGB ya da üç bileşenli bir intent altında DeviceCMYK. Küme, sayfayı değil kuralı adlandırır; dolayısıyla uzun ya da birleştirilmiş bir belgede hangi sayfaların Default girdileri bildirdiğini, hangilerinin bildirmediğini karşılaştırın

Delphide iki kaynak sözlüğünden çizilen tek bir DeviceCMYK görüntü: PDFium Componentin bildirdiği gibi bir sayfada DefaultCMYK ile kalibre, bir başka sayfada kalibresiz
default renk uzayları boyayan kaynak sözlüğüne aittir; aynı görüntü bir sayfanın çizdiği yerde kalibre, bir formun çizdiği yerde kalibresiz olabilir

Şeffaf bir sayfa ne zaman kendi karışım uzayına ihtiyaç duyar?

Şeffaf bir sayfa, yalnızca belgenin hiçbir PDF/A OutputIntenti yokken kendi karışım renk uzayına ihtiyaç duyar. ISO 19005-2 6.2.10 (PDF/A-4te 6.2.9), intenti ISO 32000-1 §11.3.4 anlamında varsayılan karışım renk uzayı yapar; intentsizken şeffaflık içeren her sayfa, öznitelik sözlüğü (ISO 32000-1 tablo 147) CS içeren bir Group taşımak zorundadır. O CS de 6.2.4e tabidir; dolayısıyla sRGB bir intenti altında /DeviceCMYK olan bir sayfa grubu, eksik gibi raporlanır ve PDFium Component ikisi için de pvaiBlendSpaceUndefined kaldırır; CalRGB ya da ICCBased bir grup uzayının öyle bir bağımlılığı yoktur. PDF/A-1 bu soruya ulaşmaz; çünkü ISO 19005-1 6.4, şeffaflığı tamamen dışlar

Zor kısım, şeffaflık içerir ifadesidir. ISO 19005-2nin Ek A normatiftir ve sayfadan dışa doğru sınar; dosya genelinde bir /SMask anahtarı ya da /ca değeri sayısı başka bir soruya cevap verir. Bayt aramaları, öteki yerlerdeki şeffaflık söz dizimiyle de çarpışır: yasak geçiş eylemi /S /Trans, her /S /Transparency grubunun önüne geçer ve /Screen hem yasak bir annotation alt türü hem standart bir karışım modudur; bir ad, anahtarıyla eşleşene kadar hiçbir şey ifade etmez. Ek Ayı izleyen PDFium Component, bir sayfadan şunlardan herhangi birine ulaşıldığında onu şeffaf sayar:

  • içeriğin gs ile seçtiği ve soft mask sözlüğü, 1in altında bir ca ya da CA, ya da Normal dışında bir karışım modu taşıyan bir ExtGState; bildirilmiş ama hiç seçilmemiş olan sayılmaz
  • Do ile çağrılan ve /Groupu /S /Transparency taşıyan ya da kendi içeriği bu koşullardan birini karşılayan bir Form XObject; döşeme patternı bir form gibi hükmedilir
  • SMask akışı ya da 0dan büyük bir SMaskInData değeri taşıyan bir görüntü XObjectı
  • sayfanın metin gösterdiği bir Type 3 fontun bir glif tarifi; bir form gibi hükmedilir
  • bir annotation görünüm akışı, her widget durumu dâhil; ve annotation sözlüğünün kendisinde bir karışım modu

Gruplar ayrıca cihaz rengi kuralına geri beslenir ve burada derlem bizi düzeltti. 6.2.4.3ün veraPDF paketi, hiçbir OutputIntenti olmayan, cihaz RGBsi boyayan ve geçmesi beklenen PDF/A-4 dosyaları içerir; çünkü her sayfanın /Groupu kalibre edilmiş bir CS adlandırır. Biz yalnızca izole grupların kalibre edebileceğini varsaymıştık; çünkü izole olmayan bir grup arka planına bileşir — ve bu, sayfa grupları için yanlıştı: tablo 147, çıktı ortamına doğrudan oturtulan bir sayfanın Iden bağımsız olarak fiilen izole olduğunu kaydeder; dolayısıyla onun CSi dikkate alınır. Bir Form XObject ya da annotation görünümünde bayrak gerçekten kararı verir; pakette yalnızca /I truede ayrılan bir geç ve bir düş dosyası var. DeviceGray bir gruptan kalibrasyon almaz; çünkü 6.2.4.3 DefaultGray ya da bir intent ister ve CSi bir cihaz uzayı olan bir grubun kendisinin kalibre olması gerekir. PDFium Component bu yüzden bir sayfa grubunun /Isinin söylediğine bakmaksızın kalibre etmesine izin verir, bir form ya da görünüm grubuna yalnızca izoleken izin verir, griyi grup kalibrasyonunun dışında tutar ve bir grubun adlandırdığı cihaz uzayını yine de denetler

Delphi için PDF/A matrisi: şeffaf bir sayfanın ne zaman kendi karışım CSini istediği ve PDFium Componentin sayfa, form ile görünüm grubu kalibrasyonunu nasıl hükmettiği
bir output intent varsayılan karışım uzayıdır; bir sayfa grubu, izolasyon bayrağı her ne derse desin cihaz rengini kalibre eder, bir form grubu ise /I true ister

Her sayfada bir grup yerine tek bir OutputIntent

Kendi kodunuz arşivi yazıyorsa, belge düzeyi bir PDF/A OutputIntentile başlayın. Tek bir katalog girdisi DeviceGrayi her yerde kalibre eder, her sayfada eşleşen cihaz uzayını kapsar ve her şeffaf sayfa için varsayılan karışım uzayıdır. Sayfa grupları ile Default girdileri her biri tek bir kaynak sözlüğüne kapsamlanır ve sonradan bir birleştirmenin onlarsız eklediği sayfa, düşen sayfadır. PDF 2.0, sayfa nesnesine OutputIntents ekler (ISO 32000-2 §7.7.3.3 ile §14.11.5); PDFium Component, katalogda yokken PDF/A-4 için o sayfa düzeyi intenti kabul eder; PDF 1.4 ile 1.7 üzerine kurulu 1 ile 3 arası bölümler ise yalnızca kataloğa bakar. RGB içeriği için SaveAsPdfAToStream, PDF/A yazıcının gömülü sRGB ICC profili üzerine kurulu bir katalog intenti ekler ve çıktıyı doğrulamak, içeriğin gerçekten yalnızca RGB olup olmadığını gösterir

uses
  System.SysUtils, System.Classes, PDFium, FPdfPdfa;

function ArchiveWithSrgbIntent(const InFile, OutFile: string;
  out Remaining: TPdfAValidationIssues): Boolean;
var
  Pdf: TPdf;
  Opts: TPdfASaveOptions;
  Output: TMemoryStream;
  Check: TPdfAValidationResult;
begin
  Result := False;
  Remaining := [];
  Pdf := TPdf.Create(nil);
  Output := TMemoryStream.Create;
  try
    Pdf.FileName := InFile;
    Pdf.Active := True;
    if not Pdf.Active then
      Exit;                           // dosya açılamadı
    Opts := TPdfASaveOptions.Default;
    Opts.Conformance := pac2b;        // PDF/A-1 şeffaflığı baştan yasaklar
    // IccProfileData boş kalır: yerleşik sRGB IEC61966-2.1 profili kullanılır
    if not Pdf.SaveAsPdfAToStream(Output, Opts) then
      Exit;
    Check := ValidatePdfACompliance(Output);
    Remaining := Check.Issues;
    // Yalnızca RGB içerik için beklenen: pvaiMissingOutputIntent ile
    // pvaiBlendSpaceUndefined kalkar. pvaiMixedDeviceColorSpaces artık hiçbir
    // DefaultCMYK ile kalibre edilmeyen DeviceCMYK boyayan yolu bildirir
    if Check.IsCompliant then
    begin
      Output.SaveToFile(OutFile);
      Result := True;
    end;
  finally
    Output.Free;
    Pdf.Free;
  end;
end;

sRGB intentini atlatabilen bir pvaiMixedDeviceColorSpaces, yürüyüşün erişilebilir bir yolda DeviceCMYK raporlamasıdır; o belge, PDFium Componentin onu PDF/A-2b olarak kabul etmesinden önce onu boyayan sayfalarda bir DefaultCMYK eşlemesine ya da bir CMYK çıktı profiline ihtiyaç duyar