====== Ricette PDF e PostScript ======
===== Ruotare e scalare automaticamente un PDF per la stampa =====
**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.
===== Shift di una pagina PostScript =====
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:
<> setpagedevice
quindi creare la pagina per la stampa con:
gs -dNOPAUSE -dQUIET -sDEVICE=laserjet -r600x600 -sOutputFile=file.pcl offset.ps file.ps -c quit
===== Rasterizzazione di un PDF =====
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**:
===== Estrazione di alcune pagine =====
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%%**.
===== Unione di più documenti =====
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
===== Conversione di raster in PDF =====
Per convertire correttamente in PDF definendo la dimensione della pagina e la risoluzione, vedere le [[..:software:convert_pdf#dimensione_pagina|istruzioni per la conversione di immagini acquisite con scanner]].
===== Modifica del formato pagina =====
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
===== Raggruppare pagine pari e dispari =====
È 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 2x1:
pdfjam --nup 2x1 --landscape --outfile facing-pages.pdf document.pdf
===== Dividere le pagine in due o più pagine =====
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.
===== Creazione dei bookmark (indice) =====
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 [[http://www.ascii.cl/htmlcodes.htm|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
===== Conversione da epub a PDF per smartphone =====
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**.
===== Creazione PDF da pagine SVG =====
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