2011-11-16 11 views
47

Ho trovato questo comando pulito per Merge PDF multipli in uno, utilizzando Ghostscript:Ghostscript per unire file PDF comprime il risultato

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf 

La dimensione risultante è inferiore alla dimensione combinata dei 2 file PDF.

L'esecuzione del comando con un singolo file come input risulta comunque in un file di output di dimensioni più ridotte.

Esiste un'opzione su Ghostscript per copiare semplicemente le pagine come appaiono nell'unione senza eseguire alcuna compressione?

In caso contrario, è possibile che la compressione di Ghostscript sia così buona da non comportare alcuna perdita di qualità?

risposta

53

Ecco alcuni additional options che è possibile passare quando si utilizza pdfwrite come dispositivo. Secondo questa pagina se non si passa nulla allora -dPDFSETTINGS si imposta su qualcosa vicino a /screen, anche se non diventa più specifico. Potresti provare a impostarlo su -dPDFSETTINGS=/prepress che dovrebbe comprimere solo cose superiori a 300 dpi.

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=out.pdf in1.pdf in2.pdf 

Un'altra alternativa è pdftk:

pdftk in1.pdf in2.pdf cat output out.pdf 
+3

Grazie per aver raccomandato pdftk. Per una semplice concatenazione di file PDF sembra perfetto. –

+1

FWIW: 'pdftk' non è disponibile per CentOS/RHEL 7. –

+0

cool .. !! Davvero –

29

Alcune delle ottimizzazioni dimensione che si osservate possono provenire da pulizia di Ghostscript da oggetti inutilizzati, la sua recente acquisizione miglioramenti di ottimizzazione dei font (si usa una recentissima versione di GS?!?) e possibilmente il re-down/campionamento dell'immagine che potrebbe essersi verificato.

Ghostscript, se utilizzato per PDF -> PDF conversioni, funziona sostanzialmente in questo modo:

  1. Read nel file di input (s) con tutti i suoi oggetti e li converte in formato interno per la pagina di grafica rappresentazioni.
  2. Effettuare le manipolazioni richieste nella riga di comando ai contenuti della pagina nel formato interno.
  3. Scrivi un PDF completamente nuovo.

Questo significa che per la maggior parte PDF -> PDF operazioni dovrete ordinamento diverso e numerazione per gli oggetti in formato PDF, e anche codice interno dell'oggetto potrebbe essere cambiato (anche se gli occhi non scoprire alcuna differenze tra PDF di input e output).

Per impostazione predefinita Ghostscript comprimerà anche tutti i flussi di oggetti che non sono stati compressi nel file originale (ma questa è una compressione senza perdita di dati).

Ora per la riga di comando molto semplicistico che non contiene alcun auguri per manipolazioni, Ghostscript assume si desidera utilizzare -dPDFSETTINGS=/default, imposta questo parametro in modo implicito e opera di conseguenza.

