Tehnični članak

Izvlečenje besedila PDF v strukturnem vrstnem redu s HotPDF

Vsak geometrijski izvlečevalnik besedila ugiba. Bere glife, ki jih stran nariše, jih razvrsti po osnovni črti in vodoravnem položaju in upa, da se vizualna razporeditev ujema z vrstnim redom, v katerem bi človek bral. Na enostolpnem poročilu je ta ugib prav. Na dvostolpnem članku revije, obrazcu s stransko vrstico ali tabeli, katere celice so bile izdane stolpec po stolpcu, je napačen na načine, ki so težko opazni in dragi za odkritje nizvodno. HotPDF odgovori na to z ExtractLoadedPageStructureText, ki ignorira geometrijo popolnoma: prehodi drevo strukture dokumenta v avtorskem vrstnem redu, kot ga definira ISO 32000-1 §14.8.4, nato pa znova sestavi glife strani po njihovem označenem identifikatorju vsebine (marked-content identifier). Za označen PDF to ni hevristika, to je vrstni red, ki ga je proizvajajoča aplikacija deklarirala

Funkcija vrne False, ko stran nima uporabnega drevesa strukture, kar je signal za vračanje k geometrijskemu izvlečevalniku namesto odpovedi. Ta zasnova dveh poti je pomembnejša od algoritma: pravi vnos dokumentov vidi označene vladne obrazce in izhod optičnega bralnika v isti mapi, cevovod, ki obravnava samo enega od njiju, pa ni cevovod

Zakaj geometrijsko izvlečenje dobi bralni vrstni red narobe?

Ker tok vsebine PDF sploh ne nosi bralnega vrstnega reda. Je zaporedje operaterjev risanja in proizvajalec je svoboden izdati jih v katerem koli zaporedju, ki ustreza njegovemu lastnemu motorju razporeditve. Besedilni procesorji običajno izdajo v tokovnem vrstnem redu in geometrijsko razvrščanje izgleda v redu. Orodja za razporeditev, oblikovalci obrazcev in generatorji poročil pogosto ne: noga strani je lahko izdana pred telesom, tabela je lahko zapolnjena stolpčno in dvostolpna stran lahko preplete vrstice iz obeh stolpcev, ker jih je skladatelj razrešil skupaj

Primerjava strani dvostolpnega PDF, ki prikazuje geometrijsko izvlečenje, razvrščeno po osnovni črti, ki splaji stolpce, proti izvlečenju MCID v strukturnem vrstnem redu v HotPDF
Razvrščanje glifov po osnovni črti prepleta dva stolpca v nesmisel, medtem ko drevo strukture ponovi vrstni red, ki ga je proizvajalec deklariral

Način odpovedi je tih. Geometrijski izvlečevalnik nikoli ne poroča o napaki, samo izroči prozo, katere povedi so splajčene iz dveh stolpcev. Kar koli, ki porabi to besedilo — kazalo iskanja, preslikovalnik polj e-računov, cevovod pridobivanja, ki hrani jezikovni model — podeduje škodo brez opozorila. HotPDF pošilja tudi geometrijske izvlečevalnike za naložene dokumente in ostanejo pravo orodje za neoznačene datoteke; točka poti strukturnega vrstnega reda je prenehati ugibati, ko dokument že nosi odgovor

Kaj drevo strukture dejansko shranjuje

Označen PDF drži drugi, vzporedni opis strani. Katalog kaže na /StructTreeRoot, katerega otroci /K tvorijo drevo elementov strukture: /Document, /Sect, /P, /Table, /TR, /TD in tako naprej. Listi tega drevesa so reference označene vsebine, cela števila, ki poimenujejo razpon toka vsebine strani. Na strani vsebine so ti razponi odprti z operaterjem BDC, ki nosi /MCID, in zaprti z EMC. Vsak element strukture prav tako nosi vnos /Pg, ki poimenuje stran, ki ji pripada, kar je tisto, kar naredi prehod na stran mogoč v dokumentu, katerega drevo strukture se razteza čez stotine strani

Anatomija drevesa strukture PDF, ki povezuje elemente StructTreeRoot, kot so Sect, Table, TR in TD, z razponi BDC MCID v toku vsebine strani HotPDF
Listi drevesa so reference označene vsebine in vsak element nosi vnos Pg, ki pusti prehodu filtrirati na trenutno stran

HotPDF prečka to drevo z omejitvijo globine 128 ravni in filtrira na /Pg, tako da prispeva samo trenutna stran. Izhod prečkanja ni besedilo, je urejen seznam vrednosti MCID: avtorski vrstni red razponov označene vsebine na tej strani. Znova sestavljanje besedila je nato stvar ponavljanja glifov v tem vrstnem redu

MCID je zapisan med izvlečenjem glifov in ne iskan potem

To je podrobnost implementacije, ki naredi funkcijo poceni. HotPDF že zapisuje dejaven identifikator označene vsebine na vsakem glifu, ki ga izvleče, v polju MCID THPDFGlyphRecord, ker interpret toka vsebine ve, kateri obseg BDC je odprt v trenutku, ko obdela vsak operater Tj ali TJ. Izvlečenje v strukturnem vrstnem redu torej ne potrebuje drugega prehoda nad tokom vsebine. Zbere zaporedje MCID iz drevesa strukture, nato razvrsti že izvlečene glife v vedra po MCID in jih izda v tem zaporedju

var
  Pdf: THotPDF;
  PageCount, I, Untagged: Integer;
  PageText, AllText: UnicodeString;
  Report: TStrings;   // korito diagnostike v lasti klicatelja
