Műszaki cikk

Szerkezetsorrendű PDF szövegkinyerés Delphiben HotPDF-fel

Minden geometriai szövegkinyerő találgat. Kiolvassa a glífákat, amelyeket egy oldal rajzol, alapvonal és vízszintes pozíció szerint rendezi őket, és reméli, hogy a vizuális elrendezés egyezik azzal a sorrenddel, ahogyan egy ember olvasna. Egy egyhasábos jelentésnél az a találgatás helyes. Két hasábos folyóiratcikknél, egy oldalsávval rendelkező űrlapnál vagy egy olyan táblázatnál, amelynek celláit hasábonként bocsátották ki, téves olyan módokon, amelyeket nehéz észrevenni, és drága lemenetben felfedezni. A HotPDF erre a ExtractLoadedPageStructureText metódussal válaszol, amely a geometriát teljesen figyelmen kívül hagy: a dokumentum szerkezetfáját járja be szerzői sorrendben, ahogyan azt az ISO 32000-1 §14.8.4 definiálja, majd az oldal glífáit a megjelölt-tartalom azonosítójuk szerint rakja újra össze. Címkézett PDF esetén ez nem heurisztika, hanem az a sorrend, amelyet az előállító alkalmazás kinyilvánított

A függvény False értéket ad vissza, amikor az oldalnak nincs használható szerkezetfája, ami az a jelzés, hogy vissza kell esni a geometriai kinyerőre, nem elbukni. A két utas kialakítás fontosabb, mint az algoritmus: a valós dokumentumbevétel ugyanabban a mappában lát címkézett kormányzati űrlapokat és szkennelő kimenetet, és egy vezeték, amely csak az egyiket kezeli, nem vezeték

Miért téveszti el a geometriai kinyerés az olvasási sorrendet?

Mert egy PDF tartalomfolyam egyáltalán nem hordoz olvasási sorrendet. Rajzoló operátorok sorozata, és egy előállító szabadon bocsátja ki őket abban a sorrendben, amely a saját elrendezési motorjának megfelel. A szövegszerkesztők általában folyam-sorrendben bocsátanak ki, és a geometriai rendezés jól néz ki. Az elrendezési eszközök, űrlaptervezők és jelentésgenerátorok gyakran nem: egy lábléc a törzs előtt kibocsátható, egy táblázat oszlop-fő sorrendben tölthető be, és egy két hasábos oldal mindkét hasábból sorokat fonhat össze, mert a szerkesztő együtt oldotta meg őket

Két hasábos PDF oldal összehasonlítása: az alapvonal szerint rendezett geometriai kinyerés összevágja a hasábokat, szemben a HotPDF szerkezetsorrendű MCID kinyerésével
A glífák alapvonal szerinti rendezése két hasábot fon értelmetlenné, míg a szerkezetfa visszajátssza az előállító által kinyilvánított sorrendet

A hibamód csendes. Egy geometriai kinyerő soha nem jelent hibát, csak olyan prózát ad vissza, amelynek mondatai két hasábból vannak összevágva. Bármi, amely ezt a szöveget fogyasztja — egy keresési index, egy e-számla mezőleképező, egy nyelvi modellt tápláló visszakeresési vezeték — örökli a kárt figyelmeztetés nélkül. A HotPDF szállítja a geometriai kinyerőket is betöltött dokumentumokhoz, és ezek maradnak a helyes eszköz címkézetlen fájlokhoz; a szerkezetsorrendű út lényege, hogy abbahagyja a találgatást, amikor a dokumentum már hordozza a választ

Mit tárol valójában a szerkezetfa

Egy címkézett PDF az oldal második, párhuzamos leírását tartja. A katalógus egy /StructTreeRoot elemre mutat, amelynek /K gyermekei a szerkezetek fáját alkotják: /Document, /Sect, /P, /Table, /TR, /TD és így tovább. Ennek a fának a levelei megjelölt-tartalom hivatkozások, egész számok, amelyek az oldal tartalomfolyamának egy szakaszát nevezik meg. A tartalomoldalon azok a szakaszok egy /MCID-t hordozó BDC operátorral nyílnak, és EMC-vel zárnak. Minden szerkezetelem hordoz egy /Pg bejegyzést is, amely megnevezi, melyik oldalhoz tartozik, és ez teszi lehetővé az oldalankénti bejárást egy olyan dokumentumban, amelynek szerkezetfája százszámra terjedő oldalakon átível

PDF szerkezetfa anatómia: a StructTreeRoot szerelemei, mint Sect, Table, TR és TD, összekötve a BDC MCID szakaszokkal a HotPDF oldal tartalomfolyamában
A fa levelei megjelölt-tartalom hivatkozások, és minden elem hordoz egy Pg bejegyzést, amely a bejárást az aktuális oldalra szűri

A HotPDF 128 szint mélységi korláttal járja be azt a fát, és a /Pg-re szűr, hogy csak az aktuális oldal járuljon hozzá. A bejárás kimenete nem szöveg, hanem MCID értékek rendezett listája: a megjelölt-tartalom szakaszok szerzői sorrendje ezen az oldalon. A szöveg újraösszerakása ezután annyit jelent, hogy a glífákat abban a sorrendben játssza vissza

Az MCID a glífa kinyerése közben rögzítődik, nem utána keresendő

Ez az implementációs részlet, amely a funkciót olcsóvá teszi. A HotPDF már most is rögzíti az aktív megjelölt-tartalom azonosítót minden általa kinyert glífán, a THPDFGlyphRecord MCID mezőjében, mert a tartalomfolyam-értelmező tudja, melyik BDC hatókör van nyitva abban a pillanatban, amikor minden Tj vagy TJ operátort feldolgoz. A szerkezetsorrendű kinyerésnek ezért nincs szüksége második menetre a tartalomfolyamon. Összegyűjti az MCID sorozatot a szerkezetfából, majd a már kinyert glífákat MCID szerint vödrözi, és abban a sorrendben bocsátja ki őket