Ora cosa sono le /default PDFSETTINGS ?!Hai due opzioni per scoprirlo:

  1. leggere il manuale di. Il grande table in middle of this section offre una panoramica. Potete vedere che questo -dPDFSETTINGS=/default di per sé è solo una scorciatoia per le diverse decine di altre impostazioni più specifiche che rappresenta. Il collegamento alla documentazione fornita è per l'attuale HEAD del codice di sviluppo e la versione effettivamente utilizzata potrebbe essere diversa, naturalmente.

  2. Query (proprio) Ghostscript per il significato dettagliato di questa impostazione. Le mie risposte alla domanda 'Querying Ghostscript for the default options/settings of an output device...' e la domanda 'What are PostScript dictionaries, and how can they be accessed (via Ghostscript)?' elaborano un po 'di più su questo. In breve, per interrogare Ghostscript per i dettagli dei suoi /default PDFSETTINGS, eseguire questo comando:

    gs \ 
        -q \ 
        -dNODISPLAY \ 
        -c ".distillersettings /default get {exch ==only () print ===} forall quit" 
    

    Si dovrebbe ottenere un risultato molto simile a questo:

    /Optimize false 
        /DoThumbnails false 
        /PreserveEPSInfo true 
        /ColorConversionStrategy /LeaveColorUnchanged 
        /DownsampleMonoImages false 
        /EmbedAllFonts true 
        /CannotEmbedFontPolicy /Warning 
        /PreserveOPIComments true 
        /GrayACSImageDict << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >> 
        /DownsampleColorImages false 
        /PreserveOverprintSettings true 
        /CreateJobTicket false 
        /AutoRotatePages /PageByPage 
        /NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats] 
        /ColorACSImageDict << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >> 
        /DownsampleGrayImages false 
        /UCRandBGInfo /Preserve 
    

    L'unico punto che si distingue da questi : potresti voler cambiare /AutoRotagePages da /PageByPage a /None. Sulla riga di comando lo si inserirà come -dAutoRotatePages=/None.

    per darvi un elenco completo dei parametri che specificamente dire Ghostscript di impiegare più di un modo passthrough quanto possibile per l'ingresso in formato PDF con l'aggiunta di questi parametri:

    -dAntiAliasColorImage=false \ 
        -dAntiAliasGrayImage=false \ 
        -dAntiAliasMonoImage=false \ 
        -dAutoFilterColorImages=false \ 
        -dAutoFilterGrayImages=false \ 
        -dDownsampleColorImages=false \ 
        -dDownsampleGrayImages=false \ 
        -dDownsampleMonoImages=false \ 
        -dColorConversionStrategy=/LeaveColorUnchanged \ 
        -dConvertCMYKImagesToRGB=false \ 
        -dConvertImagesToIndexed=false \ 
        -dUCRandBGInfo=/Preserve \ 
        -dPreserveHalftoneInfo=true \ 
        -dPreserveOPIComments=true \ 
        -dPreserveOverprintSettings=true \ 
    

così si potrebbe provare questo comando:

gs            \ 
-o output.pdf         \ 
-sDEVICE=pdfwrite        \ 
-dAntiAliasColorImage=false     \ 
-dAntiAliasGrayImage=false      \ 
-dAntiAliasMonoImage=false      \ 
-dAutoFilterColorImages=false     \ 
-dAutoFilterGrayImages=false     \ 
-dDownsampleColorImages=false     \ 
-dDownsampleGrayImages=false     \ 
-dDownsampleMonoImages=false     \ 
-dColorConversionStrategy=/LeaveColorUnchanged \ 
-dConvertCMYKImagesToRGB=false     \ 
-dConvertImagesToIndexed=false     \ 
-dUCRandBGInfo=/Preserve      \ 
-dPreserveHalftoneInfo=true     \ 
-dPreserveOPIComments=true      \ 
-dPreserveOverprintSettings=true    \ 
    input1.pdf         \ 
    input2.pdf 

Infine, come Chris Haas al pronto a suggerire: è anche possibile utilizzare pdftk se si specifica che non desidera alcuna ottimizzazione che Ghostscript si applica per impostazione predefinita. pdftk è semplicemente incapace di fare queste cose, e guadagnerai un po 'di velocità per la relativa silenziosità di funzionamento (ma probabilmente anche uscite di file di dimensioni molto maggiori rispetto a Ghostscript).

+1

'pdftk' non è disponibile per CentOS/RHEL 7 a partire da marzo 2016. –

+1

Puoi applicare una delle impostazioni' -dPDFSETTINGS = 'e quindi sovrascrivere solo un sottoinsieme di esse con le impostazioni' -d * '(nella tua risposta) più avanti nella riga di comando? – CMCDragonkai

+1

@CMCDragonkai: Sì, puoi. (Non l'ho ancora provato, ma se questo non funziona, sarà un bug.) –

Problemi correlati