At markere artikler er det langsomste led i at få en avis online. En redaktør tegner en boks om hver artikel, så læserne kan klikke på den, og skriver eller indsætter derefter rubrik og tekst. Men den PDF, der gik til trykkeriet, indeholder allerede hvert ord og dets præcise position. I Inkfold 1.1 bruger vi de koordinater: tegn boksen, så udfyldes rubrik og tekst af sig selv.
Teksten læses i browseren
Inkfold importerede allerede PDF’er i browseren med pdf.js og gengav hver side som billede, så serveren ikke behøver ekstra software. Det samme bibliotek giver adgang til tekstlaget via getTextContent(): en liste af tekststykker med hver sin transformationsmatrix og bredde. Ganges hvert stykkes matrix med sidevisningens transformation, får man positionen i sidepixels; skriftstørrelsen er længden af matrixens lodrette vektor, og stykkets top er grundlinjen minus denne størrelse.
Tekststykker er brudstykker, ikke linjer, så vi sorterer dem efter position og samler naboer, der deler grundlinje (inden for en halv teksthøjde) og ligger tæt vandret. Hver linje gemmes som brøkdele af sidens størrelse, samme koordinatsystem som artikelområderne bruger, og sendes til serveren lige efter, at sidebilledet er uploadet.
Eller på serveren, når værktøjerne er der
Nogle udgivere foretrækker at konvertere store PDF’er på serveren. Har serveren Imagick-udvidelsen eller Ghostscript, kan redaktøren uploade PDF’en og lade serveren gengive siderne i 150 dpi. Er Popplers pdftotext installeret, giver dens -bbox-layout-output de samme linjekoordinater, som vi normaliserer til samme format. Uden disse værktøjer virker alt stadig i browseren.
Fra en boks til rubrik og brødtekst
Når redaktøren tegner et område, er udvælgelsen af linjer enkel: alle linjer, hvis midtpunkt ligger i boksen. Hvilke linjer der er rubrikken, afgøres af typografien frem for gætværk: linjer, hvis højde er mindst 85 procent af den højeste linje i området. Resten er brødtekst.
Brødtekst i en avis løber i spalter, så læste man linjerne strengt oppefra og ned, ville de blive blandet. Vi grupperer linjerne i spalter efter venstrekant med en tolerance på cirka 3,5 procent af sidebredden, læser spalterne fra venstre mod højre og hver spalte oppefra og ned. Orddelinger ved linjeskift samles, så “repa-” efterfulgt af “ration” bliver til “reparation”.

Den samme logik findes to steder: i PHP, så en artikel gemt uden tekst udfyldes på serveren, og i JavaScript, så mapperen kan udfylde formularen i det øjeblik boksen tegnes og tilbyde knappen “Udfyld fra PDF’en” til eksisterende artikler. Hele sidens tekst gemmes også som søgbar sidetekst, så sitesøgningen også finder ord i annoncer og billedtekster.
Det vigtigste
- Den trykte PDF er struktureret data: brug tekstlaget i stedet for at skrive af.
- Normalisér alle koordinater til brøkdele af siden, så tekst og områder deler ét system.
- Find rubrikker ud fra skriftstørrelse, og læs brødtekst spalte for spalte.
- Tilbyd konvertering på serveren som en mulighed, aldrig som et krav.
Tidligere i serien: en flersproget læser fra højre mod venstre. Prøv artikelmapperen i Inkfold-demoens redaktion; softwaren fås hos Charming Theme.
Har du PDF’er, scanninger eller trykfiler, der skal blive til struktureret indhold? Lad os tale sammen — ArtinTech Solution bygger dokumentværktøjer til udgivere.