var
  Pdf: THotPDF;
  PageCount, I, Untagged: Integer;
  PageText, AllText: UnicodeString;
  Report: TStrings;   // hívó tulajdonában lévő diagnosztikai fogadó
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
        // Szerzői sorrend egyenesen a szerkezetfából
        if Untagged > 0 then
          Report.Add(Format('page %d: %d glyphs outside the structure tree',
            [I, Untagged]));
      end
      else
        // Nincs használható szerkezetfa ezen az oldalon: geometriai tartalék
        Pdf.ExtractLoadedPageText(I, PageText);
      AllText := AllText + PageText + #13#10;
    end;
  finally
    Pdf.Free;
  end;
end;

A címkézetlen glífákat megszámoljuk, soha nem dobjuk el csendben

Egy oldal lehet részben címkézett. Az előállítók dekoratív vonalat, oldalszámot vagy késői vízjelet adnak hozzá bármilyen BDC hatókörön kívül, és azok a glífák egyetlen MCID-hez sem tartoznak. Eldobásuk a rendezett implementáció és egyben a téves lenne, mert ugyanaz a rés akkor is megjelenik, amikor egy előállító a törzset címkézi, de elfelejti a táblázatot, és Ön észrevétlenül veszítené el a táblázatot

A HotPDF a meg nem igényelt glífákat geometriai farokként csatolja a szerkezetsorrendű szöveg után, és számukat a UntaggedGlyphCount kimeneti paraméteren keresztül jelenti. Az a szám minőségi jelzés, amelyen cselekedni lehet. Néhány glífa egy kétezeres oldalon oldalszerelvény, és figyelmen kívül hagyható. Az oldal negyven százaléka a szerkezetfán kívül azt jelenti, hogy a címkézés dekoratív, és a geometriai kinyerő az őszintébb válasz arra a fájlra

Döntési folyamat a HotPDF szerkezetszöveg kinyeréséhez geometriai tartalékkal, amikor egy oldalnak nincs használható szerkezetfája vagy dekoratív a címkézése
A True szerkezetsorrendet jelent a hozzácsatolt címkézetlen farokkal, a False pedig geometriai kinyerőre irányítja az oldalt az elbukás helyett
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);
    // Bízzon a szerkezetfában csak akkor, amikor az az oldal nagyobb részét igényli
    if (TotalGlyphs = 0) or (Untagged * 4 <= TotalGlyphs) then
    begin
      UsedStructure := True;
      Result := True;
      Exit;
    end;
  end;
  Result := Pdf.ExtractLoadedPageText(PageIndex, AText);
end;

Mitől ad vissza a függvény False-t

Három eset, és érdemes megkülönböztetni őket, mert csak egyikük hiba a dokumentumban. Az első egy hétköznapi címkézetlen PDF: nincs /StructTreeRoot, nincs mit bejárni, és a False egyszerűen az igazság. A második egy szkennelt oldal, amelynek szövege egy soha nem címkézett OCR rétegből jön. A harmadik az érdekes: olyan tartalom, amely BDC operátorokat hordoz /MCID értékekkel, de amelynek oldalán nincs /StructParents bejegyzés, és amelynek szerkezetfája soha nem hivatkozik azokra az azonosítókra. A megjelölt tartalom létezik, a szerkezetoldal nem, és nincs helyreállítandó sorrend. A HotPDF False-t jelent, nem kitalál egyet

Az utolsó eset kézzel szerkesztett fájlokban és olyan eszközök kimenetében mutatkozik meg, amelyek opcionális tartalom vagy artefakt céljából bocsátanak ki megjelölt tartalmat anélkül, hogy szerkezetfát építenének. Ha Ön maga állít elő címkézett PDF-eket, ugyanaz az aszimmetria az, amit a PDF/UA validáció ellenőriz, és az íróoldali megfelelőjét a címkézett, lapozott kimenetet bocsátó layout DOM tárgyalja

Hol térül meg a szerkezetsorrend

Az akadálymentesítési audit a kézenfekvő: ha PDF/UA szerint tanúsít egy dokumentumot, azt az olvasási sorrendet, amelyet egy képernyőolvasó be fog jelenteni, pontosan a szerkezetsorrend adja, tehát annak kinyerése az a mód, ahogyan képernyőolvasó nélkül nézheti át. Az adatbefogás a nagyobb kereskedelmi eset. A címkézett kormányzati űrlapok, szabályozott közlések és e-számla mellékletek mezőcímkéket és értékeket hordoznak kinyilvánított sorrendben, és azoknak abban a sorrendben való olvasása eltávolít egy egész hibaleképezési osztályt, amelyet a geometriai kinyerés a többhasábos elrendezéseken létrehoz

A legújabb fogyasztó a nyelvi modellek visszakeresése. Egy dokumentum darabolása beágyazáshoz csak annyira jó, mint a szövegsorrend, és egy darab, amely két hasábot vág össze, soha nem létezett mondatokat állít elő. A szerkezetsorrendű kinyerés a legolcsóbb elérhető javítás erre, mert címkézett dokumentumok esetén a helyes sorrend már a fájlban van, és csak ki kell olvasni

A HotPDF natív VCL komponens Delphi és C++Builder rendszerekhez, tehát a szerkezetfa-bejárás és a glífavisszajátszás is a saját folyamatában fut egy betöltött dokumentumon, külső renderelő nélkül. A betöltött dokumentum kinyerőcsalád teljes API részletei a HotPDF Delphi PDF component terméklapon találhatók