Scripting fun in Linux: purifying scanned PDF files
Am o carte în PDF care e scanată abject. Și vreau să continui să o citesc dar e dificil pentru ochi. O pagină arată cam așa:
E singura copie pe care am găsit-o online. Să o citești pe ecranul eInk al eReaderului Sony e nasol, că arată bizar și fondul e gri:
Așa că prelucrez puțin PDF-ul în Linux. Așa – la modul ”bulk”. Întâi extrag toate imaginile paginilor scanate într-un folder:
pdfimages A_place_on_the_corner.pdf corner/
Asta crează vreo 8GB de fișiere *.pbm și *.ppm. Partea mișto e că PNM-urile conțin scan-urile colilor defalcate, cu umbre cu tot, iar cele PBM negativul lor.

Fișier PNM.

Fișier PBM corespondent.
Vreau doar negativul: text alb pe fond negru, fără culor gălbui, umbre și alte chestii așa că șterg toate fișierele și păstrez doar ce-i *.pbm. Acum convertesc PBM-urile în PNG cu
find -name '*.pbm' -print0 | xargs -0 -r mogrify -format png
Asta crează PNG-uri în același folder și acum pot șterge PBM-urile cu
rm *.pbm
Acum am toată cartea în negativ, vreau culorile inversate. Folosim atributul -negate al lui convert:
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" -negate "${0%.png}.jpg"'

Looking better already…
Ștergem PNG-urile cu
rm *.png
Acum doar îmbunătățim contrastul JPG-urilor ca negul să fie negru 100%:
ls -1 *.jpg | xargs -n 1 bash -c 'convert "$0" -level 60 "${0%.jpg}.jpg"'
Dăm resize la imagini ca să nu iasă un PDF gigant (fiecare coală are 4000+px lungime, nu am nevoie de mărimea asta): Folosim mogrify:
ls -1 *.jpg | xargs -n 1 bash -c 'mogrify "$0" -resize 50% "${0%.jpg}.jpg"'
Și mai rămâne doar să alcătuim un nou PDF:
convert *.jpg a_place_on_the_corner.pdf
Aici m-am lovit de problema limitării de memorie din ImageMagick: 256MB RAM respectiv 1GB spațiu stocare în cache pentru fișiere. Așa că am editat policy.xml:
sudo nano /etc/ImageMagick-6/policy.xml
Și am modificat valorile adăugând random valori mai mari:
Salvat fișierul și rulat comanda din nou:
convert *.jpg a_place_on_the_corner.pdf
Vă mănâncă spațiul de pe disc și durează mult (în funcție de numărul de pagini) dar își face treaba. Rezultatul e un PDF măricel dar arătos care se poate citi bine pe eReader. Am dat ulterior la mogrify încă un -resize 50% ca să fac PDF-ul și mai mic în dimensiune apoi am rulat din nou convert în PDF până ce-a ieșit ceva de vreo 122MB.
Rezultatul e mai jos:

Before and after

Crisp text on eInk.

Contrast bun. Text mult mai lizibil.
The post Scripting fun in Linux: purifying scanned PDF files appeared first on Razvan T. Coloja.