Technical Article

Automatizovaný preflight PDF a audit rizík pomocou PDFium

V podnikových systémoch na správu dokumentov (DMS) môže povolenie prichádzajúcim súborom PDF pochádzajúcim od tretích strán, aby sa priamo dostali do vašich archívov na ukladanie, predstavovať značné riziká. Zlyhania pri tlači, neviditeľné anomálie vo vykresľovaní, neextrahovateľný text v dôsledku chýbajúcich vlastných fontov a vložené útoky JavaScriptom môžu spôsobiť katastrofu v neskorších fázach pracovného postupu.

Zavedenie automatizovanej kontroly pred odoslaním (preflight) priamo na mieste príjmu (ingestion point) zaisťuje, že do vášho systému vstúpia iba kompatibilné a bezpečné dokumenty. V tomto článku preskúmame, ako využiť nástroj PDFium v aplikácii v Delphi na budovanie bezhlavých (headless) služieb auditu rizík.

Prečo nepoužiť iba validátory PDF/A?

Zatiaľ čo prísne validátory PDF/A sú vynikajúce pre dlhodobú archiváciu, často zlyhávajú na úplne bežných súboroch, ktoré jednoducho potrebujú prejsť bežným obchodným pracovným postupom. Vlastný nástroj na kontrolu pred odoslaním vám umožňuje definovať, čo predstavuje skutočné "riziko" pre vaše konkrétne obchodné požiadavky, bez odmietnutia legitímnych faktúr, ktorým len chýba farebný profil.

Kľúčové metriky auditu s PDFium

Pomocou obálok API PDFium môžete pri nahrávaní dokumentu overiť niekoľko kľúčových metrík.

1. Kontrola typov formulárov a JavaScriptu

Vložený JavaScript môže spúšťať škodlivé akcie alebo spôsobovať výzvy vo vašej aplikácii na prezeranie, čím mätie koncových používateľov. Dokument s formátom XFA (na rozdiel od bežného AcroForm) je často nečitateľný v iných prehliadačoch než v programe Adobe.

function CheckDocumentRisk(Doc: FPDF_DOCUMENT): string;
var
  FormType: Integer;
begin
  Result := 'Safe';
  FormType := FPDF_GetFormType(Doc);
  
  if FormType = FORMTYPE_XFA_FULL then
    Result := 'High Risk: Dynamic XFA Form detected. Document may not render correctly in standard viewers.';
    
  // Further checks for embedded JS actions would involve parsing the /OpenAction dictionary
end;

2. Overenie vloženia písiem

Ak PDF odkazuje na vlastné písmo (napríklad Helvetica-Condensed), ale nevkladá ho do súboru, vizuálny vzhľad sa na počítači diváka zmení na záložný formát. Pri preflighte môžete iterovať cez objekty stránky, skontrolovať slovníky písiem a označiť dokumenty, ktoré nemajú lokálne údaje o type písma.

3. Viditeľnosť textovej vrstvy (prevencia iba naskenovaných dokumentov)

Častým problémom v digitálnych pracovných postupoch je to, keď niekto naskenuje dokument do formátu PDF, ale nespustí OCR (optické rozpoznávanie znakov). Ak váš pracovný postup vyžaduje fulltextové vyhľadávanie, musíte odmietnuť alebo presmerovať dokumenty, ktoré obsahujú iba obrázky, do nástroja OCR.

function HasExtractableText(Doc: FPDF_DOCUMENT): Boolean;
var
  PageCount, I, CharCount: Integer;
  TextPage: FPDF_TEXTPAGE;
begin
  Result := False;
  PageCount := FPDF_GetPageCount(Doc);
  
  // We only check the first few pages to optimize processing time
  for I := 0 to Min(PageCount - 1, 2) do
  begin
    TextPage := FPDFText_LoadPage(FPDF_LoadPage(Doc, I));
    CharCount := FPDFText_CountChars(TextPage);
    FPDFText_ClosePage(TextPage);
    
    if CharCount > 50 then // Arbitrary threshold indicating real text content
    begin
      Result := True;
      Exit;
    end;
  end;
end;

Smerovanie pracovného postupu

Vykonaním týchto kontrol v dávkovej službe napísanej v Delphi získate sadu metaúdajov pre každý prichádzajúci dokument. Môžete potom bezpečne ukladať čisté súbory priamo do databázy, zatiaľ čo rizikové súbory odošlete na reštrukturalizáciu (flatenning), izoláciu alebo manuálne posúdenie pracovníkmi, čím zabezpečíte integritu a plynulosť vašich procesov.

Poznámka: PDFium API používané na presné audity zloženia dokumentov je plne sprístupnené prostredníctvom komponentu PDFium Component.