Come distillare / rasterizzare un PDF in Linux


13

Nel nostro ufficio abbiamo una stampante che stampa file PDF da una chiavetta USB. Stampa la maggior parte dei file, ma presenta alcuni problemi, in particolare quelli generati con Latex. Alcuni PDF si rifiuta semplicemente di stampare, alcuni PDF vengono stampati con caratteri di tipo corriere e altri vengono stampati bene ad eccezione delle equazioni.

Sto cercando un modo per "distillare" i PDF in un formato sicuro da stampare. O semplificando / normalizzando il PDF al punto che qualsiasi renderizzatore lo renderà correttamente, o semplicemente trasformando ogni pagina in un'immagine raster di 600 dpi nel PDF. (Potrei dividere il PDF in singole immagini raster e combinarle manualmente, ma voglio qualcosa di scriptabile.)

Le dimensioni del file di output non contano, purché siano sicure per la stampa, ha un formato carta A4 (o originale) e una risoluzione di 300 ~ 600 dpi.


Forse pdf2ps potrebbe essere d'aiuto se la stampante supporta Postscript.
frlan

Dovrebbe essere una stampante PostScript, ma quel supporto è persino peggiore di quello del PDF (e non stampa PS da una chiavetta USB).
Sampo,

Risposte:


22

Dopo aver tentato senza successo alcune opzioni per rendere i caratteri come contorni (compresi questa domanda e pstoedit), ho trovato un modo per convertire facilmente il PDF in forma rasterizzata usando ImageMagick:

convert -density 600 +antialias input.pdf output.pdf

Questo crea un PDF renderizzato a 600 dpi, con antialias disattivato (non necessario a quella risoluzione).

I file di output sono enormi (~ 30 MB per un documento di 8 pagine) ed estremamente lenti per la stampa, ma dovrebbero funzionare finché la stampante ha memoria sufficiente per eseguire il rendering del contenuto.


1
Sì! Ho usato questo per appiattire i livelli nel mio PDF con grande successo. + antialias non era necessario perché avevamo solo immagini (non faceva alcuna differenza) e ho abbassato la risoluzione a 150 perché sembrava abbastanza buona per l'archiviazione senza occupare così tanto spazio. Grazie!
mlissner,

2
Nota che convertnon conserva il contenuto dei moduli che potresti aver compilato. (Volevo rasterizzare un PDF al fine di assicurarmi che i contenuti del modulo fossero uguali ovunque, in particolare che verranno visualizzati da ogni visualizzatore di PDF in primo luogo.) Per preservare il contenuto del modulo, utilizzare evince(o qualsiasi altra cosa applicazione utilizzata per compilare il modulo) per stampare il documento "in un file" - questo è un altro PDF in cui il contenuto del modulo è diventato effettivamente parte del testo normale. Quindi potresti ancora rasterizzare questo nuovo PDF, a seconda delle tue esigenze.
balu,

Si noti che questo attiva l'antialiasing ( +antialias) anziché disattivarlo ( -antialias).
xiii1408


1
Ho dovuto modificare imagemagick ( stackoverflow.com/questions/42928765/… ) per farlo funzionare.
SteveSong,

1

L'uso di imagemagick non è, secondo la mia esperienza, stabile con risoluzioni elevate e / o file di grandi dimensioni. Molte stampanti possono eseguire 1200 dpi e oltre, quindi il file rasterizzato dovrebbe avere una risoluzione simile. Una soluzione migliore è utilizzare pdf2djvu che è più veloce, più robusto e persino crea file con una dimensione che spesso rivaleggia con il PDF originale a 1200 o 2400 dpi. Questi file possono essere visualizzati e stampati usando okular o evince.

Esempio:

pdf2djvu -d 2400 file.pdf > rastered.djvu

1

Penso che il mio attuale modo preferito per farlo sia:

  1. Usa pdftoppm per convertire il file PDF in una serie di immagini.

    $ pdftoppm source.pdf output -png

  2. Usa img2pdf per creare un file pdf da quelle immagini.

    $ img2pdf * .png -o output.pdf

La buona notizia è che puoi creare uno script bash per automatizzare l'intero processo per te.

Ecco uno script bash che distillerà tutti i file pdf all'interno di una directory e preserverà gli originali in una nuova directory "originali".

#!/bin/bash

mkdir "originals";
for filename in ./*.pdf; do
    pdftoppm "$filename" output -png
    mv "$filename" ./originals
    img2pdf *.png "-o" "$filename"
    rm *.png
done

Crediti: img2pdf answer & pdftoppm answer & bash script help: 1 & 2

(Nota a margine ) Puoi installare img2pdf usando:

$ sudo apt installa img2pdf


-1

Un'altra alternativa è quella di convertire in immagini tramite qualcosa di simile

pdfimages

Dalla pagina man "Pdfimages salva le immagini da un file Portable Document Format (PDF) come file Portable Pixmap (PPM), Portable Bitmap (PBM) o JPEG. Pdfimages legge il file PDF file PDF, scansiona una o più pagine e scrive un file PPM, PBM o JPEG per ogni immagine, image-root-nnn.xxx, dove nnn è il numero dell'immagine e xxx è il tipo di immagine (.ppm, .pbm, .jpg). "

Quindi utilizzare pdftk per riconvertire in PDF https://www.pdflabs.com/docs/pdftk-cli-examples/

Infine, stampa questo file. Ovviamente, la domanda chiave è come scrivere questo.

Potresti automatizzare questo tramite una semplice pagina web di qualche tipo per gli utenti. Infine, stampano il file convertito e dovresti avere prestazioni più elevate e una stampa funzionante?


3
pdfimages estrae immagini raster incorporate da file PDF, non rasterizza il testo o la grafica vettoriale.
Sampo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.