Artikel Teknis

Memvalidasi Dokumen Hasil Pindai PDF/raster di Delphi

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