Att hyra en PDF

Här om dagen testade jag en tjänst för att hyra en artikel bakom en betalvägg (man kunde testa tjänsten och hyra en fil gratis).

När man hyr en artikel får man tillgång att läsa den online via webbläsaren under ett visst antal dagar och det går inte att spara hem texten. Jag frågade mig om det verkligen var helt omöjligt att spara hem texten och började experimentera. Visst, det gick inte att kopiera text från skärmen. Förmodligen hade den rendrerats till en bild innan den visades i webbläsaren. Istället för att gräva djupare i hur det fungerade tog jag istället en skärmdump när jag hade första sidan uppe. Sen scrollade jag till nästa sida och tog en ny skärmdump osv. Det blev 16 sidor totalt och 16 png-bilder.

För att läsa ut text från bitmap-bilder används en teknik som kallas OCR (Optical Character Recognition). Efter lite sökning kom jag fram till att det bästa open source/free software alternativet verkade vara tesseract (Apache 2.0 License). Jag testade att installera via pakethanteraren i gentoo men det funkade inte alls. Programmet krashade med en segfault. Samma sak hände under macports. Men jag fick det att funka genom att ladda ned källkoden till den senaste versionen (svn co http://tesseract-ocr.googlecode.com/svn/trunk). Då visade det sig att tesseract beror på biblioteket leptonica och det fanns inte ens till gentoo (dock finns det i macports och funkar där). Efter att installerat först leptonica och sen tesseract från källkod så funkade det … nästan. Man fick kopiera språkfilerna till katalogen share/tessdata också. Sen funkade det faktiskt, men bara för tif-filer.

Nästa problem var att det blev en hel del skräptecken. Då fick jag en snilleblixt och tänkte att jag klipper ut endast texten och dessutom skalar upp den till dubbel storlek. Eftersom texten hamnade ungefär på samma plats på varje sida gjorde jag ett scheme-script till gimp så att jag skulle slippa göra samma sak 16 ggr.

#!/bin/sh

# Take image $1, crop it at rectangle (80,20) 772x1200
# and double the size to 1544x2400.
# Save as $2.

ORIGIN_X=80
ORIGIN_Y=20
W1=772
H1=1200
W2=$((${W1} * 2))
H2=$((${H1} * 2))

# Check arguments
if ! test -f "$1"; then
    echo "Usage: $0 <in.png> <out.tif>"
    exit 1
fi

# Gimp script interpreter (script_fu or python_fu)
intr='plug-in-script-fu-eval'

# Script-Fu script.
fu="\
  (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE \"$1\" \"$1\"))) \
  (drawable (car (gimp-image-get-active-layer image)))) \
  (gimp-image-crop image $W1 $H1 $ORIGIN_X $ORIGIN_Y) \
  (gimp-image-scale image $W2 $H2)
  (gimp-file-save RUN-NONINTERACTIVE image drawable \"$2\" \"$2\") \
  (gimp-image-delete image))"

gimp -i --batch-interpreter $intr -b "$fu (gimp-quit 0)" || exit 1

Det går lika bra att klippa ut texten från skärmdumpen manuellt i gimp (markera och välj image->crop to selection) och sen skala upp via menyn image->scale image och till sist spara den nya bilden (med ändelsen .tif så att tesseract kan läsa den).

Efter detta funkade tesseract perfekt. Kommandot:

tesseract bild.tif bild -l eng

skapade en närmast perfekt bild.txt. Jag behövde endast fixa till fotnoterna (som var skrivna med en mindre font). Upprepa för alla bilder.

Advertisements

Om albertveli

Grävande programmerare.
Det här inlägget postades i Linux/DIY, Programmering, Uncategorized. Bokmärk permalänken.

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s