PDF/R, standardizovan kao ISO 23504-1, jeste PDF profil za skenirane dokumente: svaka stranica nosi tačno jednu traku slike i ništa drugo. PDFium Component ga validira iz Delphi, Lazarusa i C++Buildera kroz ValidatePdfRCompliance, koji čita tok i vraća nivo usklađenosti plus skup konkretnih problema
Profil postoji zato što su skeneri i sistemi za hvatanje dokumenata trebali cilj uži od PDF/A. Arhivski PDF može sadržati bilo šta što deo dozvoljava; rasterski PDF je namerno osiromašen, tako da bilo koji usaglašen čitalac može prikazati ga identično i bilo koji usaglašen pisac može proizvesti ga iz skena bez autorskog motora
Šta PDF/R zabranjuje što PDF/A dozvoljava?
Tekst, u praksi. Rasterska stranica nosi skeniranu sliku i ništa drugo, tako da je resurs fonta na stranici prekršaj — prijavljen kao pvriFontForbidden pod ISO 23504-1 §6.5.2. To iznenađuje ljude koji dodaju nevidljivi OCR tekstualni sloj za pretraživanje, što je normalna i korisna stvar u PDF/A toku rada a jednostavno nije PDF/R
Odnos stranice prema slici je podjednako strog. §6.5.1 čini svaku stranicu tačno jednom trakom slike, tako da se pvriPageImageMismatch aktivira kad broj slika ne odgovara broju stranica — stranica bez slike i stranica sa dve obe su neusaglašene. I pvriBadMediaBox prijavljuje stranicu čiji MediaBox nema oblik [0 0 w h] (§6.5.3), jer sken nema razloga da sedi na pomerajnom izvoru
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 slika su dozvoljena
Četiri, i bela lista je kratka iz razloga. §6.6 prima /CCITTFaxDecode, /DCTDecode, /JPXDecode i /FlateDecode — biventni faks, JPEG, JPEG 2000 i bezgubitni deflate, koji između sebe pokrivaju svaki izlaz skenera koji se računa. Sve ostalo se prijavljuje kao pvriForbiddenImageFilter, uključujući /LZWDecode, /RunLengthDecode, /ASCII85Decode, /ASCIIHexDecode, /JBIG2Decode i /Crypt
Dva od tih odbijanja vredi razumeti a ne memorisati. /JBIG2Decode kompresuje biventne skenove izvanredno i savršeno je legalan u PDF/A, ali njegova rekonstrukcija rečnika simbola može supstituirati vizuelno slične glifove — dokumentovani režim neuspeha za skenirane cifre — i profil čija je cela svrha veran rasterski reproduciranje ne može primiti taj rizik. ASCII filteri su isključeni iz suprotnog razloga: oni napuhuju fajl bez dodavanja ičega što rasterski profil treba
Strukturna pravila koja se aktiviraju pre nego što se ikoja stranica pročita
PDF/R ograničava i kontejner. pvriObjStmPresent prijavljuje /Type /ObjStm tok, koji profil zabranjuje potpuno — tokovi objekata komplikuju jednostavno, sekvencijalno parsiranje koje rasterski čitalac treba da može da izvede. pvriBadHeader prijavljuje zaglavlje van %PDF-1.4 do 1.7 i %PDF-2.0, a pvriEncryptVersionMismatch prijavljuje šifrovani fajl čije zaglavlje nije %PDF-2.0, po §6.2.3
Katalog i Info rečnik su na beloj listi, a ne samo provereni. pvriProhibitedCatalogEntry i pvriProhibitedInfoEntry se aktiviraju za unose van dozvoljenog skupa, a pvriInfoXmpMismatch se aktivira kad se Info unos ne slaže sa svojim XMP ekvivalentom. Nedostajući /Metadata tok kataloga, nedostajući /ID trejlera i odsutna %PDF-raster-1.0 marker-podnožje svaki imaju sopstveni problem takođe
Zašto zapis opcija snimanja izostavlja Title i Author
TPdfRSaveOptions nosi Creator, Producer, CreationDate, ModDate, DocumentId i InstanceId, i namerno nema polje za Title, Author, Subject ili Keywords. To četvoro su unosi koje §6.4.3 zabranjuje, tako da bi zapis koji ih izlaže pozivao pozivaoce da pišu neusaglašen fajl kroz usaglašen API
Dve boolean opcije kontrolišu čišćenje pri konvertovanju postojećeg PDF-a. StripInfoOptionalEntries je podrazumevano True i uklanja Title, Author, Subject, Keywords i Trapped iz izvornog Info rečnika. StripCatalogOptionalEntries je takođe podrazumevano True i uklanja Names, Outlines, StructTreeRoot, OutputIntents, Lang i ostatak, ostavljajući samo belu listu §6.3. Postavite bilo koje na False i zadržavate unose — i gubite usaglašenost, što je povremeno ono što pozivalac iskreno želi za interni fajl
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;
Primetite šta injektovanje markera ne radi: dodaje metapodatke i identifikaciju, i ne može isporučiti sadržaj stranice. Izvorna stranica koja ne nosi traku slike i dalje će pasti na pvriPageImageMismatch nakon injektovanja, jer slika koja nedostaje nikada nije bila problem metapodataka
Gde se PDF/R uklapa u liniju obrade hvatanja
Koristite ga tamo gde je isporučivo sam sken i vernost je čitav ugovor — evidentno prikazivanje slika, hvatanje čekova i uplatnica, arhive inženjerskih crteža sa skenera velikog formata. Koristite PDF/A umesto toga čim dokument treba pretraživ tekst, označavanje, ugrađene priloge ili bilo šta drugo što rasterski profil skida
Uobičajen i izvodljiv raspored jeste proizvesti oba: PDF/R original koji se nikad ne menja, i PDF/A derivat sa OCR slojem za preuzimanje. Validatori su nezavisni, tako da isti paketni posao može proveriti svaki artefakt protiv profila koji zapravo traži. Za arhivsku stranu tog para, pogledajte beleške o PDF/A arhivskoj usaglašenosti i PDF/A preflight validaciji, a za izlaz orijentisan na štampu prolaz kroz validaciju dokumenata spremnih za štampu PDF/X
PDFium Component donosi PDFium motor u Delphi, C++Builder i Lazarus sa VCL API-jem i validatorima usaglašenosti za PDF/A, PDF/X, PDF/E, PDF/UA i PDF/R — stranica PDFium Component proizvoda navodi podržane standarde i verzije IDE-a