Teknik Makale

PDFlibPas ile Delphi'de PDF/E-1 Mühendislik Belgeleri

PDF/E-1, mühendislik belgeleri için arşiv profili budur ve PDFlibPas, onu SetPDFEMode ile açtığınız bir author mode artı içerik akışlarını operator operator okuyan sınırları çizilmiş bir preflight olarak uygular. Profil, etiketi değişmiş bir PDF/A değildir: kendi kimlik namespace'i, kendi yaşam döngüsü metadata zorunluluğu ve içerik doğrulamasını şimdiye kadar karşılaştığınız her arşiv profilinden daha katı yapan bir kuralı vardır

Profilin var olma nedeni mühendislik çıktılarıdır. Yirmi yıl sonra okunabilir ve kanıtlanabilir biçimde değişmemiş olması gereken, revizyon geçmişi hayatta kalan ve rengi diğer binadaki plotter üzerinde aynı anlama gelen bir çizim seti. Bu gereksinimler, talepleri çoğunlukla sayfa içeriğinin dışında, metadata ile renk yönetiminde duran bir spesifikasyon üretir; genel amaçlı bir PDF yazıcısının tam da bunları yanlış yaptığı yerdir

Kendi kimliği; PDF/A üzerinde bir varyasyon değil

Doğru kurulması gereken ilk şey, PDF/E-1 kimliğinin PDF/A ya da PDF/X kalıbının uyarlanmasıyla üretilemeyeceğidir. Profil ayrı bir XMP namespace kullanır, http://www.aim.org/pdfe/ns/id/; sürüm değeri iki yerde görünmek zorundadır: bir document information girdisi ve namespace nitelemeli XMP özelliği olarak. Yalnızca XMP özelliğini ya da yalnızca bilgi girdisini yazmak, niyeti taşıyan ama doğrulamadan kalan bir dosya üretir

Output intent de aynı derecede özgül bir şekle sahiptir. PDF/E-1, ISO_PDFE1 alt tür kimliğine sahip gömülü bir ICC profili ister ve profilin bileşen sayısı, belgenin gerçekte kullandığı cihaz renk ailesiyle eşleşmelidir. Son unsur, uygulamaların sessizce yanlış gittiği yerdir; çünkü bu madde, intent'in baştan seçilip sonra unutulamayacağı anlamına gelir

Cihaz rengi neden tüm belgeyi dolaşan bir tarama ister?

Çünkü renk alanları, sayfa düzeyi bir taramanın asla ulaşamadığı resource dictionary'lerde saklanır. PDF/E-1, DeviceRGB ile DeviceCMYK'yi bir belge için birbirini dışlayan aileler olarak ele alır; profili doğrulamak, dosyadaki her şeyin kullandığı her cihaz renk alanını bilmek demektir. Bir form XObject'in kendi kaynakları vardır. Bir pattern'in de, bir imgenin de. Bir sayfa içindeki form XObject içindeki tiling pattern üç seviye derindedir ve yalnızca en üst düzey sayfa kaynaklarını kontrol eden bir doğrulayıcı, her iki aileyi de kullanan bir belgeyi geçirebilir

Bu yüzden tarama, sayfaları, formları, imgeleri ve pattern'leri tek bir dolaşım olarak yürürken renk alanlarını kaydeder ve ancak ondan sonra belgenin tutarlı olup olmadığına ve output intent'in eşleşip eşleşmediğine karar verir. Aynı akıl, preflight mimarisini genel olarak da yönetir: kısmi dolaşım yanlış geçişler üretir ve bir conformance kontrolünde yanlış geçiş, hiç kontrol olmamasından kötüdür; çünkü kanıt olarak kayda geçer

var
  Lib: TPDFlib;
  Diag: WideString;
begin
  Lib := TPDFlib.Create(nil);
  try
    Lib.LoadFromFile('assembly-drawings.pdf');

    if Lib.SetPDFEMode(1) = 0 then
      raise Exception.Create('PDF/E author mode was refused');

    // Author mode, yaşam döngüsü metadata'yı her kayıtta güncel tutar.
    // Kaydetmeden önce belgenin kendi kapısından geçip geçemeyeceğini sorun
    if not Lib.PDFEReadyForSave then
    begin
      Diag := Lib.GetPDFEDiagnostics;
      Writeln('PDF/E blockers: ', Diag);
      Exit;
    end;

    Lib.SaveToFile('assembly-drawings-pdfe.pdf');
  finally
    Lib.Free;
  end;
end;

Yaşam döngüsü metadata her kayıt başına bir yükümlülüktür

