PDF/R, normiran kao ISO 23504-1, PDF je profil za skenirane dokumente: svaka stranica nosi točno jednu sliku trake i ništa drugo. PDFium Component provjerava ga iz Delphija, Lazaru i C++Buildera kroz ValidatePdfRCompliance, koji čita stream i vraća razinu sukladnosti uz skup konkretnih problema
Profil postoji jer su skeneri i sustavi za hvatanje dokumenata trebali cilj uži od PDF/A. Arhivski PDF može sadržavati bilo što što dio dopušta; rasterski PDF namjerno je osiromašen, tako da bilo koji sukladan čitač može prikazati ga identično, a bilo koji sukladan pisac može proizvesti ga iz snimke bez motora za autorstvo
Što PDF/R zabranjuje, a PDF/A dopušta?
Tekst, u praksi. Rasterska stranica nosi skeniranu sliku i ništa drugo, pa je fontovni resurs na stranici povreda, prijavljen kao pvriFontForbidden prema ISO 23504-1 §6.5.2. To iznenađuje ljude koji dodaju nevidljivi sloj OCR teksta za pretraživanje, što je normalna i korisna stvar u PDF/A cjevovodu, a jednostavno nije PDF/R
Odnos stranice i slike jednako je strog. §6.5.1 čini svaku stranicu točno jednom slikom trake, pa se pvriPageImageMismatch aktivira kad broj slika ne odgovara broju stranica; stranica bez slike i stranica s dvije obje su nesukladne. A pvriBadMediaBox prijavljuje stranicu čiji MediaBox nema oblik [0 0 w h] (§6.5.3), jer snimka nema razloga sjediti na pomaknutom ishodištu
uses FPdfPdfr;
var
Src: TFileStream;
Res: TPdfRValidationResult;
begin
Src := TFileStream.Create('scan-batch-0142.pdf', fmOpenRead or fmShareDenyWrite);
try
Res := ValidatePdfRCompliance(Src);
if Res.IsCompliant then
Memo1.Lines.Add('PDF/R-1 conformant')
else
begin
if pvriFontForbidden in Res.Issues then
Memo1.Lines.Add('A page names a font resource; a raster page carries no text');
if pvriPageImageMismatch in Res.Issues then
Memo1.Lines.Add('Image count does not match page count');
if pvriForbiddenImageFilter in Res.Issues then
Memo1.Lines.Add('A strip image uses an encoding outside the white list');
end;
finally
Src.Free;
end;
end;
Koja kodiranja slike su dopuštena
Četiri, a bijela lista je kratka s razlogom. §6.6 prima /CCITTFaxDecode, /DCTDecode, /JPXDecode i /FlateDecode, dvorazinski faks, JPEG, JPEG 2000 i bezgubitni deflate, koji međusobno pokrivaju svaki izlaz skenera koji je važan. Sve ostalo prijavljuje se kao pvriForbiddenImageFilter, uključujući /LZWDecode, /RunLengthDecode, /ASCII85Decode, /ASCIIHexDecode, /JBIG2Decode i /Crypt
Dvoje od tih odbijanja vrijedi razumjeti, a ne memorirati. /JBIG2Decode izvrsno komprimira dvorazinske snimke i potpuno je legalan u PDF/A, ali njegova rekonstrukcija rječnika simbola može zamijeniti vizualno slične glifove, dokumentirani način neuspjeha za skenirane znamenke, a profil čija je cijela svrha vjerna rasterska reprodukcija ne može primiti taj rizik. ASCII filtri isključeni su iz suprotnog razloga: oni nadimaju datoteku a da ne dodaju ništa što rasterski profil treba
Strukturna pravila koja se aktiviraju prije nego što se ita jedna stranica pročita
PDF/R ograničava i spremnik. pvriObjStmPresent prijavljuje stream /Type /ObjStm, koji profil zabranjuje izričito; streamovi objekata zakompliciraju jednostavno, slijedno raščlanjivanje koje rasterski čitač treba moći izvesti. pvriBadHeader prijavljuje zaglavlje izvan %PDF-1.4 do 1.7 i %PDF-2.0, a pvriEncryptVersionMismatch prijavljuje šifriranu datoteku čije zaglavlje nije %PDF-2.0, prema §6.2.3
Katalog i rječnik Info na bijeloj su listi, a ne samo provjereni. pvriProhibitedCatalogEntry i pvriProhibitedInfoEntry aktiviraju se za unose izvan dopuštenog skupa, a pvriInfoXmpMismatch aktivira se kad unos Info ne slaže se sa svojim XMP ekvivalentom. Nedostajući stream /Metadata kataloga, nedostajući /ID prikolice i odsutna oznaka podnožja %PDF-raster-1.0 svaki imaju svoj problem jednako tako
Zašto zapis opcija spremanja izostavlja Title i Author
TPdfRSaveOptions nosi Creator, Producer, CreationDate, ModDate, DocumentId i InstanceId, a namjerno nema polja za Title, Author, Subject ili Keywords. Ta su četiri unosa koje §6.4.3 zabranjuje, pa bi zapis koji bi ih izložio pozivao pozivatelje da zapišu nesukladnu datoteku kroz sukladan API
Dvije bulean opcije kontroliraju čišćenje pri pretvorbi postojećeg PDF-a. StripInfoOptionalEntries zadano je True i uklanja Title, Author, Subject, Keywords i Trapped iz izvornog rječnika Info. StripCatalogOptionalEntries također je zadano True i uklanja Names, Outlines, StructTreeRoot, OutputIntents, Lang i ostatak, ostavljajući samo bijelu listu §6.3. Postavite bilo koje na False i zadržavate unose, a gubite sukladnost, što povremeno jest ono što pozivatelj doista želi za internu datoteku
var
Opts: TPdfRSaveOptions;
Src, Dest: TFileStream;
begin
Opts := TPdfRSaveOptions.Default;
Opts.Creator := 'Capture Station 4';
Opts.Producer := 'PDFium Component';
Src := TFileStream.Create('scan-in.pdf', fmOpenRead or fmShareDenyWrite);
try
Dest := TFileStream.Create('scan-pdfr.pdf', fmCreate);
try
InjectPdfRMarkers(Src, Dest, Opts); // markers + metadata, not page content
finally
Dest.Free;
end;
finally
Src.Free;
end;
end;
Imajte na umu što ubrizgavanje oznaka ne čini: dodaje metapodatke i identifikaciju, a ne može dostaviti sadržaj stranice. Izvorna stranica koja ne nosi sliku trake i dalje će pasti na pvriPageImageMismatch nakon ubrizgavanja, jer nedostajuća slika nikad nije bio problem metapodataka
Gdje se PDF/R uklapa u cjevovod hvatanja
Koristite ga tamo gdje je isporuka sama snimka i gdje je vjernost cijeli ugovor, dokazno snimanje, hvatanje čekova i doznaka, arhive inženjerskih crteža sa skenera velikog formata. Koristite PDF/A čim dokument treba pretraživ tekst, označavanje, ugrađene privitke ili bilo što drugo što rasterski profil skida
Uobičajen i izvediv raspored jest proizvesti oba: PDF/R original koji se nikad ne mijenja i PDF/A derivat sa slojem OCR-a za pronalaženje. Validatori su neovisni, pa isti serijski posao može provjeriti svaki artefakt protiv profila koji doista traži. Za arhivsku stranu tog para, pogledajte bilješke o arhivskoj sukladnosti PDF/A i provjeri preleta valjanosti PDF/A, a za izlaz orijentiran na tisak prikaz provjere dokumenata PDF/X spremnih za tisak
PDFium Component donosi PDFium motor u Delphi, C++Builder i Lazarus s VCL API-jem i validatorima sukladnosti za PDF/A, PDF/X, PDF/E, PDF/UA i PDF/R. Na stranici proizvoda PDFium Component navedeni su podržani standardi i IDE verzije