Problema: un documento PDF in A3 orientamento landscape da mandare in stampa automaticamente su carta A4.
Il documento originale contiene le informazioni sul formato pagina (in punti) e sull'orientamento:
/Type/Page/MediaBox [0 0 842 1191] /Rotate 90
Purtroppo il comando gs
come filtro di stampa o attraverso il comando pdf2ps
produce un documento PostScript che include il seguente snippet:
%%PageBoundingBox: 0 0 1191 842
cioè la pagina rimane un A4 landscape e questo crea problemi in fase di stampa.
Una soluzione è utilizzare pdftops
(fornito dal pacchetto poppler-utils) che non aggiunge le informazioni sulla PageBoundingBox
e quindi effettuare la rotazione/ridimensionamento con epsffit
(pacchetto psutils):
pdftops -eps document.pdf - | epsffit -m -c 0 0 595 842 > document.eps
L'intero documento originale viene incapsulato e ridimensionato in un A4, quindi è bene che sia di una singola pagina. L'opzione -m
seleziona l'orientamento più conveniente.
Una stampa preparata con gs
a partire da un file PostScript può essere shiftata con un opportuno comando PostScript.
Basta creare un file (ad esempio offset.ps
) che indichi ad esempio 1/2 pollice (36 punti) di offset verso sinistra e 1 pollice (72 punti) verso il basso:
<</PageOffset [-36 72]>> setpagedevice
quindi creare la pagina per la stampa con:
gs -dNOPAUSE -dQUIET -sDEVICE=laserjet -r600x600 -sOutputFile=file.pcl offset.ps file.ps -c quit
pdftoppm -r 360 file.pdf file_ppm
convert -units pixelsperinch -density 150 -quality 100 input.pdf output.jpg
per rimuovere eventuali trasparenze e sostituirle con uno sfondo bianco e per forzare l'output in RGB (altrimenti si potrebbe avere l'errore “RGB color space not permitted on grayscale PNG”):
convert -units pixelsperinch -density 300 \ -background white -alpha remove -define png:color-type=6 \ input.pdf output.png
Potrebbe capitare l'errore durante la conversione:
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
In tal caso è necessario rimuovere queste righe dal file /etc/ImageMagick-6/policy.xml:
<!-- disable ghostscript format types --> <policy domain="coder" rights="none" pattern="PS" /> <policy domain="coder" rights="none" pattern="PS2" /> <policy domain="coder" rights="none" pattern="PS3" /> <policy domain="coder" rights="none" pattern="EPS" /> <policy domain="coder" rights="none" pattern="PDF" /> <policy domain="coder" rights="none" pattern="XPS" />
Il comando pdftk
è contenuto nell'omonimo pacchetto Debian. Come estrarre da pag. 6 a pag. 14:
pdftk A=document.pdf cat A6-14 output document_p6-14.pdf
È possibile estrarre intervalli diversi con una sola riga di comando indicandoli in successione, ad esempio: cat A1-104 A107-118.
Si utilizza il pdftk
contenuto nel pacchetto Debian pdftk-java:
pdftk "part1.pdf" "part2.pdf" cat output "document.pdf"
Un sistema più lento, ma più efficiente (impiega più tempo, ma può produrre documenti PDF più piccoli) è utilizzare direttamente gs:
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=output.pdf doc1.pdf doc2.pdf ...
In alternativa esiste il comando pdfunite
è contenuto nel pacchetto Debian poppler-utils:
pdfunite part1.pdf part2.pdf document.pdf
ATTENZIONE: Il comando pdfunite (almeno con Debian 11 Bullseye) produce un PDF con problemi, per cui risulta impossibile manipolare i metadati. Ad esempio utilizzando il comando pdftk con l'opzione update_info (vedi esempio in questa pagina) si ottiene l'errore:
pdftk Error in UpdateInfo(): no Info dictionary found; Warning: no Info added to output PDF.
Anche il tool exiftool ha problemi a modificare i metadati su un file prodotto da pdfunite:
exiftool -Title="Book Title" -Author="John Doe" pdfunite_doc.pdf Error: Objects in xref table (367) exceed trailer dictionary Size (358) - united-pdfunite.pdf 0 image files updated 1 files weren't updated due to errors
Per convertire correttamente in PDF definendo la dimensione della pagina e la risoluzione, vedere le istruzioni per la conversione di immagini acquisite con scanner.
Se un documento è in formato diverso da quello desiderato (lo si appura con pdfinfo
) si può alterare il formato pagina con pdfjam
(dal pacchetto Debian texlive-extra-utils), ecco un esempio di conversione in formato A4:
pdfjam --outfile document-a4.pdf --paper a4paper document.pdf
È possibile specificare le dimensioni esatte della pagina, ad esempio in punti tipografici:
pdfjam --papersize '{728.39pt,560.519pt}' --outfile output.pdf document.pdf
È possibile reimpaginare un documento in modo che una singola pagina contenga due o più pagine dell'originale. Ad esempio per affiancare pagine pari e dispari si usa la geometria 2×1:
pdfjam --nup 2x1 --landscape --outfile facing-pages.pdf document.pdf
Esempio: un documento contiene le pagine pari e dispari affiancate in una singola pagina e si desidera separarle. Si utilizza il comando mutool contenuto nel pacchetto Debian mupdf-tools:
mutool poster -x 2 doc-facing-pages.pdf output.pdf
ATTENZIONE: Eventuali immagini contenute in una pagina vengono raddoppiate nel documento finale, probabilmente ogni sottopagina creata contiene un riferimento alla stessa. È possibile utilizzare gs per una elaborazione finale che rimuove i doppioni:
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=output.pdf \ -dDetectDuplicateImages=true document.pdf
ATTENZIONE: In realtà il parametro DetectDuplicateImages rimuove gli oggetti duplicati, ma i riferimenti “doppioni” nel documento restano, semplicemente punteranno allo stesso ID oggetto.
Anzitutto si estrae dal pdf i metadati esistenti:
pdftk document.pdf dump_data output metadata.txt
nel file metadata.txt che viene generato è possibile aggiungere sezioni del tipo:
BookmarkBegin BookmarkTitle: L'età della pietra BookmarkLevel: 1 BookmarkPageNumber: 159
Eventuali caratteri non ASCII vanno codificati con il codice numerico HTML. Infine si genera il nuovo pdf prendendo i metadati dal file modificato:
pdftk document.pdf update_info metadata.txt output new_document.pdf
Il formato epub è sicuramente più flessibile perché si adatta automaticamente alle dimensioni dello schermo del viewer, ecc., ma non tutti hanno un visualizzatore epub sul telefonino, mentre un visualizzatore PDF è molto più comune.
Ecco quindi come convertire nel formato PDF ingrandendo il testo in modo che sia leggibile in modalità pagina intera senza dover effettuare zoom. Inoltre la dimensione della pagina è stata impostata con un rapporto larghezza:altezza pari a 9:15, in modo che sfrutti quasi tutto lo schermo di uno smartphone 9:16:
ebook-convert input_file.epub output_file.pdf --unit point --custom-size 594x992 --base-font-size 19
Il comando ebook-convert viene installato con il pacchetto Debian calibre.
Se si dispone di diverse pagine in formato SVG è possibile creare un unico PDF utilizzando il tool rsvg-convert (dal pacchetto Debian librsvg2-bin). Questa la riga di comando:
rsvg-convert --format pdf --keep-aspect-ratio --output output.pdf page*.svgz