Bijna elk zwartlakhulpmiddel verwacht tekst als invoer. Een gescande pagina is een afbeelding, en het omzetten naar tekst laten deze hulpmiddelen aan de gebruiker over. Voor een ontwikkelaar is dat een redelijke keuze. Voor een kantoor met een map vol scans, van getekende akten tot kopieën van identiteitsbewijzen, is het de moeilijkste stap.
Wat de downloads laten zien
De beeldmodule van Presidio, het pakket presidio-image-redactor, werd in oktober 2026 ongeveer 2.800 keer per week gedownload, volgens de pakketindex van Snyk. Een download is bovendien geen gebruiker: een deel komt van buildservers die elke nacht opnieuw installeren. Presidio werd bij Microsoft gebouwd, staat nu onder beheer van een gemeenschap en is voor tekst een van de bekendere opensourcebibliotheken. Dat de beeldmodule zo weinig wordt opgehaald, zegt dus iets over de hele categorie.
Elk serieus hulpmiddel begint bij tekst
Wie Presidio installeert, begint met pip install presidio-analyzer en een spaCy-taalmodel, en roept daarna analyzer.analyze(text=..., language="en") aan. Het woord dat telt, is text: de bibliotheek zoekt in tekst naar namen, rekeningnummers en datums, en geeft hun posities terug.
Voor afbeeldingen is er pip install presidio-image-redactor. Tesseract installeert u dan apart, als programma op het besturingssysteem. Ook hier begint het werk bij tekst, alleen levert u de tekstherkenning zelf.
Dat ontwerp past bij de echte klant van deze hulpmiddelen: een ontwikkelaar met supporttickets, chatlogs of databasevelden, waarin de tekst al bestaat. Ingebouwde tekstherkenning zou de bibliotheek voor hen alleen zwaarder en trager maken. Andere bibliotheken en api's in dit segment kiezen om dezelfde reden hetzelfde.
De stap vóór de eerste aanroep
Er zit een stap vóór de eerste functieaanroep, en geen product in deze categorie neemt die op zich. Die stap bestaat uit: de pagina renderen, de taal kiezen, een scheve scan rechtzetten en de tekens herkennen. Ook moet bewaard blijven waar elk woord stond, anders dekt u later het verkeerde stuk beeld af.
Voor een ontwikkelaar is dat een overzichtelijke klus: een OCR-engine kiezen, een test schrijven, de fouten zoeken. Een medewerker van een notariskantoor met veertig gescande leveringsakten heeft een map met pdf's, een termijn en een programma dat meldt dat het klaar is. Zo komt de moeilijkste stap terecht bij wie er het slechtst voor is toegerust.
Tekstherkenning ziet soms een 0 aan voor een O, of een 1 voor een l. Een BSN met één verkeerd cijfer doorstaat de elfproef niet, dus een patroon met die proef laat hem liggen. Een datum als ‘12-03-197l’ is voor de software geen datum. Er volgt geen melding, en het nummer blijft leesbaar in het bewerkte bestand.
Wij gingen van dezelfde veronderstelling uit
Ons eigen product ging daar ook van uit. We kunnen drie fouten aanwijzen, en alle drie zaten in de stap vóór de tekst.
De eerste: kleine afbeeldingen golden als versiering en werden overgeslagen, alsof de oppervlakte iets zei over het belang. Een handtekening is klein, net als een verkleinde paspoortkopie in een Word-document.
De tweede was erger. Onze code riep een methode aan die onze pdf-bibliotheek niet had. De fout werd opgevangen en gelogd op debugniveau, dat in de praktijk niemand leest. Daarna kreeg elk document hetzelfde antwoord: geen afbeeldingen.
Zo werd elke scan behandeld als een pagina zonder afbeelding. Niets in de uitvoer liet dat merken.
De derde zat in het handwerk. Een vak dat een gebruiker met de hand over een naam op een scan trok, bleef leeg. Onze software zocht eronder naar tekst, maar er was geen tekstlaag. De afgeschermde naam was een lege rechthoek.
Alle drie zijn verholpen, en geen van de drie gaf ooit een foutmelding. Bij scans blijft een fout meestal onopgemerkt.
Persoonsgegevens in scans afschermen: wat er nu gebeurt
promptShield rendert een gescande pagina op 300 dpi en leest haar met Tesseract, in de taal van het document plus Engels. Er gaan acht taalpakketten mee: Nederlands, Engels, Frans, Duits, Spaans, Italiaans, Portugees en Pools. Een scan in een andere taal, of gelezen met het verkeerde pakket, levert zonder melding slechte tekst op.
Daarna zoekt Detecteren in die tekst, in lagen. Patronen vinden vaste vormen zoals een BSN, een IBAN of een geboortedatum, en Entiteiten vinden namen, adressen en organisaties. Diepteanalyse is een optionele derde laag en staat standaard uit.
De uitkomsten worden samengevoegd en ontdubbeld, en een naam van pagina 1 wordt ook op pagina 4 gemarkeerd. Daarna filtert de software ruis weg. Geen lokaal model vindt elk gegeven, dus een mens kijkt de vondsten na in Beoordelen, vóór de download.
Van elke vondst wordt de plek in het beeld bepaald, en die pixels worden afgedekt. Daaronder komt een nieuwe doorzoekbare tekstlaag. Zwartlakken verwijdert de onderliggende inhoud en legt geen zwart blok over tekst die blijft staan.
Bij de export worden ook de onzichtbare plekken behandeld: alt-teksten en vervangende tekst in getagde pdf's, XMP-metadata, PieceInfo, benoemde bestemmingen en formuliervelden met hun weergave. Daar komt de code van de waarde, of een neutrale markering als ze is gezwartlakt. Een miniatuur van vóór het afschermen verdwijnt, want in een rasterbeeld valt niets te vervangen.
Wie Coderen kiest, krijgt codes per map: binnen een map houdt een waarde dezelfde code, en mappen zien elkaars codes niet. Alleen een code die u in Instellingen vastzet, geldt overal. Het Coderegister staat op uw eigen machine. Hoe het lezen van scans technisch werkt, staat in een apart stuk.
Waarom de plek van verwerking telt
Een scan bevat meer dan tekst: een handtekening, een stempel, een pasfoto, een aantekening in de kantlijn. Een clouddienst voor tekstherkenning krijgt dat allemaal. Zo'n dienst is verwerker onder de AVG, en artikel 28 vraagt dan om een verwerkersovereenkomst.
De UAVG vult de AVG voor Nederland aan, en de Autoriteit Persoonsgegevens houdt toezicht. Voor advocaten en notarissen komen het beroepsgeheim en het verschoningsrecht erbij. Of een dienst aan die eisen voldoet, beoordeelt u met uw eigen adviseur. Wordt de scan op de eigen machine gelezen, dan ontstaat die vraag voor de tekstherkenning niet.
‘100% offline’ geldt voor de desktopversie. De gratis browserversie stuurt bij het starten een anoniem signaal, en het document blijft ook daar op uw computer. Volledig zonder verbinding, zonder licentiecontrole of crashrapportage, werkt de desktop alleen met Pro.
Waarom we geen schil om Presidio bouwden, leggen we elders uit. Daar staat ook de volledige vergelijking.
Voor wie deze software niet is gebouwd
De makers van deze bibliotheken leverden goed werk voor hun eigen gebruikers. Hun keuze is te verdedigen, en wij maakten haar ook. De kosten komen terecht bij wie niet mee besliste: de secretaresse bij de scanner, de kandidaat-notaris met een stapel akten, de cliënt wiens BSN leesbaar bleef. Hun documenten beginnen bij de scan, dus software voor hen hoort daar ook te beginnen.
Vragen die vaak terugkomen
Waarom mist afschermsoftware tekst in afbeeldingen?
De meeste verwachten tekst, en een scan bevat alleen pixels. Zonder tekstherkenning is er niets te doorzoeken, en slechte herkenning maakt een BSN of IBAN onherkenbaar. Meestal volgt er geen melding.
Is dat niet waar de beeldmodule van Presidio voor is?
Deels: de module haalt met Tesseract tekst uit een afbeelding en dekt af wat de analyse vindt. Tesseract, de taaldata en het afstemmen op uw scans regelt u zelf. In oktober 2026 werd de module ongeveer 2.800 keer per week gedownload, volgens de pakketindex van Snyk.
Waarom weegt lokale verwerking zwaarder bij scans?
Met een scan gaat alles op de pagina mee, ook handtekeningen en pasfoto's. Een externe dienst die hem leest, is verwerker in de zin van artikel 28 AVG. Wordt de scan lokaal gelezen, dan speelt die vraag voor de tekstherkenning niet.
Hoe ziet u of een pdf een scan is?
Probeer een woord te selecteren of zoek op een naam die u ziet staan. Lukt dat niet, dan is de pagina een afbeelding. promptShield zet bij afbeeldingen en bij een te dunne tekstlaag zelf tekstherkenning aan.