begin
  Pdf := THotPDF.Create(nil);
  try
    PageCount := Pdf.LoadFromFile('accessible-form.pdf');
    AllText := '';
    for I := 0 to PageCount - 1 do
    begin
      if Pdf.ExtractLoadedPageStructureText(I, PageText, Untagged) then
      begin
        // Avtorski vrstni red naravnost iz drevesa strukture
        if Untagged > 0 then
          Report.Add(Format('page %d: %d glyphs outside the structure tree',
            [I, Untagged]));
      end
      else
        // Brez uporabnega drevesa strukture na tej strani: geometrijska zasilna rešitev
        Pdf.ExtractLoadedPageText(I, PageText);
      AllText := AllText + PageText + #13#10;
    end;
  finally
    Pdf.Free;
  end;
end;

Neoznačeni glifi so šteti, nikoli tiho spuščeni

Stran je lahko delno označena. Proizvajalci dodajo okrasno ravnilo, številko strani ali pozno vodni žig zunaj katerega koli obsega BDC in ti glifi ne pripadajo nobenemu MCID. Spuščanje njih bi bila urejena implementacija in napačna, ker se ista vrzel pojavi tudi, ko proizvajalec označi telo, pozabi pa tabelo, in izgubili bi tabelo brez opažanja

HotPDF pripne nezahtevane glife kot geometrijski rep za besedilom v strukturnem vrstnem redu in poroča njihovo število skozi izhodni parameter UntaggedGlyphCount. To število je signal kakovosti, na katerega lahko ukrepate. Peščica glifov na strani dveh tisoč je pohištvo strani in je lahko ignorirana. Štirideset odstotkov strani zunaj drevesa strukture pomeni, da je označevanje okrasno in geometrijski izvlečevalnik je bolj iskren odgovor za to datoteko

Tok odločanja za izvlečenje strukturnega besedila HotPDF z geometrijsko zasilno rešitvijo, ko stran nima uporabnega drevesa strukture ali okrasnega označevanja
True pomeni strukturni vrstni red s pripetim neoznačenim repom, False pa usmeri stran k geometrijskemu izvlečevalniku namesto odpovedi
function ExtractPageBestEffort(Pdf: THotPDF; PageIndex: Integer;
  out AText: UnicodeString; out UsedStructure: Boolean): Boolean;
var
  Untagged, TotalGlyphs: Integer;
  Glyphs: THPDFGlyphArray;
begin
  UsedStructure := False;
  if Pdf.ExtractLoadedPageStructureText(PageIndex, AText, Untagged) then
  begin
    TotalGlyphs := 0;
    if Pdf.ExtractLoadedPageGlyphs(PageIndex, Glyphs) then
      TotalGlyphs := Length(Glyphs);
    // Zaupajte drevesu strukture samo, ko zahteva večino strani
    if (TotalGlyphs = 0) or (Untagged * 4 <= TotalGlyphs) then
    begin
      UsedStructure := True;
      Result := True;
      Exit;
    end;
  end;
  Result := Pdf.ExtractLoadedPageText(PageIndex, AText);
end;

Kaj naredi funkcijo vračajočo False

Trije primeri in vredni so razlikovanja, ker je samo eden od njiju napaka v dokumentu. Prvi je običajen neoznačen PDF: brez /StructTreeRoot, ničesar za prečkanje, False pa je preprosto resnica. Drugi je optično brana stran, katere besedilo prihaja iz plasti OCR, ki ni bila nikoli označena. Tretji je zanimivi: vsebina, ki nosi operaterje BDC z vrednostmi /MCID, katere stran pa nima vnosa /StructParents in katere drevo strukture nikoli ne sklicuje teh identifikatorjev. Označena vsebina obstaja, stran strukture ne in ni vrstnega reda za okrevanje. HotPDF poroča False namesto izumljanja enega

Ta zadnji primer se pokaže v ročno urejanih datotekah in v izhodu iz orodij, ki izdajajo označeno vsebino za namene izbirne vsebine ali artefaktov brez gradnje drevesa strukture. Če sami proizvajate označene PDF-e, je ista asimetrija tisto, kar preverja validacija PDF/UA, nasprotna stran zapisovalnika pa je pokrita v razporeditvenem DOM, ki izdaja označen, paginiran izhod

Kje se strukturni vrstni red izplača sam

Revizija dostopnosti je očitna: če certificirate dokument proti PDF/UA, je bralni vrstni red, ki ga bo oznanil bralnik zaslona, natanko strukturni vrstni red, zato je izvlečenje njega način recenzije brez bralnika zaslona. Zajem podatkov je večji komercialni primer. Označeni vladni obrazci, regulirana razkritja in priloge e-računov nosijo oznake polj in vrednosti v deklariranem vrstnem redu, branje njih v tem vrstnem redu pa odstrani celoten razred preslikovalnih napak, ki jih geometrijsko izvlečenje ustvari na večstolpnih razporeditvah

Najnovejši potrošnik je pridobivanje za jezikovne modele. Razdeljevanje dokumenta na kose (chunking) za vgradnjo je samo tako dobro, kot je besedilni vrstni red, in kos, ki splaji dva stolpca, proizvede povedi, ki nikoli niso obstajale. Izvlečenje v strukturnem vrstnem redu je najcenejša razpoložljiva rešitev za to, ker je za označene dokumente pravilen vrstni red že v datoteki in samo potrebuje branje

HotPDF je domača komponenta VCL za Delphi in C++Builder, zato prečkanje drevesa strukture in ponavljanje glifov oba tečeta v procesu proti naloženemu dokumentu brez vpletenega zunanjega upodobitelja. Polne podrobnosti API za družino izvlečenja naloženih dokumentov so na strani produkta HotPDF Delphi PDF component