[Python] Taglia e cuci di PDF

Daniele Varrazzo piro a develer.com
Ven 19 Set 2014 03:57:56 CEST


Ciao,

ho un problema veramente fico da risolvere: sto scrivendo un programma 
per scrivere un libro di canzoni con accordi per il mio gruppo di 
suonatori principianti di ukulele.

Scrivere una songsheet singolo è un problema che abbiamo già risolto: 
esiste un formato semi-serio che si chiama chopro con cui scrivere la 
canzone con gli accordi:

https://github.com/hammeruke/hug-chords/blob/master/chords/hug/valerie.cho

Poi si prende un parser scritto male, variabili globali e tutto il 
resto, tutto in un solo file:

https://github.com/kaj/chordlab/blob/master/chordlab

e lo si trasforma in qualcosa di un po' meno peggio (parser separato 
dal rendeder così poi magari ci facciamo l'html, fogli stile, 
soprattutto un'opzione --ukulele):

https://github.com/hammeruke/chordlab

in grado di generare un songsheet così:

http://hug.spacehobo.com/pdfs/hug/valerie.pdf

Fino a qui tutto facile. Solo che ora vorremmo mettere insieme diversi 
songsheet per fare un songbook, nell'ordine che vogliamo noi, 
tipicamente di difficoltà: dalle canzoni con tre accordi a quelle... con 
cinque? Beh, siamo principianti! Comunque, immagino che in un songbook 
uno ci voglia mettere anche qualche titolo e qualche parola qua e là, e 
soprattutto un indice. Ovviamente il punto di partenza è 
docutils/reStructuredText: è un formato che serve già a rappresentare un 
documento strutturato, ha una bella toolchain ed è estendibile. In 
particolare rst2pdf ottiene dei pdf bellini usando reportlab e anche lui 
lascia estendere bene: ha un'opzione di riga di comando apposta per 
caricare estensioni e lasciarsi monkeypatchare.

Per cui ho il mio documento che rappresenta un songbook, dove c'è una 
direttiva che permette di aggiungere delle canzoni al resto del 
documento:

https://raw.githubusercontent.com/hammeruke/hug-chords/songbook/books/sample.rst

O meglio, per ora questa direttiva non c'è: sto lavorando ad un livello 
più basso, che è una direttiva che permette di inserire un pdf qualunque 
in mezzo al documento; la direttiva "songsheet" deriverebbe da 
"include-pdf" e dietro le quinte lancerebbe chordlab per generare il pdf 
della canzone e poi includerebbe quello. Quindi si lancia rst2pdf con 
questa estensione:

https://github.com/hammeruke/hug-chords/blob/songbook/books/songbook.py

che genera un documento dove, in corrispondenza dei documenti esterni, 
inserisce una entry dell'indice e tante pagine vuote quante quelle del 
documento inserito. Quando il rendering è finito usa pyPdf per leggere 
il proprio output e per sostituire le pagine segnaposto con quelle dei 
documenti inseriti. Questo è stato un po' complicato da mettere insieme 
perché ci sono tre librerie che lavorano in maniera congiunta: docutils, 
rst2pdf, reportlab, e c'era da capire il loro modello interno e i 
passaggi da un modello all'altro, ma è stato un bel pomeriggio domenica 
scorsa.

Problema! Mi si rompe l'indice! Mannaggia. Se non sostituisco le pagine 
l'indice funziona. Ma se le rimpiazzo cliccando sull'indice il pdf non 
va da nessuna parte. Probabilmente nella pagina che rimuovo c'è l'àncora 
del punto di arrivo: l'indice punta a quella, non genericamente "a 
pagina 3". La soluzione sarebbe, sempre con pyPdf, quella di ispezionare 
la pagina da rimuovere, trovare l'ancora e iniettarla nel pdf da 
inserire...

Beh, qualcuno ha una vaga idea di come si possa fare? :) Qualcuno sa 
come sono rappresentati i (credo siano) bookmark e outline entry in un 
pdf (questi sono gli elementi che rst2pdf chiede di generare a 
reportlab), come estrarli da un pdf esistente e come iniettarli in uno 
nuovo?

A chi mi sappia suggerire una soluzione, o informazioni utili per 
risolvere il caso, andrà il privilegio di non sentirmi suonare.


-- Daniele



Maggiori informazioni sulla lista Python