[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