User Tools

Site Tools


doc:appunti:prog:pdf

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:

<</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

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:

  <!-- 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" />

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 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 2×1:

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&#224; 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

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
doc/appunti/prog/pdf.txt · Last modified: 2024/08/19 10:30 by niccolo