PDF/R, distandardisasi sebagai ISO 23504-1, adalah profil PDF untuk dokumen yang dipindai: setiap halaman membawa tepat satu gambar strip dan tidak ada yang lain. PDFium Component memvalidasinya dari Delphi, Lazarus dan C++Builder melalui ValidatePdfRCompliance, yang membaca stream dan mengembalikan level kepatuhan plus serangkaian issue konkret
Profil itu ada karena pemindai dan sistem penangkapan dokumen membutuhkan target yang lebih sempit daripada PDF/A. PDF arsip boleh berisi apa pun yang diizinkan bagian; PDF raster sengaja dilucuti, sehingga reader yang patuh apa pun dapat menampilkannya secara identik dan writer yang patuh apa pun dapat menghasilkannya dari pindai tanpa engine authoring
Apa yang dilarang PDF/R yang diizinkan PDF/A?
Teks, pada praktiknya. Halaman raster membawa gambar yang dipindai dan tidak ada yang lain, jadi sumber font pada halaman adalah pelanggaran — dilaporkan sebagai pvriFontForbidden di bawah ISO 23504-1 §6.5.2. Itu mengejutkan orang yang menambahkan lapisan teks OCR tak terlihat untuk kemudahan pencarian, yang merupakan hal yang normal dan berguna untuk dilakukan dalam workflow PDF/A dan bukan PDF/R
Hubungan halaman-ke-gambar sama ketatnya. §6.5.1 membuat setiap halaman tepat satu gambar strip, jadi pvriPageImageMismatch muncul ketika jumlah gambar tidak cocok dengan jumlah halaman — halaman tanpa gambar dan halaman dengan dua keduanya tidak patuh. Dan pvriBadMediaBox melaporkan halaman yang MediaBox-nya tidak memiliki bentuk [0 0 w h] (§6.5.3), karena pindai tidak punya alasan untuk berada di asal offset
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;
Encoding gambar mana yang diizinkan
Empat, dan daftar putih pendek karena alasan. §6.6 mengizinkan /CCITTFaxDecode, /DCTDecode, /JPXDecode dan /FlateDecode — fax bilevel, JPEG, JPEG 2000, dan deflate lossless, yang di antaranya mencakup setiap output pemindai yang penting. Yang lainnya dilaporkan sebagai pvriForbiddenImageFilter, termasuk /LZWDecode, /RunLengthDecode, /ASCII85Decode, /ASCIIHexDecode, /JBIG2Decode dan /Crypt
Dua dari penolakan itu patut dipahami alih-alih dihafal. /JBIG2Decode mengompresi pindai bilevel sangat baik dan sepenuhnya legal dalam PDF/A, tetapi rekonstruksi kamus simbolnya dapat menggantikan glyph yang serupa secara visual — mode kegagalan yang terdokumentasi untuk digit yang dipindai — dan profil yang seluruh tujuannya adalah reproduksi raster yang setia tidak dapat mengakui risiko itu. Filter ASCII dikecualikan karena alasan berlawanan: mereka menggembungkan file tanpa menambahkan apa pun yang dibutuhkan profil raster
Aturan struktur yang muncul sebelum satu halaman pun dibaca
PDF/R juga membatasi kontainer. pvriObjStmPresent melaporkan stream /Type /ObjStm, yang dilarang profil secara mutlak — object stream mempersulit parse berurutan sederhana yang seharusnya bisa dilakukan reader raster. pvriBadHeader melaporkan header di luar %PDF-1.4 hingga 1.7 dan %PDF-2.0, dan pvriEncryptVersionMismatch melaporkan file terenkripsi yang headernya bukan %PDF-2.0, per §6.2.3
Catalog dan dictionary Info di-daftar-putihkan, bukan sekadar diperiksa. pvriProhibitedCatalogEntry dan pvriProhibitedInfoEntry muncul untuk entri di luar himpunan yang diizinkan, dan pvriInfoXmpMismatch muncul ketika entri Info tidak setuju dengan padanannya XMP. Stream /Metadata catalog yang hilang, /ID trailer yang hilang, dan penanda footer %PDF-raster-1.0 yang absen masing-masing memiliki issue tersendiri juga
Kenapa record opsi simpan menghilangkan Title dan Author
TPdfRSaveOptions membawa Creator, Producer, CreationDate, ModDate, DocumentId dan InstanceId, dan sengaja tidak punya field untuk Title, Author, Subject atau Keywords. Keempat itu adalah entri yang dilarang §6.4.3, jadi record yang mengeksposnya akan mengundang pemanggil untuk menulis file tidak patuh melalui API yang patuh
Dua opsi boolean mengontrol pembersihan saat mengonversi PDF yang ada. StripInfoOptionalEntries default True dan menghapus Title, Author, Subject, Keywords, dan Trapped dari dictionary Info sumber. StripCatalogOptionalEntries juga default True dan menghapus Names, Outlines, StructTreeRoot, OutputIntents, Lang dan selebihnya, menyisakan hanya daftar putih §6.3. Setel salah satu ke False dan Anda mempertahankan entri — dan kehilangan kepatuhan, yang kadang adalah apa yang asli diinginkan pemanggil untuk file internal
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;
Perhatikan apa yang tidak dilakukan injeksi marker: ia menambahkan metadata dan identifikasi, dan tidak dapat menyediakan konten halaman. Halaman sumber yang tidak membawa gambar strip tetap akan gagal pvriPageImageMismatch setelah injeksi, karena gambar yang hilang tidak pernah menjadi masalah metadata
Di mana PDF/R cocok dalam pipeline penangkapan
Gunakan di mana deliverable adalah pindai itu sendiri dan fidelity adalah seluruh kontrak — pencitraan evidensier, penangkapan cek dan remitensi, arsip gambar engineering dari pemindai format besar. Gunakan PDF/A sebagai gantinya saat dokumen membutuhkan teks yang dapat dicari, penandaan, lampiran tertanam atau apa pun lagi yang dilucuti profil raster
Susunan yang umum dan dapat dikerjakan adalah memproduksi keduanya: asli PDF/R yang tidak pernah berubah, dan turunan PDF/A dengan lapisan OCR untuk pengambilan. Validator independen, sehingga pekerjaan batch yang sama dapat memeriksa setiap artefak terhadap profil yang benar-benar diklaimnya. Untuk sisi arsip dari pasangan itu, lihat catatan tentang kepatuhan arsip PDF/A dan validasi preflight PDF/A, dan untuk output berorientasi cetak panduan memvalidasi dokumen PDF/X siap cetak
PDFium Component membawa engine PDFium ke Delphi, C++Builder dan Lazarus dengan API VCL dan validator kepatuhan untuk PDF/A, PDF/X, PDF/E, PDF/UA dan PDF/R — halaman produk PDFium Component mencantumkan standar dan versi IDE yang didukung