PDF/E-1, bir belge tanımlayıcısından fazlasını ister. Asgari set, media management belge tanımlayıcısını, bir sürüm tanımlayıcısını, bir rendition sınıfını, oluşturma zamanını, değiştirme zamanını, metadata zamanını ve bir başlığı kapsar. Bu bir revizyon takibi söz dağarıdır ve var olma nedeni, mühendislik çıktısının bir kez yazılan değil yeniden yayımlanan bir şey olması beklentisidir

Bir uygulama için sonucu şudur: bu alanlar belge oluşturulurken ayarlanamaz. Modu açtığınız anda değiştirme zamanı yazılırsa ve belge sonrasında düzenlenirse, XMP anlık görüntüsü ile belgenin gerçek durumu birbirinden ayrışır ve ikisini karşılaştıran bir doğrulayıcı, kimsenin istemediği bir tutarsızlık bildirir. Author mode bu yüzden alanları her kayıttan hemen önce eşzamanlar; böylece metadata, mod açıldığı anda var olan baytları değil yazılmak üzere olan baytları tarif eder

Bu, conformance metadata için genel bir ilkedir ve PDF/E'den bağımsız olarak da söylemeye değer: türetilmiş metadata, düzenleme yoluna değil kayıt yoluna aittir. Belge durumundan hesaplanan her alan, durumun dondurulduğu anda yeniden hesaplanmak zorundadır; yoksa geçersiz kılınması olmayan bir önbellektir

PDFlibPas PDF/E-1 şeması: sayfa, form XObject, tiling pattern ve imge resource dictionary'lerini dolaşıp DeviceRGB ve DeviceCMYK ailelerini toplayan, tutarlılığı yargılamadan önce tüm belgeyi kapsayan cihaz rengi taraması; yanında author mode'un her kayıttan hemen önce yeniden eşzamanladığı, XMP anlık görüntüsünün yazılacak baytlarla eşleşmesini sağlayan yaşam döngüsü metadata alanları
Renk tutarlılığı ancak tek bir dolaşım her resource dictionary'ye ulaştıktan sonra yargılanabilir ve türetilmiş yaşam döngüsü metadata, mod açıldığında değil belge durumu dondurulduğu anda yeniden hesaplanır

İçerik doğrulamasını katı yapan kural

PDF/E-1, uyumluluk bölümü operatorlerinin bilinmeyen içeriği yutmasına izin vermez. Sıradan PDF'te BX ve EX, tüketicinin tanımadığı operatorleri yok saymak zorunda olduğu bir bölgeyi kuşatır; bu, üreticinin eski okuyucuları kırmadan daha yeni yapılar yazmasını sağlayan kaçış kancasıdır. PDF/E-1 altında bu kaçış kapalıdır; dolayısıyla preflight'ın tanımadığı her operator, bir uyumluluk bölümünün içinde olup olmamasına bakılmaksızın koşulsuz bildirilir

Bir doğrulayıcı üzerindeki etkisi büyüktür. Anlamadığı bölgeleri atlayamaz; bu da operand çözümleyicisinin her içerik akışındaki her operatorü gerçekten çözümlemek zorunda olduğu anlamına gelir. Sınırların devreye girdiği yer burasıdır. Dolaşım, 128 iç içe seviye, bir milyon nesne ve 64 MiB içerikle sınırlıdır ve bu limitler performans ayarı değildir. Düşmanca ya da yalnızca bozuk bir dosya, özyinelemeli bir doğrulayıcıyı stack overflow'a çeviren döngülü bir nesne grafiği ya da iç içe geçme derinliği sunabilir; limitler, bir doğrulama geçişinin denial-of-service vektörüne dönüşmesini önleyen şeydir. Aynı savunmacı duruş güvensiz PDF'leri güvenle çözümleme makalesinde tarif edilir

// Üretmediğiniz bir dosyanın bağımsız doğrulaması; dosyayı bir belge
// örneğine yüklemeden yapılır
var
  Issues: TStringList;
  Stream: TFileStream;
  I: Integer;
begin
  Issues := TStringList.Create;
  Stream := TFileStream.Create('incoming.pdf', fmOpenRead or fmShareDenyWrite);
  try
    if CheckCompliancePDFE(Stream, '', 0, Issues) = 0 then
      for I := 0 to Issues.Count - 1 do
        Writeln('PDF/E: ', Issues[I]);
  finally
    Stream.Free;
    Issues.Free;
  end;
end;

Kayıt kapısının onardıkları ve reddettikleri

