Skip to navigation
Logo Penaz's Area

cat /dev/random > penaz

Manipoliamo i PDF con PdfTk e PyPDF


Vediamo come dividere le diapositive di una presentazione in modo da renderle più leggibili sui lettori ebook usando Python,PyPDF e PdfTk.

Buongiorno a tutti, qualche tempo fa ho comprato un lettore di libri elettronici (meglio conosciuto come ebook-reader o ereader) che uso anche per esigenze di studio. Un uso che trovo molto utile è quello di rileggere le diapositive in formato PDF in modo da velocizzare e semplificare lo studio, purtroppo molto di frequente viene adottata la forma "quattro diapositive per pagina", come potete ben immaginare ciò rende molto difficoltosa la lettura su un ereader da 6''. Anche se il mio ereader è dotato di una funziona di zoom questa occupa gran parte del mio tempo, inoltre i metodi che usano imagemagick ritornano dei PDF di qualità pessima, perciò ho deciso di mettermi all'opera con python e un piccolo pacchetto di librerie: PyPDF.

L'obiettivo principale è quello di creare un PDF con le pagine già separate, ma per un difetto della libreria mi ritrovavo sempre con un documento con "n" copie dell'ultima pagina, perciò ho dovuto creare "n" file PDF (uno per ogni pagina) per poi usare PdfTk per riunirle in un unico file. Vediamo come.

Iniziamo installando i pacchetti necessari, nel mio caso:

emerge pyPdf pdftk

Dopo l'installazione ho scritto il seguente script che cerca di ovviare alle problematiche della libreria:

#!/usr/bin/env python
from pyPdf import PdfFileWriter,PdfFileReader
output=PdfFileWriter()
input1=PdfFileReader(file("file.pdf","rb"))
count=0
numpg=input1.getNumPages()
#codice per lo splitting
#ricavo la pagina
for i in xrange(0,numpg):
    pg=input1.getPage(i)
    #Prima Pagina (alto sinistra)
    pg.mediaBox.setUpperRight((297.61,421))
    outputstream=file(str(count)+".pdf","wb")
    output.addPage(pg)
    output.write(outputstream)
    pg.mediaBox.setUpperRight((595.22,842))
    outputstream.close()
    del output, outputstream
    count+=1
    #Reset Dell'output
    output=PdfFileWriter()
    #Seconda Pagina (Alto Destra)
    pg.mediaBox.setLowerRight((297.61,421))
    outputstream=file(str(count)+".pdf","wb")
    output.addPage(pg)
    output.write(outputstream)
    pg.mediaBox.setLowerRight((595.22,842))
    outputstream.close()
    del output, outputstream
    count+=1
    #Reset Dell'output
    output=PdfFileWriter()
    #Terza Pagina (Basso Sinistra)
    pg.mediaBox.setLowerLeft((297.61,0))
    pg.mediaBox.setUpperRight((595.22000,421))
    outputstream=file(str(count)+".pdf","wb")
    output.addPage(pg)
    output.write(outputstream)
    outputstream.close()
    pg.mediaBox.setUpperRight((595.22000,842))
    pg.mediaBox.setLowerLeft((0,0))
    count+=1
    del output, outputstream
    #Reset Dell'output
    output=PdfFileWriter()
    #Quarta Pagina (basso Destra)
    pg.mediaBox.setLowerLeft((297.61,421))
    outputstream=file(str(count)+".pdf","wb")
    output.addPage(pg)
    output.write(outputstream)
    pg.mediaBox.setLowerLeft((0,0))
    outputstream.close()
    del output, outputstream
    count+=1
    #Reset Dell'output
    output=PdfFileWriter()

Questo script prende un PDF di nome "file.pdf" e lo traduce in un gran numero di PDF numerati che corrispondono alle pagine, dopodichè è sufficiente usare PdfTk per riunirle, togliendo prima dai piedi l'originale:

mv file.pdf Fatti/file.pdf
pdftk *.pdf finale.pdf

Questo dovrebbe essere sufficiente per creare un file chiamato "finale.pdf" con tutte le pagine separate e ordinate.

Fate attenzione alle impostazioni della vostra shell, in alcuni casi l'ordinamento non è proprio quello che intendiamo noi; consideriamo per esempio una serie di 12 file pdf, e scriviamo nella shell:

pdftk *.pdf

a questo punto premiamo TAB e potrebbe accadere l'impensabile, invece di avere un globbing corretto come:

pdftk 1.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6.pdf 7.pdf 8.pdf 9.pdf 10.pdf 11.pdf 12.pdf

potremmo ritrovarci con:

pdftk 1.pdf 10.pdf 11.pdf 12.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6.pdf 7.pdf 8.pdf 9.pdf

A causa di una errata valutazione degli ordini, Attenzione!

Alla fine della fiera togliamo dai piedi il file finale e eliminiamo tutti i pdf parziali:

mv finale.pdf Finali/finale.pdf; rm *.pdf

Ed ecco il nostro bel PDF pronto per essere caricato nell'ereader alla massima qualità e senza dover fare uso dello zoom.

Buon Divertimento!

Penaz