Posted on oct. 4, 2018 | 0 comments

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:

<policy domain="resource" name="memory" value="2256MiB"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="width" value="16KP"/>
<policy domain="resource" name="height" value="16KP"/>
<policy domain="resource" name="area" value="128MB"/>
<policy domain="resource" name="disk" value="20GiB"/>

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.

Încă un exemplu, două zile mai târziu – alt PDF:

Textul e mai lizibil așa și au dispărut și rândurile tipărite care răzbat de pe partea cealaltă a foii. Galbenul maroniu a fost înlocuit de fond alb care este permite un contrast mai bun text/background pe ecranele eInk. Petele de pe foile cărții au dispărut și ele în mare parte după conversie.