Kapı işini iki aşamaya böler ve bu bölünme kendi başına kullanılabilir bir tasarım fikridir. Önce güvenle onarılabilir şeyleri normalize eder: annotation baskı bayrakları, text annotation'lardaki zoom yasak ile döndürme yasak bayrakları ve form sözlüğündeki görünüm üretim bayrağı. Bunlar, profil altında tek bir doğru değeri olan ve bilgi taşımayan ayarlardır; sessizce düzeltmek doğrudur, bunların üzerinden reddetmek ise inatçılık olurdu

Ardından, belgenin ne anlama geldiğini değiştirmeden onarılamayan kısıtları kontrol eder: sürüm, kimlik, şifreleme, output intent, cihaz rengi tutarlılığı ve dinamik form içeriğinin varlığı. Bunlardan herhangi birinde kalan bir belge reddedilir; çünkü yazar adına bir output intent icat etmek ya da renk ailesi seçmek, doğrulamayı geçen ama içeriği yanlış temsil eden bir dosya üretir

Delphi için PDFlibPas PDF/E-1 kayıt kapısı şeması: 128 iç içe seviye, bir milyon nesne ve 64 MiB sınırları altında her içerik akışı operatorünü tarayan sınırları çizilmiş preflight; annotation baskı, zoom ve döndürme bayraklarını sessizce onarar; yanlış sürüm, kimlik, şifreleme, output intent, cihaz rengi ya da dinamik form içeriğini reddeder ve engelleri GetPDFEDiagnostics ile bildirir
Kapı yalnızca bilgi taşımayan şeyleri sessizce onarır, bir onarımın çarpıttığı her kısıtı reddeder ve tek bir bayt diske varmadan reddi GetPDFEDiagnostics üzerinden bir engel listesine çevirir

Kaydetmeden önce tanılamaları GetPDFEDiagnostics üzerinden geri okumak, o reddi başarısız bir işlem yerine üzerinde işlem yapılabilir bir listeye çevirir. Toplu bir işlem hattında her belge için çağırın, engelleri dosya başına günlüğe yazın ve kalanları bir insanın baktığı kuyruğa yönlendirin. Bu, istisna fırlatan bir kayıttan çok daha faydalıdır; çünkü engeller genellikle kümeleşir: aynı eksik output intent yüzünden kalan kırk belge tek bir düzeltmedir, kırk değil

Arşiv profilleri arasında seçim

Çıktı, revizyon yaşam döngüsü olan mühendislik belgeleriyse ve özellikle çıktı plotter'lara ve geniş formatlı yazıcılara giderken cihaz rengi tutarlılığı önemliyse doğru hedef PDF/E-1'dir. Amaç genel olarak belgelerin uzun vadeli okunabilirliğiyse doğru hedef PDF/A'dır ve doğrulayıcı desteği en geniş profil odur. İkisi birbirinin yerine geçmez ve bir belge birini sağlayıp ötekini geçemeyebilir

Delphi için PDF/E-1 ve PDF/A arşiv profillerini karşılaştıran PDFlibPas karar şeması: kendi XMP namespace'i ve ISO_PDFE1 output intent'i ile revizyon yaşam döngülü mühendislik çıktıları, plotter rengi ve sözleşmesel doğrulama için PDF/E-1; doğrulayıcı desteği en geniş olan, genel uzun vadeli okunabilirlik için PDF/A
Uçta dosyayı kimin doğrulayacağından başlayın: profiller farklı kimlik, metadata ve renk güvenceleri ister ve bir belge birini sağlarken ötekini geçemeyebilir

Seçim yapıyorsanız, uçta dosyayı kimin doğrulayacağından başlayın. PDF/A doğrulama araçları her yerdedir ve PDFlibPas'taki karşılık gelen preflight, PDF/A ve PDF/UA preflight makalesinde anlatılır. PDF/E doğrulaması daha özeldir ve genellikle varsayılan değil sözleşmesel bir gerekliliktir. Mevcut bir arşiv, hiç yazılmadığı bir profile getirilmek zorundaysa izlenecek kalıp, metadata onarımıyla PDF/A'ya dönüştürme makalesindeki metadata onarım yoludur ve aynı şekil burada da geçerlidir: kimliği belirle, güvenli olanı onar, kalanını listeyle reddet

Author mode, sınırları çizilmiş içerik preflight'ı ve bağımsız compliance kontrolü, PDFlibPas Delphi PDF kütüphanesi ile birlikte gelir; böylece bir belge profil altında üretilip sonrasında ayrı bir kod yolu üzerinden bağımsız doğrulanabilir ve bir conformance iddiası için güvenilmeye değer tek düzen de budur