Deze pagina wordt in het Nederlands getoond, de taal waar je browser om vraagt.
De code van deze pagina is niet gestart.
Open je index.html rechtstreeks uit een map, dan worden JavaScript-modules geblokkeerd en gebeurt er niets zodra je een foto van een pagina kiest. Serveer de map in plaats daarvan over http:
Gaat open zodra je hierboven een bestand kiest.klaar — verbreek de verbinding en dit blijft gewoon werken.niet beschikbaar in deze browser (al het andere werkt gewoon).heeft https:// of localhost nodig om offline te kunnen bewaren.bewaren lukt hier niet, maar er wordt hoe dan ook niets geüpload.Je bestanden zijn nergens heen gegaan. {total} bestanden geladen, allemaal van deze site zelf. {platform}Iets heeft {hosts} benaderd, en dat doet dit gereedschap nooit. Dat is het waard om na te kijken. {platform}De eigen scripts van de site voor advertenties, meting en de donatieknop kwamen van {hosts} host; geen daarvan heeft een bestand of een byte ervan gekregen.De eigen scripts van de site voor advertenties, meting en de donatieknop kwamen van {hosts} hosts; geen daarvan heeft een bestand of een byte ervan gekregen.Er ging iets mis: {detail}. Herlaad de pagina om opnieuw te beginnen.{count} bestand wordt gelezen…{count} bestanden worden gelezen…Een voorbeeld proberenVoorbeeld wordt gemaakt…Deze browser kon het voorbeeld niet maken. Kies in plaats daarvan een bestand.
Documentscanner — een foto van een pagina, rechtgetrokken
Fotografeer de pagina. Je krijgt iets terug dat eruitziet als een scan.
● Je documenten worden nooit geüpload. Er is geen server.
De foto wordt door je eigen browser gedecodeerd, rechtgetrokken, opgeschoond en in een PDF geschreven, met niets anders dan rekenwerk en de codecs die hij al meebrengt. Dit gereedschap heeft geen enkele netwerkfunctie — niets op te halen, niets te versturen — en waarom dat hier uitmaakt is waar mensen pagina's van fotograferen: een paspoort, een loonstrook, een huurcontract, een formulier dat een instantie heeft gevraagd te „scannen en terug te sturen”.
✗ Geen upload
✗ Geen account
✗ Geen watermerk
✓ Werkt offline
✓ Open source
Live controle:bezig met controleren…
Offline:bezig met controleren…
Neem het niet van ons aan: open DevTools, kijk naar het tabblad Netwerk en scan een pagina. Geen enkel verzoek draagt een foto, een miniatuur, een bestandsnaam of de positie van één hoek mee. Of trek de stekker uit het internet en scan er toch een.
Hoe je de privacybelofte controleert
Je documenten kunnen nergens heen. Het Content-Security-Policy noemt elk adres dat deze pagina mag benaderen, en geen enkel adres daarvan hoort bij deze site. Er is hier geen eindpunt waar je foto's verzameld zouden kunnen worden, en niets in de code dat ze zou versturen als dat er wel was.
Er is geen model, dus er valt niets te downloaden en niets te vragen. De vier hoeken van een pagina vinden gebeurt met rekenwerk: de gradiënt van het beeld, een stem voor de rechte lijnen erin, en een controle van wat er werkelijk onder elke zijde van de winnende rechthoek ligt. Geen gewichten, geen inferentie-runtime, niets dat bij het eerste gebruik opgehaald wordt, en niets dat zich bij het document van iemand anders anders gedraagt dan bij het jouwe — zie src/detect.js.
Het document draagt geen datum, geen auteur en geen machinenaam. Een scan is iets dat mensen naar andere mensen sturen, meestal omdat een instantie erom gevraagd heeft. Het enige wat er behalve de pagina's zelf in de PDF geschreven wordt is de naam van dit gereedschap, en een titel als je er een typt. Er is geen aanmaakdatum, geen auteur, geen serienummer en niets dat is afgeleid van je klok, je bestandsnamen of je computer — zie src/document.js.
Hier haalt niets iets op. Er staat geen fetch, geen XMLHttpRequest en geen sendBeacon ergens in src/. Het werk is getImageData, wat lussen over de bytes, en de eigen JPEG-encoder van de browser — allemaal al geïnstalleerd op je machine.
Het werkt offline. Verbreek de verbinding en het gereedschap is onveranderd, want er heeft nooit een netwerkstap in gezeten. Dat is het eenvoudigste bewijs van allemaal — en het bewijs dat het waard is te draaien voordat je een paspoort scant.
Controleer het zelf. Je hoeft niets van het bovenstaande op ons woord aan te nemen. Een buildscript maakt deze pagina uit de sjablonen en de configuratie in de repository, en dat script kun je lezen en zelf draaien. Het resultaat staat vastgelegd op de branch dist, dus je kunt wat er geserveerd wordt vergelijken met wat een build van de bronnen oplevert:
De bestanden die je als eerste wilt lezen zijn config/site.toml voor de Content-Security-Policy, src/detect.js voor hoe de hoeken zonder enig model gevonden worden, src/warp.js voor het rechttrekken, en src/clean.js voor hoe het ongelijke licht eruit gedeeld wordt.
Als de beveiligingssoftware van je werkgever voor een upload waarschuwt. Die let op het moment dat er in een browser een bestand wordt gekozen, en kan niet weten of de pagina het wil versturen — dus waarschuwt hij bij het kiezen. Hier wordt niets verstuurd: open de ontwikkelaarstools, ga naar Netwerk en kies een bestand. Er is geen verzoek dat het meeneemt, en helemaal geen verzoek behalve de lokale voorbeeldweergave van de pagina. Diezelfde controle doet je IT-afdeling in een halve minuut.
1 Kies foto's
Eén foto per pagina, genomen van ergens erboven. De hele pagina moet in beeld zijn, en de vier hoeken zouden zichtbaar moeten zijn of bijna. Al het andere — de scheve hoek, de schaduw, de tafel eronder — is waar dit gereedschap voor is. Voeg er meerdere toe en ze worden de pagina's van één document, in de volgorde waarin je ze toevoegt.
2 Zet de hoeken op de pagina
Tik ergens op de foto, en de dichtstbijzijnde hoek komt naar je vinger toe; sleep hem naar de hoek van de pagina. Met Tab bereik je een hoek via het toetsenbord, de pijltjestoetsen verplaatsen hem één pixel en met Shift tien. Niets hiervan is definitief: de scan wordt genomen van waar de vier hoeken uiteindelijk staan.
Kies een foto, dan verschijnt hij hier, met zijn vier hoeken voor je gevonden.
3 Opschonen
Wat hieronder staat is het echte resultaat, gemaakt door dezelfde code die het bestand schrijft: rechtgetrokken en met het ongelijke licht eruit gedeeld. Op het scherm wordt het op schermgrootte getekend terwijl je kiest; het bestand zelf ontstaat in de resolutie van de foto.
Kleur, gelijkgetrokken Het papier wordt over de pagina heen gemeten en eruit gedeeld, zodat de schaduw verdwijnt en het papier weer wit wordt, terwijl een stempel, een handtekening in blauwe inkt of een gemarkeerde regel hun kleur houden. Dit is de modus als de kleur bij het document hoort.
Grijstinten Hetzelfde gelijktrekken zonder de kleur. Kleiner dan kleur en vriendelijker voor een foto of een handtekening dan zwart-wit is.
Zwart-wit Elke pixel wordt beoordeeld tegen zijn eigen omgeving en niet tegen één getal voor de hele pagina, en precies dat houdt het schrift binnen een schaduw leesbaar. Dit is wat een scan klein maakt: een contract van twintig pagina's komt er zo onder een megabyte uit en als foto's rond de vijftien. Deze modus kent geen halftonen, dus niets met een foto erop zou hem moeten nemen.
Zo laten Rechtgetrokken en verder niets. Voor een pagina waarbij het papier zelf meetelt: iets ouds, iets kleurigs, een foto.
De rechtgetrokken pagina verschijnt hier zodra er een foto is om recht te trekken.
Wordt rechtgetrokken…
De instelling geldt voor elke pagina. Pagina's in één document die verschillend opgeschoond zijn, zien eruit als twee documenten.
4 Sla het document op
De PDF ontstaat hier, in het geheugen van deze pagina, pagina voor pagina. Aan de andere kant van dit gereedschap staat geen server om een loonstrook, een paspoort of een contract naartoe te sturen, en in de code staat niets dat dat zou doen als die er wel was.
Afdrukresolutie Hoe groot een vel genoemd wordt dat uit een bepaald aantal pixels bestaat. Het verandert het formaat waarop het document wordt afgedrukt, en geen enkele pixel van de scan.
Langste zijde Een bovengrens voor de rechtgetrokken pagina. De foto van een pagina bevat veel meer pixels dan de pagina waard is, en 2400 op de lange rand is ongeveer 200 DPI op A4.
Kwaliteit Voor de modi kleur en grijstinten, die als JPEG worden opgeslagen. Zwart-witpagina's worden exact opgeslagen; voor die pagina's doet dit niets.
Documenttitel (optioneel) Het enige wat er behalve de pagina's in het document geschreven wordt. Geen datum, geen auteur en niets over dit apparaat. Zie src/document.js.
Open hem voordat je hem verstuurt. Wat er in het document staat is wat er bij stap 3 op het scherm stond, pagina voor pagina.
Er zijn geen pagina’s om te schrijven.Deze browser heeft geen CompressionStream, en dat heeft de zwart-witmodus nodig om een pagina in te pakken. Kies een van de andere modi.Deze browser kon de pagina niet als JPEG coderen.Deze browser kon de pagina niet coderen.Die vier hoeken vormen geen pagina.De vier hoeken zijn gevonden. Controleer ze en sleep de hoeken recht die ernaast liggen.De randen van de pagina waren niet duidelijk genoeg om zeker te zijn. Deze hoeken zijn een gok: sleep ze op de pagina voordat je verdergaat.In deze foto was geen pagina te onderscheiden, daarom liggen de hoeken op de randen ervan. Sleep ze op de pagina.In dit beeld valt niets te vinden, het heeft helemaal geen randen.Dit beeld is te klein om er een pagina in te vinden.Deze hoeken zijn nu van jou. „Hoeken opnieuw zoeken” meet de foto van voren af aan op.Hoek linksbovenHoek rechtsbovenHoek rechtsonderHoek linksonder{corner}, op {x} in de breedte en {y} naar beneden. De pijltjestoetsen verplaatsen hem, en met Shift erbij tien pixels tegelijk.Pagina {index} bewerkenPagina {index} verwijderenPagina {index} naar voren schuivenPagina {index} naar achteren schuiven{count} pagina{count} pagina'sA4 of A5US LetterUS Legaleen visitekaartjeDe pagina kwam er als {ratio} uit, en dat is de vorm van {paper}.De pagina kwam er als {ratio} uit, en dat is de vorm van {paper} in liggend formaat.De pagina kwam er als {ratio} uit, en dat is geen standaardformaat.De vorm is teruggerekend uit het perspectief in de foto, dus het is de vorm van de pagina en niet die waarin ze in beeld verscheen.De foto is recht van voren genomen, dus de vorm is rechtstreeks aan de randen gemeten.{width} bij {height} pixels, ongeveer {dpi} DPI op een pagina van dit formaat, genoeg om af te drukken.{width} bij {height} pixels, ongeveer {dpi} DPI op een pagina van dit formaat. Op het scherm goed, op papier wat slap.{width} bij {height} pixels, ongeveer {dpi} DPI op een pagina van dit formaat. Ga dichterbij staan als dit afgedrukt moet worden.{width} bij {height} pixels.De pagina vulde {percent}% van de foto.De pagina vulde maar {percent}% van de foto, dus het meeste van wat je gefotografeerd hebt was tafel. Volgende keer dichterbij.Zacht: het papier wordt gelijkgetrokken en verder weinig. Voor een pagina met bleek potlood of een foto erop.De gebruikelijke instelling: het papier wordt weer wit en gedrukte tekst weer zwart.Hard: alles wat grijs is wordt naar zwart of wit geduwd. Het schoonst op een pagina met alleen gedrukte tekst en vernietigend voor alles met een beeld erop.Pagina {done} van {total}…Het document wordt geschreven…{name} — {size}, {pages}.{name} — {size}, {pages}.Opgeslagen met één bit per pixel en exact gecomprimeerd, en daarom is het zo klein.De pagina's zijn opgeslagen als JPEG in de kwaliteit die je gekozen hebt.De pagina's zijn opgeslagen als PNG, dat verliesvrij is en dat is wat een beeld van twee kleuren wil. JPEG zou tegelijk groter en rond elke letter onscherp zijn.Geen datum, geen auteur, geen computernaam: het enige in het document behalve de pagina's is de naam van dit gereedschap.Elk vel krijgt de grootte die zijn eigen pagina werkelijk heeft, in de resolutie hierboven. Er wordt niets met balken opgevuld.Elke pagina wordt op een vel {name} gezet, binnen de marge, welke vorm ze ook gekregen heeft.Deze browser kon {name} niet openen. Als het een HEIC-foto van een iPhone is, zet hem dan eerst om.Kies eerst minstens één foto.Er ging iets mis bij het maken van het bestand: {detail}Je documenten zijn nergens heen gegaan. {total} bestanden geladen, allemaal van deze site zelf. {platform}Iets heeft {hosts} benaderd, en dat doet dit gereedschap nooit. Dat is het waard om na te kijken. {platform}De eigen scripts van de site voor advertenties, meting en de donatieknop kwamen van {hosts} host; geen daarvan heeft een foto of een byte ervan gekregen.De eigen scripts van de site voor advertenties, meting en de donatieknop kwamen van {hosts} hosts; geen daarvan heeft een foto of een byte ervan gekregen.
Heeft dit geholpen?
Wat ging er mis?
Bedankt — daar hebben we wat aan.
Alleen je antwoord wordt verstuurd, en alleen als je op een knop drukt. Nooit je bestand, niet de naam ervan, en niets erover.
# Documentscanner — een foto van een pagina, rechtgetrokken
Fotografeer de pagina. Je krijgt iets terug dat eruitziet als een scan.
> Maak van een telefoonfoto van een pagina een rechtgetrokken, gelijkmatig belichte PDF. De hoeken worden voor je gevonden, het perspectief wordt teruggedraaid, de schaduw wordt eruit gedeeld. Draait helemaal in je browser: er wordt niets geüpload.
Deze pagina is een interactief hulpmiddel dat volledig in je browser draait, op https://abox.tools/nl/documenten-scannen/ — niets van wat je het geeft wordt geüpload. Hieronder staat alles wat de pagina er in woorden over zegt; om het te gebruiken, open je het adres.
## Je documenten worden **nooit geüpload**. Er is geen server.
De foto wordt door je eigen browser gedecodeerd, rechtgetrokken, opgeschoond en in een PDF geschreven, met niets anders dan rekenwerk en de codecs die hij al meebrengt. Dit gereedschap heeft geen enkele netwerkfunctie — niets op te halen, niets te versturen — en waarom dat hier uitmaakt is waar mensen pagina's van fotograferen: een paspoort, een loonstrook, een huurcontract, een formulier dat een instantie heeft gevraagd te „scannen en terug te sturen”.
- ✗ Geen upload
- ✗ Geen account
- ✗ Geen watermerk
- ✓ Werkt offline
- ✓ Open source
## Zo scan je een document met de camera van je telefoon
1. **Fotografeer de pagina.** Van boven, met de hele pagina in beeld en de vier hoeken zichtbaar of bijna. Hij hoeft niet recht van voren en hij hoeft niet gelijkmatig belicht: de hoek en de schaduw zijn waar dit gereedschap voor is. Wat wel uitmaakt is het beeld vullen — een pagina die van de andere kant van de kamer gefotografeerd is, heeft geen detail meer om terug te halen.
2. **Controleer de vier hoeken.** Ze worden voor je gevonden zodra de foto gelezen is, en de pagina zegt het als hij het niet zeker weet — een pagina op een bureau van dezelfde kleur als het papier heeft werkelijk een rand die nauwelijks te zien is. Druk ergens op de foto en de dichtstbijzijnde hoek komt naar je vinger toe, of bereik er een met `Tab` en verplaats hem met de pijltjestoetsen.
3. **Kies wat er met het licht moet gebeuren.** „Kleur, gelijkgetrokken” meet het papier over de pagina heen en deelt het eruit, zodat de schaduw verdwijnt en een stempel of een handtekening zijn kleur houdt. „Zwart-wit” gaat verder en is wat een scan klein genoeg maakt om te mailen. Wat je op het scherm ziet is het echte resultaat, gemaakt door dezelfde code die het bestand schrijft.
4. **Voeg de andere pagina's toe.** Elke foto die je toevoegt wordt een volgende pagina van hetzelfde document, in de volgorde waarin ze staan, en elke pagina houdt haar eigen hoeken. De pijltjes bij een pagina in de strook verplaatsen haar naar voren of naar achteren.
5. **Sla de PDF op, en open hem voordat je hem verstuurt.** Het document wordt hier opgebouwd, in het geheugen van deze pagina. Er is niets geüpload om het te maken, en er is nergens iets over gemeld.
## De uitgebreide versie
[Hoe je een document scant met je telefoon](https://abox.tools/nl/gidsen/een-document-scannen-met-je-telefoon/): Wat een foto van een pagina scheidt van een scan ervan: de hoek, het ongelijke licht en de bestandsgrootte. Hoe je de foto maakt, wat je daarna herstelt, en waarom er nergens een server aan te pas komt.
## Ook in de gereedschapskist
- [Audio uit video halen](https://abox.tools/nl/audio-uit-video-halen/): Sleep er een video in en haal het geluid eruit. Het beeld wordt nooit gedecodeerd en er wordt niets geüpload.
- [Audioknipper](https://abox.tools/nl/audio-knippen/): Markeer tijdens het afspelen wat het waard is. Je krijgt het terug als één bestand, geknipt waar jij het zei.
- [Audiobewerker](https://abox.tools/nl/audio-bewerken/): Achterstevoren afspelen, de snelheid wijzigen, een zachte opname optillen. Alles hier, op je eigen apparaat.
- [Pdf samenvoegen & splitsen](https://abox.tools/nl/pdf-samenvoegen/): Pagina's verschuiven zonder ritje naar een server.
## Vragen
### Wordt mijn document ergens naartoe geüpload?
Nee. De foto wordt door je eigen browser op je eigen hardware gedecodeerd, rechtgetrokken, opgeschoond en in een PDF geschreven. Dit gereedschap heeft geen enkele netwerkfunctie — het haalt nooit iets op en verstuurt nooit iets — en het `Content-Security-Policy` van de pagina noemt elk adres dat hij mag benaderen, en geen daarvan hoort bij deze site. Laad de pagina één keer, trek de stekker uit het internet, en hij werkt nog steeds.
### Hoe vindt hij de hoeken van de pagina zonder model?
Door te zoeken naar de vier lange rechte randen waaruit een rechthoek bestaat. De foto wordt verkleind, de gradiënt wordt genomen — waar het beeld verandert, en in welke richting — en elke pixel die op een rand ligt stemt op de rechte lijn waar hij op zou liggen. De sterke lijnen worden tot kandidaat-rechthoeken gekoppeld, en elke kandidaat krijgt een score door zijn vier zijden af te lopen en te vragen hoeveel van elke zijde er werkelijk een rand onder heeft, en of die vier samen de grens van één ding zijn: een pagina is lichter dan wat eromheen ligt, of donkerder, maar op alle vier de zijden hetzelfde, en dat is wat voorkomt dat een regel tekst voor de onderkant van de pagina wordt aangezien. Er zijn geen gewichten, er wordt niets gedownload, en het rekenwerk is hetzelfde rekenwerk voor elk document dat erdoorheen gaat.
### De hoeken die hij gevonden heeft kloppen niet. Wat nu?
Sleep ze. De hoeken zijn een beginpositie en nooit een beslissing: de scan wordt genomen van waar de vier uiteindelijk staan. Druk ergens op de foto en de dichtstbijzijnde hoek springt naar je vinger, wat makkelijker is dan een klein handvat raken, en de pijltjestoetsen verplaatsen de hoek met de focus één pixel per keer. De pagina vertelt je ook wanneer de hoeken een gok zijn in plaats van een vondst, en markeert die pagina in de strook — een pagina die op een bureau van ongeveer zijn eigen kleur ligt is de gebruikelijke reden, want daar valt echt bijna geen rand te vinden.
### Waarom komt de rechtgetrokken pagina in de goede vorm uit en niet platgedrukt?
Omdat de vorm uit het perspectief wordt teruggerekend en niet van de randen wordt afgemeten. Een pagina die schuin gefotografeerd is heeft een verkorte verre rand, dus de voor de hand liggende methode — neem het langste paar tegenoverliggende randen en noem dat de verhouding — levert een zichtbaar gedrongen A4 op, en dat is wat de meeste webscanners je geven. Een foto van een rechthoek draagt in werkelijkheid genoeg informatie om zowel de verhouding van de rechthoek als de brandpuntsafstand van de camera terug te rekenen, mits de camera een gewone is; dat is een resultaat van Zhang en He uit 2003, en dat is wat `src/geometry.js` doet. Waar de foto recht van voren genomen is, is er geen perspectief om mee te werken en is dat ook niet nodig, want dan zijn de randen exact — dus valt hij daarop terug, en de pagina zegt welke van de twee het antwoord gaf.
### Wat doet het „opschonen” nu eigenlijk met het beeld?
Het deelt het licht eruit. De eigen helderheid van het papier wordt over de pagina heen gemeten — een raster van vakjes, en in elk vakje een hoog percentiel van de helderheid, dat tekst te donker en te schaars is om te verschuiven — en elke pixel wordt gedeeld door het papier zoals dat op dat punt geschat is. Wat overblijft is de inkt, gelijkmatig belicht, zonder de schaduw en zonder de afval van licht naar de randen. Dat is niet hetzelfde als het contrast verhogen: het contrast van een gefotografeerde pagina verhogen maakt het lichte deel wit, het donkere deel zwart, en wat er in het donkere deel staat onleesbaar, en daarom maken „automatische niveaus” deze beelden slechter in plaats van beter.
### Waarom is de zwart-witmodus zoveel kleiner?
Omdat een beeld met twee kleuren erin werkelijk een fractie is van de gegevens van een beeld met zestien miljoen, en het wordt hier ook zo opgeslagen: één bit per pixel, acht per byte ingepakt en exact gecomprimeerd, en niet als een JPEG van een zwart-witbeeld. Op dezelfde pagina's komt het er ongeveer achttien keer kleiner uit dan de kleurmodus, dus een contract van twintig pagina's blijft onder een megabyte in plaats van rond de vijftien te landen. De drempel is die van Sauvola, die elke pixel beoordeelt tegen het gemiddelde en de spreiding van zijn eigen omgeving in plaats van tegen één getal voor de hele pagina — en dat is wat het schrift binnen een schaduw leesbaar houdt. Hij kent geen halftonen, dus een pagina met een foto erop kan beter een van de andere modi nemen.
### Kan ik meerdere pagina's in één PDF zetten?
Ja. Elke foto die je toevoegt wordt een volgende pagina, in de volgorde waarin ze staan, en elke pagina houdt haar eigen hoeken — dus een stapel pagina's die na elkaar gefotografeerd is wordt één document. De pijltjes bij elke pagina in de strook verplaatsen haar naar voren of naar achteren. De opschoon-instelling wordt met opzet door allemaal gedeeld: pagina's in één document die verschillend opgeschoond zijn, zien eruit als twee documenten.
### Leest hij de tekst, zodat ik de PDF kan doorzoeken?
Nee. Er is geen tekstlaag en geen tekenherkenning: wat eruit komt is een beeld van de pagina op een pagina. Het goed doen zou een OCR-motor betekenen, en dat zijn tientallen megabytes aan model om te downloaden — en een documentscanner die een model ophaalde voordat hij je loonstrook kon lezen, zou een documentscanner zijn met een reden om over loonstroken naar huis te bellen. Als je de tekst nodig hebt, levert de zwart-witmodus precies het soort bestand op waar OCR-software op je eigen machine het beste mee werkt.
### Hij is wazig geworden. Waarom?
Bijna altijd omdat de pagina klein was in de foto. Het paneel onder het voorbeeld zegt hoeveel van het beeld de pagina vulde en ongeveer hoeveel punten per inch dat oplevert op een vel van dat formaat — onder zo'n 150 DPI ziet een afgedrukte scan er slap uit, en geen enkel gereedschap kan iets doen aan detail dat nooit in het bestand heeft gezeten. Ga dichterbij staan in plaats van in te zoomen, houd stil, en laat de camera scherpstellen op de pagina voordat je op de knop drukt. Bewegingsonscherpte is de andere oorzaak, en die is ook niet terug te halen.
### Is het gratis, en heb ik een account nodig?
Het is gratis, en er is geen account, geen inloggen, geen proefperiode, geen paginalimiet en geen watermerk. Er is ook geen limiet op de grootte van de foto's, want er is geen server die ervoor betaalt — het werk gebeurt op je eigen machine. De site draait advertenties, en dat is wat hem betaalt; de adverteerders krijgen niets over je documenten.
## Hoe je de privacybelofte controleert
- **Je documenten kunnen nergens heen.** Het Content-Security-Policy noemt elk adres dat deze pagina mag benaderen, en geen enkel adres daarvan hoort bij deze site. Er is hier geen eindpunt waar je foto's verzameld zouden kunnen worden, en niets in de code dat ze zou versturen als dat er wel was.
- **Er is geen model, dus er valt niets te downloaden en niets te vragen.** De vier hoeken van een pagina vinden gebeurt met rekenwerk: de gradiënt van het beeld, een stem voor de rechte lijnen erin, en een controle van wat er werkelijk onder elke zijde van de winnende rechthoek ligt. Geen gewichten, geen inferentie-runtime, niets dat bij het eerste gebruik opgehaald wordt, en niets dat zich bij het document van iemand anders anders gedraagt dan bij het jouwe — zie `src/detect.js`.
- **Het document draagt geen datum, geen auteur en geen machinenaam.** Een scan is iets dat mensen naar andere mensen sturen, meestal omdat een instantie erom gevraagd heeft. Het enige wat er behalve de pagina's zelf in de PDF geschreven wordt is de naam van dit gereedschap, en een titel als je er een typt. Er is geen aanmaakdatum, geen auteur, geen serienummer en niets dat is afgeleid van je klok, je bestandsnamen of je computer — zie `src/document.js`.
- **Hier haalt niets iets op.** Er staat geen `fetch`, geen `XMLHttpRequest` en geen `sendBeacon` ergens in `src/`. Het werk is `getImageData`, wat lussen over de bytes, en de eigen JPEG-encoder van de browser — allemaal al geïnstalleerd op je machine.
- **Het werkt offline.** Verbreek de verbinding en het gereedschap is onveranderd, want er heeft nooit een netwerkstap in gezeten. Dat is het eenvoudigste bewijs van allemaal — en het bewijs dat het waard is te draaien voordat je een paspoort scant.
**Controleer het zelf.** Je hoeft niets van het bovenstaande op ons woord aan te nemen. Een buildscript maakt deze pagina uit de sjablonen en de configuratie in de repository, en dat script kun je lezen en zelf draaien. Het resultaat staat vastgelegd op de branch `dist`, dus je kunt wat er geserveerd wordt vergelijken met wat een build van de bronnen oplevert: https://github.com/A-Box-of-Tools/website
De bestanden die je als eerste wilt lezen zijn `config/site.toml` voor de Content-Security-Policy, `src/detect.js` voor hoe de hoeken zonder enig model gevonden worden, `src/warp.js` voor het rechttrekken, en `src/clean.js` voor hoe het ongelijke licht eruit gedeeld wordt.
Zo scan je een document met de camera van je telefoon
Fotografeer de pagina. Van boven, met de hele pagina in beeld en de vier hoeken zichtbaar of bijna. Hij hoeft niet recht van voren en hij hoeft niet gelijkmatig belicht: de hoek en de schaduw zijn waar dit gereedschap voor is. Wat wel uitmaakt is het beeld vullen — een pagina die van de andere kant van de kamer gefotografeerd is, heeft geen detail meer om terug te halen.
Controleer de vier hoeken. Ze worden voor je gevonden zodra de foto gelezen is, en de pagina zegt het als hij het niet zeker weet — een pagina op een bureau van dezelfde kleur als het papier heeft werkelijk een rand die nauwelijks te zien is. Druk ergens op de foto en de dichtstbijzijnde hoek komt naar je vinger toe, of bereik er een met Tab en verplaats hem met de pijltjestoetsen.
Kies wat er met het licht moet gebeuren. „Kleur, gelijkgetrokken” meet het papier over de pagina heen en deelt het eruit, zodat de schaduw verdwijnt en een stempel of een handtekening zijn kleur houdt. „Zwart-wit” gaat verder en is wat een scan klein genoeg maakt om te mailen. Wat je op het scherm ziet is het echte resultaat, gemaakt door dezelfde code die het bestand schrijft.
Voeg de andere pagina's toe. Elke foto die je toevoegt wordt een volgende pagina van hetzelfde document, in de volgorde waarin ze staan, en elke pagina houdt haar eigen hoeken. De pijltjes bij een pagina in de strook verplaatsen haar naar voren of naar achteren.
Sla de PDF op, en open hem voordat je hem verstuurt. Het document wordt hier opgebouwd, in het geheugen van deze pagina. Er is niets geüpload om het te maken, en er is nergens iets over gemeld.
De uitgebreide versie
Hoe je een document scant met je telefoonWat een foto van een pagina scheidt van een scan ervan: de hoek, het ongelijke licht en de bestandsgrootte. Hoe je de foto maakt, wat je daarna herstelt, en waarom er nergens een server aan te pas komt.
Nee. De foto wordt door je eigen browser op je eigen hardware gedecodeerd, rechtgetrokken, opgeschoond en in een PDF geschreven. Dit gereedschap heeft geen enkele netwerkfunctie — het haalt nooit iets op en verstuurt nooit iets — en het Content-Security-Policy van de pagina noemt elk adres dat hij mag benaderen, en geen daarvan hoort bij deze site. Laad de pagina één keer, trek de stekker uit het internet, en hij werkt nog steeds.
Hoe vindt hij de hoeken van de pagina zonder model?
Door te zoeken naar de vier lange rechte randen waaruit een rechthoek bestaat. De foto wordt verkleind, de gradiënt wordt genomen — waar het beeld verandert, en in welke richting — en elke pixel die op een rand ligt stemt op de rechte lijn waar hij op zou liggen. De sterke lijnen worden tot kandidaat-rechthoeken gekoppeld, en elke kandidaat krijgt een score door zijn vier zijden af te lopen en te vragen hoeveel van elke zijde er werkelijk een rand onder heeft, en of die vier samen de grens van één ding zijn: een pagina is lichter dan wat eromheen ligt, of donkerder, maar op alle vier de zijden hetzelfde, en dat is wat voorkomt dat een regel tekst voor de onderkant van de pagina wordt aangezien. Er zijn geen gewichten, er wordt niets gedownload, en het rekenwerk is hetzelfde rekenwerk voor elk document dat erdoorheen gaat.
De hoeken die hij gevonden heeft kloppen niet. Wat nu?
Sleep ze. De hoeken zijn een beginpositie en nooit een beslissing: de scan wordt genomen van waar de vier uiteindelijk staan. Druk ergens op de foto en de dichtstbijzijnde hoek springt naar je vinger, wat makkelijker is dan een klein handvat raken, en de pijltjestoetsen verplaatsen de hoek met de focus één pixel per keer. De pagina vertelt je ook wanneer de hoeken een gok zijn in plaats van een vondst, en markeert die pagina in de strook — een pagina die op een bureau van ongeveer zijn eigen kleur ligt is de gebruikelijke reden, want daar valt echt bijna geen rand te vinden.
Waarom komt de rechtgetrokken pagina in de goede vorm uit en niet platgedrukt?
Omdat de vorm uit het perspectief wordt teruggerekend en niet van de randen wordt afgemeten. Een pagina die schuin gefotografeerd is heeft een verkorte verre rand, dus de voor de hand liggende methode — neem het langste paar tegenoverliggende randen en noem dat de verhouding — levert een zichtbaar gedrongen A4 op, en dat is wat de meeste webscanners je geven. Een foto van een rechthoek draagt in werkelijkheid genoeg informatie om zowel de verhouding van de rechthoek als de brandpuntsafstand van de camera terug te rekenen, mits de camera een gewone is; dat is een resultaat van Zhang en He uit 2003, en dat is wat src/geometry.js doet. Waar de foto recht van voren genomen is, is er geen perspectief om mee te werken en is dat ook niet nodig, want dan zijn de randen exact — dus valt hij daarop terug, en de pagina zegt welke van de twee het antwoord gaf.
Wat doet het „opschonen” nu eigenlijk met het beeld?
Het deelt het licht eruit. De eigen helderheid van het papier wordt over de pagina heen gemeten — een raster van vakjes, en in elk vakje een hoog percentiel van de helderheid, dat tekst te donker en te schaars is om te verschuiven — en elke pixel wordt gedeeld door het papier zoals dat op dat punt geschat is. Wat overblijft is de inkt, gelijkmatig belicht, zonder de schaduw en zonder de afval van licht naar de randen. Dat is niet hetzelfde als het contrast verhogen: het contrast van een gefotografeerde pagina verhogen maakt het lichte deel wit, het donkere deel zwart, en wat er in het donkere deel staat onleesbaar, en daarom maken „automatische niveaus” deze beelden slechter in plaats van beter.
Waarom is de zwart-witmodus zoveel kleiner?
Omdat een beeld met twee kleuren erin werkelijk een fractie is van de gegevens van een beeld met zestien miljoen, en het wordt hier ook zo opgeslagen: één bit per pixel, acht per byte ingepakt en exact gecomprimeerd, en niet als een JPEG van een zwart-witbeeld. Op dezelfde pagina's komt het er ongeveer achttien keer kleiner uit dan de kleurmodus, dus een contract van twintig pagina's blijft onder een megabyte in plaats van rond de vijftien te landen. De drempel is die van Sauvola, die elke pixel beoordeelt tegen het gemiddelde en de spreiding van zijn eigen omgeving in plaats van tegen één getal voor de hele pagina — en dat is wat het schrift binnen een schaduw leesbaar houdt. Hij kent geen halftonen, dus een pagina met een foto erop kan beter een van de andere modi nemen.
Kan ik meerdere pagina's in één PDF zetten?
Ja. Elke foto die je toevoegt wordt een volgende pagina, in de volgorde waarin ze staan, en elke pagina houdt haar eigen hoeken — dus een stapel pagina's die na elkaar gefotografeerd is wordt één document. De pijltjes bij elke pagina in de strook verplaatsen haar naar voren of naar achteren. De opschoon-instelling wordt met opzet door allemaal gedeeld: pagina's in één document die verschillend opgeschoond zijn, zien eruit als twee documenten.
Leest hij de tekst, zodat ik de PDF kan doorzoeken?
Nee. Er is geen tekstlaag en geen tekenherkenning: wat eruit komt is een beeld van de pagina op een pagina. Het goed doen zou een OCR-motor betekenen, en dat zijn tientallen megabytes aan model om te downloaden — en een documentscanner die een model ophaalde voordat hij je loonstrook kon lezen, zou een documentscanner zijn met een reden om over loonstroken naar huis te bellen. Als je de tekst nodig hebt, levert de zwart-witmodus precies het soort bestand op waar OCR-software op je eigen machine het beste mee werkt.
Hij is wazig geworden. Waarom?
Bijna altijd omdat de pagina klein was in de foto. Het paneel onder het voorbeeld zegt hoeveel van het beeld de pagina vulde en ongeveer hoeveel punten per inch dat oplevert op een vel van dat formaat — onder zo'n 150 DPI ziet een afgedrukte scan er slap uit, en geen enkel gereedschap kan iets doen aan detail dat nooit in het bestand heeft gezeten. Ga dichterbij staan in plaats van in te zoomen, houd stil, en laat de camera scherpstellen op de pagina voordat je op de knop drukt. Bewegingsonscherpte is de andere oorzaak, en die is ook niet terug te halen.
Is het gratis, en heb ik een account nodig?
Het is gratis, en er is geen account, geen inloggen, geen proefperiode, geen paginalimiet en geen watermerk. Er is ook geen limiet op de grootte van de foto's, want er is geen server die ervoor betaalt — het werk gebeurt op je eigen machine. De site draait advertenties, en dat is wat hem betaalt; de adverteerders krijgen niets over je documenten.