Waarom zijn alle bedragswaarden negatief?

Dit is vreemd, maar interessant genoeg eindigen de kolomkoppen met mintekens. Om te achterhalen hoe de tekst gecodeerd is, heb ik de PDF geopend in PDFSnake. Laten we kijken naar de codering van de waarden $110.00- en $1,527.57.

Analyse van de codering: $110.00-

PDF's zijn opgebouwd uit een reeks commando's. Hieronder volgt een overzicht van de commando's die in dit segment voorkomen:

  • BT: Begin Text. Vertelt de PDF-renderer om de tekstweergavemodus te starten en de vorige grafische status op te slaan. Binnen een blok van Begin Text tot End Text zijn alleen tekstoperatoren toegestaan.
  • ET: End Text. Vertelt de PDF om de tekstweergavemodus te verlaten en de grafische status te herstellen naar de staat vóór het BT-commando.
  • Tf: Stelt het lettertype en de grootte van de tekst in.
  • Td: Verplaatst de tekstpositie.
  • Tj: Geeft de tekst weer.
  • g: Stelt de grijswaarde in voor non-stroking operaties.
  • G: Stelt de grijswaarde in voor stroking operaties.

De bovenstaande PDF-commando's kunnen als volgt worden samengevat: "Teken de tekst ($110.00). Stel de grijswaarde in op 0 (zwart). Teken de tekst (-)."

Analyse van de codering: $1,527.57-

De structuur van dit segment is vergelijkbaar met het vorige voorbeeld, maar er is één cruciaal verschil: de grijswaarde wordt ingesteld op 0.878 bij het tekenen van het minteken. Deze grijswaarde komt exact overeen met de achtergrondkleur.

Hierdoor is het minteken onzichtbaar voor het menselijk oog. Het karakter is echter wel aanwezig in de code, en dat is de reden waarom mijn software dit oppikt bij het verwerken van de PDF.

Waarom is de PDF zo gecodeerd?

Hoewel ik het niet zeker weet, heb ik een vermoeden.

In deze PDF worden mintekens achter het bedrag geplaatst (trailing minus signs). Dit maakt rechts uitlijnen lastig; de maker wilde waarschijnlijk dat de cijfers recht onder elkaar stonden, ongeacht of er een minteken was. Een manier om dit te bereiken is door altijd ruimte te reserveren voor het minteken. Omdat de breedte van een minteken afhankelijk is van de lettergrootte en moeilijk te voorspellen is, hebben ze gekozen voor het toevoegen van een onzichtbaar minteken bij positieve waarden.

Het resultaat is dat de PDF er visueel goed uitziet, maar dat data-extractie erg lastig wordt. Dit had voorkomen kunnen worden door mintekens vóór het bedrag te plaatsen (leading minus signs), maar om redenen die onbekend zijn is hier gekozen voor tekens aan het einde.

Mogelijke oplossingen

Om deze PDF correct te converteren, zie ik twee mogelijke oplossingen:

Oplossing 1: OCR de PDF

In plaats van de tekstelementen in de PDF direct uit te lezen, zou ik de PDF kunnen omzetten naar een reeks PNG-bestanden en vervolgens OCR-software (Optical Character Recognition) op deze afbeeldingen kunnen draaien. Dit zou werken, maar heeft nadelen:

  • OCR is niet 100% nauwkeurig; er is altijd een kans dat tekens verkeerd worden herkend.
  • Het OCR-proces is aanzienlijk trager.

Oplossing 2: Niet-zwarte tekst verwijderen

Voor dit type bankafschrift is alleen zwartgekleurde tekst relevant. Tekstelementen met een andere kleur kunnen worden beschouwd als onzichtbaar. Dit zou moeten werken, maar er is één probleem: bij het extraheren van tekst in de Bank Statement Converter sla ik momenteel de kleur van de tekst niet op. Ik moet dus code toevoegen om dit wel te doen, wat echter niet al te moeilijk zou moeten zijn.