Kada razvijate poslovna rešenja za dokumente, neizbežno ćete se susresti sa PDF-ovima generisanim od strane velikog broja različitih alata, od vrhunskog Adobe softvera do problematičnih open-source biblioteka ili virtuelnih drajvera za štampače. Jedan od najozloglašenijih strukturnih problema sa kojim ćete se suočiti je hibridni referentni PDF.
U ovom članku objasnićemo šta su hibridne reference, zašto ih određene kancelarijske aplikacije generišu i kako programski parsirati i popraviti ove strukture koristeći Delphi i pouzdane PDF biblioteke.
Evolucija tabele unakrsnih referenci PDF-a
Da bi se brzo locirali objekti (fontovi, slike, stranice) bez parsiranja cele datoteke, PDF koristi tabelu unakrsnih referenci (XRef). U ranijim PDF specifikacijama (PDF 1.4 i starije), to je bila bukvalna ASCII tekstualna tabela na kraju datoteke.
Počevši od PDF-a 1.5, Adobe je uveo tokove unakrsnih referenci (XRefStm), koji su kompresovali podatke unakrsnih referenci u binarni tok, značajno smanjujući veličinu datoteke. Međutim, radi kompatibilnosti unazad sa starijim PDF čitačima, neki generatori su počeli da proizvode hibridne referentne PDF-ove. Ove datoteke sadrže i ASCII XRef tabelu starog stila i XRef tok novog stila.
Problem sa hibridnim referencama
Hibridne datoteke su teoretski validne, ali mnogi generatori PDF-a (posebno stariji dodaci za čuvanje u PDF formatu u starijim Office paketima) ih pogrešno pišu. Česta greška je pisanje netačnog ofseta bajtova za startxref pokazivač, ili kreiranje nepovezanih tokova objekata gde XRef tabela pokazuje na pogrešan broj generacije.
Ako vaša Delphi aplikacija pokuša da pročita loše formiran hibridni PDF koristeći strogi parser, parser će prijaviti grešku sa izuzetkom za oštećenu XRef tabelu ili nevažeći broj objekta.
Obrada hibridnih rezervnih opcija pomoću PDFiuma
PDFium mehanizam (koji je prvobitno razvio Foxit, a koji je Google učinio open-source rešenjem) je veoma tolerantan na loše formirane PDF-ove. Kada detektuje oštećenu XRef tabelu, on automatski skenira datoteku unazad od kraja datoteke (EOF) da bi pronašao alternativni XRefStm.
U Delphiju, kada radite sa PDFiumom, ne morate ručno parsirati rečnike trejlera. Međutim, trebalo bi da proverite da li postoje strukturna upozorenja kako biste mogli da obavestite korisnika ili zabeležite problem.
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;
Popravljanje i obnavljanje PDF-a
Ako vaš radni tok zahteva prosleđivanje PDF-a strožem sistemu u nastavku (kao što je stariji hardverski RIP), morate poravnati hibridnu strukturu. Najpouzdaniji način za popravku oštećenog hibridnog PDF-a u Delphiju je njegovo učitavanje u tolerantan mehanizam i izvršavanje operacije za čuvanje (Save-As). Ovo primorava parser da izgradi čistu, unificiranu XRef tabelu iz stabla objekata u memoriji.
// 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;
Razumevanje i predviđanje korupcije hibridnih referenci osigurava da vaši cevovodi za obradu dokumenata ostanu otporni, čak i kada se suočite sa decenijama starim nasleđenim datotekama.
Napomena: Razrešavanje hibridnih referenci i automatske strukturne popravke su u potpunosti podržane od strane PDFium Component VCL komponente.