PDF/A ve PDF/UA, birbiriyle hiç ilgisi olmayan iki soruyu yanıtlar ve onları tek bir erişilebilirlik-ve-arşivleme onay kutusu gibi ele almak, bozuk dosyaların bir uyumluluk etiketi takarak arşive ulaşmasının yoludur. PDF/A, bir dosyanın yirmi yıl sonra hâlâ sadakatle render edilip edilmeyeceğini sorar. PDF/UA ise yardımcı teknolojinin onu bugün okuyup okuyamayacağını sorar. Bir belge birini soğukkanlılıkla geçip diğerinde başarısız olabilir, bu yüzden tek dürüst hüküm ikisini de çalıştırmaktan ve bunları dosya yazılmadan önce çalıştırmaktan gelir, aşağı akıştaki bir sistem meta verisine gömülü uygunluk tanımlayıcısına güvendikten sonra değil. O tanımlayıcı kendi kendine yapılmış bir beyandır. Biçimde onun doğru olmasını gerektiren hiçbir şey yoktur ve XMP'ye standarda karşı doğrulama yapmadan "PDF/A-1b" yazan bir uygulama, yalnızca etiketi okuyan her tüketiciye uyumlu görünen bir dosya üretir. losLab PDF Library (PDF Library for Delphi), her iki doğrulayıcıyı da kütüphanenin içine kurarak Delphi ve C++Builder için bu boşluğu kapatır; bu yüzden kontrol, ayağa kaldırılacak hiçbir harici servis olmadan süreç içinde çalışır
Dosyaları zıt nedenlerle başarısız kılan iki standart
ISO 19005 (PDF/A), bir yeniden üretim sözleşmesidir. Uyumlu bir dosyanın, onu üreten sistemi hiç görmemiş bir yazılım üzerinde onlarca yıl sonra özdeş biçimde render edilmesi gerekir, bu yüzden kurallar dış bağımlılıklara saldırır: her yazı tipi gömülü, renk gömülü bir ICC OutputIntent'e sabitlenmiş veya aygıttan bağımsız bir uzayda ifade edilmiş, PDF/A-1'de şifreleme yok, JavaScript yok, belge bilgi sözlüğüyle uyuşan XMP meta verisi. ISO 14289 (PDF/UA) ise bunun yerine bir anlambilim sözleşmesidir. Yardımcı teknolojinin belgeyi dolaşıp anlamla çıkması gerekir; bu da tamamen farklı bir katmanda yaşar: eksiksiz bir yapı ağacı, figürlerde alternatif metin, görüntüleme için ayarlanmış bir belge başlığı, atlanmayan başlık düzeyleri, sayfa ekrandan gittikten sonra da hayatta kalan tablo başlığı ilişkileri
İki standart farklı katmanları denetlediği için, sizi ısıran dosyalar aralarında oturanlardır. Arşiv açısından kusursuz bir belge bir ekran okuyucuya karşı sessiz kalabilir. Güzelce etiketlenmiş bir belge, on yıl içinde var olmayacak bir masaüstü yazı tipine başvurabilir. Kamu sektörü yayıncılığı, her iki gereksinimin de aynı anda birden düştüğü olağan yerdir ve oradaki bir işlem hattı bunları tek bir kapıya çökeltemez. Bulgular farklı kişilere gider. Gömülü olmayan yazı tipleri, PDF'i üreten koddaki bir kusurdur, eksik alternatif metin ise içerik şablonlarının sahibine aittir ve ikisini karıştıran bir rapor sadece iki kez iletilir
PDF/A'nın hangi bölümünü hedeflediğiniz, onu tutturup tutturmadığınız kadar önemlidir. PDF/A-1, PDF 1.4'e dondurulmuştur ve modern raporlama çıktısının hiç düşünmeden başvurduğu şeffaflığı ve JPEG2000'i reddeder. PDF/A-2 (ISO 32000-1 üzerine kurulu ISO 19005-2), ikisini de kabul eder ve yeni bir arşiv için akla yatkın varsayılandır. PDF/A-3 daha ileri gider ve düzenlenmiş e-fatura biçimlerinin dayandığı, herhangi bir türden gömülü dosyaya izin verir. 2026'da hâlâ PDF/A-1b üzerinde standartlaşan bir ekip, genellikle birinin on beş yıl önce yazdığı bir gereksinimi taşımaktadır ve hedef bölümü yeniden müzakere etmek, çoğu zaman sistemin ürettiği her grafikten şeffaflığı sökmekten daha ucuzdur
Alım anında yapılandırılmış bulgular
Düz API giriş noktası, PDF/A için 1, PDF/UA için 2 test seçiciyle CheckFileCompliance'dır. Öğeleri satır başına bir bulgu olan bir dize listesi tanıtıcısı döndürür ve bu, otomatik bir kapının gezmek isteyeceği tam biçimdir:
function GateArchiveUpload(Pdf: TPDFlib; const FileName: string): Boolean;
var
ListId, I: Integer;
begin
ListId := Pdf.CheckFileCompliance(FileName, '', 1, 0); // 1 = PDF/A
if ListId = 0 then
begin
// 0, "bulgu yok" YA DA "dosya okunamıyor" anlamına gelir -- geçmeden önce ayırt edin
Result := Pdf.LastErrorCode = 0;
Exit;
end;
for I := 0 to Pdf.GetStringListCount(ListId) - 1 do
LogFinding(FileName, Pdf.GetStringListItem(ListId, I));
Pdf.ReleaseStringList(ListId);
Result := False;
end;
İki ayrıntı, bunun gözetimsiz çalışıp çalışmayacağına karar verir. Birincisi, iki zıt şey anlamına gelen bir dönüş değeridir. CheckFileCompliance, dosya tam olarak uyumlu olduğunda da, dosya hiç açılamadığında da 0 döndürür, çünkü dahili olarak boş bir sonuç listesi her iki durumda da 0'a çöker. 0'ı geçiş olarak okuyan bir kapı, bozuk yüklemeleri doğrudan arşive sallayarak sokar; bu yüzden yukarıdaki kapının yaptığı gibi, sıfıra güvenmeden önce LastErrorCode ile ayırt edin. İkincisi, dosyanın yaşam döngüsünde nerede olduğuyla ilgilidir. Denetleyici, tam belge modeli yerine kütüphanenin akış okuyucusu üzerinde çalışır, dosyayı doğrudan okuma paylaşımıyla açar ve LoadFromFile'ı hiç çağırmaz; bu yüzden bir nesne ağacı kurmadan çok gigabaytlık girdiyi çiğneyebilir. Başka bir süreç dosyayı hâlâ yazma için tutarken aynı akış açma başarısız olur ve devam eden bir yükleme tam olarak bu durumdur. Aktarım bittikten sonra kapıdan geçirin
Akış tasarımı, yük altında yine kendini gösterir. Her kontrol, girdisini salt okunur açar ve onu okuma için paylaşır; bu yüzden bir belge kümesi denetimi, işçi başına bir TPDFlib örneğiyle ve aralarında hiçbir çekişme olmadan işçi iş parçacıkları veya süreçleri arasında ölçeklenir. Disiplin gerektiren kaynak tanıtıcının kendisidir. CheckFileCompliance'tan gelen her sıfır olmayan sonuç, ReleaseStringList'i çağırana kadar ayrılmış kalır ve onları serbest bırakmayı unutan uzun süre çalışan bir kapı çökmez, sadece birileri nedenini araştırana kadar belleği yavaşça kanatır
İnsanlar için raporlar, derleme kapıları için farklar
Bir bulgu listesi, bir kapı için doğru biçimdir ama şablon ekibine bir e-posta için yanlış biçimdir. CreatePreflightReport, aynı analizi okunabilir düzyazı olarak oluşturur, CreatePreflightReportEx bir rapor biçimi seçicisi ekler ve SavePreflightReport, raporun teslim edilen belge paketinin içinde seyahat edebilmesi için onu diske yazar. Birçok arşivsel sözleşme, o raporu yalnızca dahili bir eser değil, kendi başına bir teslim edilebilir yapar
Bu ailenin sessizce yerini kazanan üyesi ComparePreflightReports'tur. Uyumluluk, diğer herhangi bir davranış parçası gibi bir regresyon yüzeyidir. Bir şablon ayarı, yeni lisanslanmış bir kurumsal yazı tipi veya bir kütüphane yükseltmesi, her biri bir önceki sürümde olmayan bir bulguyu ortaya çıkarabilir ve hiçbiri kendini duyurmaz. Temsili bir belge kümesi için altın raporları sürüm kontrolü altında tutun, her değişiklikten sonra onları yeniden üretin ve farkı hesaplamak için ComparePreflightReports'u çalıştırın. Boş bir fark, saklamaya değer bir sürüm eseridir. Sürpriz bir bulgu derlemeyi başarısız kılar; bu da onu denetimden çok daha ucuza keşfedeceğiniz bir yerdir
İlk çalıştırmada geçen çıktı üretmek
Ön kontrol, başka yerden gelen dosyalarda kendini kanıtlar. Kendi kodunuzun ürettiği belgeler için, ihlalleri üretimden sonra bulup geri yamalamak dolambaçlı yoldur. PDF Library for Delphi, her standart için üretim tarafı bir mod taşır ve aynı belge için ikisini birden açabilirsiniz:
var
Pdf: TPDFlib;
Diag: WideString;
begin
Pdf := TPDFlib.Create;
try
Pdf.NewDocument;
Pdf.SetPDFAMode(1);
Pdf.LoadOutputIntentProfile('sRGB-IEC61966-2.1.icc', 'RGB');
Pdf.SetPDFUAMode('en-US');
Pdf.SetInformation(1, 'Quarterly Statement'); // /Title: PDF/UA için gereklidir
// ... etiketli içeriği burada çiz ...
Diag := Pdf.GetPDFUADiagnostics;
if Diag <> '' then
Writeln('fix before shipping: ', Diag);
Pdf.SaveToFile('statement.pdf');
// önem taşıyan ön kontrol, kaydedilen dosya üzerinde çalışır:
Writeln(Pdf.CreatePreflightReport('statement.pdf', '', 1, 0));
finally
Pdf.Free;
end;
end;
Tuzak kayıt anında gizlenir. Uygunluk onarımlarının birkaçı, modu etkinleştirdiğinizde değil, belge serileştirilirken gerçekleşir: açıklamalarda yazdırma bayrağını zorlamak, PDF/A-3 gömülü dosyaları için varsayılan AFRelationship'ı yazmak, PDF/UA için sekme sırasını ve form alanı açıklamalarını normalleştirmek. Bellekte oturan belge, diske inen belgeyle bayt bakımından özdeş değildir, bu yüzden bir anlam ifade eden tek ön kontrol hükmü, kaydedilen dosyadan hesaplanandır. statement.pdf'in kendisini doğrulayın. Uyumluluğu hâlâ bellekteki nesneden çıkarsamayın, çünkü yargılayacağınız baytlar gönderdiğiniz baytlar değildir
Görsel belgenin yanında makine tarafından okunabilir XML taşıyan fatura senaryoları, PDF/A-3 üzerine kurulu ZUGFeRD ve Factur-X örüntüsünü izler. Bunlar, eki ilişkisini SetPDFA3DefaultAFRelationship ile açıkça ayarlamalıdır, çünkü ISO 19005-3, her gömülü dosyanın belgeye göre rolünü beyan etmesini gerektirir. Ayarsız bırakırsanız gömülü XML, doğrulayıcının fark ettiği, belirtilmiş bir amacı olmayan sadece bir blob'dur
Bağımsız hakemler: veraPDF ve Acrobat
Bir üretici kendi çıktısının tek yargıcı olmamalıdır. PDF Library for Delphi denetleyicileri size süreç içinde hızlı, yapılandırılmış hükümler verir; bu, sıcak yolda istediğiniz şeydir, ama arşivsel bir parti için sürüm kapısı yine de çıktıyı ekibinizden kimsenin yazmadığı bir doğrulayıcıdan geçirmelidir. veraPDF, PDF/A için topluluk tarafından bakımı yapılan referans uygulamadır ve çoğu arşivin kabul kriterlerinde adlandırdığı araçtır, bu yüzden eşleşilecek olan odur. Acrobat'ın preflight profilleri, veraPDF ile süreç içi kontrol anlaşmazlığa düştüğünde yararlı bir hakem bozucudur. Doğrulayıcı adını ve sürümünü her saklanan raporun yanına kaydedin. Bir dosyanın veraPDF'i geçtiği iddiası, aracı geçirdiği derleme numarası olmadan çok az şey söyler, çünkü araç sürümler arasında kurallarını sıkılaştırır
Doğrulayıcılar standartların sınırlarında gerçekten anlaşmazlığa düşer ve düştüklerinde cevap sevdiğiniz aracı seçmek değildir. Dosyayı, anlaşmazlığı hâlâ tetikleyen minimal bir örneğe küçültün ve onu standart metnine karşı okuyun. Bunun bir saati genellikle iki şeyden birini ortaya çıkarır: üst kaynağa bildirilmeye değer gerçek bir araç hatası veya ekibinizin yanlış okuyageldiği ve bir sonraki kişinin yeniden tartışmaması için uyumluluk notlarına yazması gereken bir madde
Şifrelenmiş girdi bir kısayol alır. Her iki denetleyici de bir parola bağımsız değişkeni alır, ama bir şifreleme sözlüğü olan bir PDF/A-1 dosyası zaten uyumsuzdur, çünkü ISO 19005-1 şifrelemeyi doğrudan yasaklar; bu yüzden şifrelenmiş bir gönderim, herhangi bir daha derin analiz çalışmadan geri çevrilebilir. Bir şifreleme sözlüğünün gerçekte neye izin verdiğini çözmek, PDF şifreleme ve izin denetimi makalesinde ele alınan kendi başına bir görevdir
PDF/UA bulguları neredeyse her zaman, yapı ağacının en başta nasıl yazıldığına geri izlenir ve bunun arkasındaki etiketleme teknikleri Delphi'de etiketli PDF yapı ağaçları kurma makalesinde yer alır. Aynı zamanda dijital imza da isteyen arşivler, bu kapıyı PAdES imzalama ve doğrulama iş akışıyla eşleştirmelidir. Tam ön kontrol API referansı, losLab PDF Library for Delphi ürün sayfasındadır