Saat mengembangkan solusi dokumen perusahaan, Anda pasti akan menemukan PDF yang dihasilkan oleh berbagai macam perangkat lunak, mulai dari perangkat lunak Adobe kelas atas hingga pustaka sumber terbuka yang penuh bug atau driver printer virtual. Salah satu masalah struktural paling terkenal yang akan Anda hadapi adalah PDF "referensi hibrida".
Dalam artikel ini, kami akan menjelaskan apa itu referensi hibrida, mengapa aplikasi office tertentu menghasilkannya, dan bagaimana cara mem-parsing dan memperbaiki struktur ini secara terprogram menggunakan Delphi dan pustaka PDF yang andal.
Evolusi Tabel Referensi Silang PDF
Untuk menemukan objek (font, gambar, halaman) dengan cepat tanpa mem-parsing seluruh file, PDF menggunakan Tabel Referensi Silang (XRef). Pada spesifikasi PDF sebelumnya (PDF 1.4 dan lebih lama), ini adalah tabel teks ASCII literal di akhir file.
Mulai dengan PDF 1.5, Adobe memperkenalkan Aliran Referensi Silang (XRefStm), yang mengompresi data referensi silang ke dalam aliran biner, mengurangi ukuran file secara signifikan. Namun, untuk kompatibilitas ke belakang dengan pembaca PDF lama, beberapa generator mulai memproduksi PDF Referensi Hibrida. File-file ini berisi tabel XRef ASCII gaya lama dan aliran XRef gaya baru.
Masalah dengan Referensi Hibrida
File hibrida secara teoretis valid, tetapi banyak generator PDF (terutama plugin "Save to PDF" lama di suite Office lama) menulisnya secara tidak benar. Bug umum adalah menulis offset byte yang salah untuk penunjuk startxref, atau membuat aliran objek yang terputus di mana tabel XRef menunjuk ke nomor pembuatan yang salah.
Jika aplikasi Delphi Anda mencoba membaca PDF hibrida yang terbentuk buruk menggunakan parser yang ketat, parser akan gagal dengan pengecualian "Tabel XRef Rusak" atau "Nomor Objek Tidak Valid".
Menangani Fallback Hibrida dengan PDFium
Mesin PDFium (awalnya dikembangkan oleh Foxit dan disumber-terbukakan oleh Google) sangat toleran terhadap PDF yang cacat. Saat mendeteksi tabel XRef yang rusak, mesin ini secara otomatis memindai file ke belakang dari EOF untuk menemukan XRefStm alternatif.
Di Delphi, saat bekerja dengan PDFium, Anda tidak perlu mem-parsing kamus cuplikan secara manual. Namun, Anda harus memeriksa peringatan struktural sehingga Anda dapat mengingatkan pengguna atau mencatat masalah tersebut.
uses
System.SysUtils, pdfium_lib;
procedure LoadAndCheckHybridPDF(const FileName: string);
var
Doc: FPDF_DOCUMENT;
LastError: ULONG;
begin
FPDF_InitLibrary();
try
Doc := FPDF_LoadDocument(PAnsiChar(AnsiString(FileName)), nil);
if Doc = nil then
begin
LastError := FPDF_GetLastError();
case LastError of
FPDF_ERR_FILE: Writeln('File not found or could not be opened.');
FPDF_ERR_FORMAT: Writeln('File not in PDF format or corrupted.');
FPDF_ERR_PASSWORD: Writeln('Password required or incorrect password.');
FPDF_ERR_SECURITY: Writeln('Unsupported security scheme.');
FPDF_ERR_XFDF: Writeln('Invalid XRef or Hybrid Reference structure.');
else
Writeln('Unknown error occurred loading PDF.');
end;
Exit;
end;
Writeln('PDF loaded successfully despite hybrid or structural anomalies.');
// Proceed with processing...
FPDF_CloseDocument(Doc);
finally
FPDF_DestroyLibrary();
end;
end;
Memperbaiki dan Membangun Ulang PDF
Jika alur kerja Anda mengharuskan meneruskan PDF ke sistem hilir yang lebih ketat (seperti RIP perangkat keras yang lebih tua), Anda perlu "meratakan" struktur hibrida. Cara paling dapat diandalkan untuk memperbaiki PDF hibrida yang rusak di Delphi adalah memuatnya ke mesin yang toleran dan melakukan operasi Simpan-Sebagai. Ini memaksa parser untuk membangun ulang tabel XRef terpadu yang bersih dari pohon objek dalam memori.
// Conceptual example using a high-level wrapper
procedure RebuildPdfStructure(const InputFile, OutputFile: string);
var
Doc: TlxPDFDocument;
begin
Doc := TlxPDFDocument.Create;
try
// Tolerant engine ignores the broken hybrid XRef and walks the objects
Doc.LoadFromFile(InputFile);
// Saving rewrites the file with a clean PDF 1.7 XRef stream
Doc.SaveToFile(OutputFile);
Writeln('PDF structure successfully rebuilt.');
finally
Doc.Free;
end;
end;
Memahami dan mengantisipasi kerusakan referensi hibrida memastikan jalur pemrosesan dokumen Anda tetap tangguh, bahkan saat berhadapan dengan file warisan yang berusia puluhan tahun.
Catatan: Resolusi referensi hibrida dan perbaikan struktural otomatis sepenuhnya didukung oleh Komponen VCL PDFium Component.