Usa Ghostscript, ma gli dici di non rielaborare le immagini?


28

Ho un PDF che ha già compresso e in qualche modo immagini di artefatto e sto usando Ghostscript per anteporre una pagina del titolo a quel PDF.

Tuttavia, non riesco a trovare alcun modo per dire a GS di usare le immagini esistenti così come sono senza rielaborarle, e ora mi sento come se avesse qualcosa a che fare con il funzionamento di GS, cioè non puoi ricompilare / collegare un PDF senza rielaborare le sue immagini .. È vero?

Posso aumentare l'impostazione DPI in GS, ma passerà da 5 MB a 60 MB pur continuando a sembrare peggiore.

Esiste un'alternativa migliore a GS che farà ciò di cui ho bisogno (preferibilmente che verrà compilato su OS X)?


Puoi modificare la tua domanda e citare la riga di comando esatta che stai utilizzando per anteporre la pagina del titolo al PDF originale? Quindi potrei dirti cosa esattamente modificare o aggiungere alla riga di comando per ottenere un output migliore per le immagini ...
Kurt Pfeifle

Non voglio solo avere un aspetto migliore, voglio unirmi senza rielaborare. Ciò a) porterà a una migliore qualità (trasformazioni senza perdita di dati) eb) a non sprecare ore di tempo della CPU nell'elaborazione del mio documento di oltre 1000 pagine.
Mahmoud Al-Qudsi il

1
Ehi, non hai risposto alla mia domanda e non hai citato l'esatta linea di comando GS che stai usando. Il che significa: non otterrai l'aiuto per quanto riguarda GS che stai cercando ...
Kurt Pfeifle

Risposte:


42

Se vuoi solo concatenare due file PDF senza rielaborare il suo contenuto, pdftkè per te. (Su Mac OS X questo dovrebbe essere disponibile tramite MacPorts o Fink, per Linux, ci sono pacchetti nativi per tutte le principali distribuzioni; per Windows, guarda qui. ) Prova questo:

 pdftk title.pdf content.pdf cat output book.pdf

Questo anteporrerà title.pdf a content.pdf e scriverà il risultato in book.pdf .

pdftkè un modo "stupido", ma molto veloce per concatenare due (o più) file PDF. "Scemo" finora, in quanto pdftknon interpreta in alcun modo il flusso di dati PDF, si assicura solo che i numeri degli oggetti interni vengano rimescolati secondo necessità e compaiano nella xrefstruttura PDF (che in pratica è una sorta di PDF ToC per oggetti).

Ghostscript:

Se si desidera utilizzare Ghostscript, il comando di base per concatenare gli stessi due file sarebbe:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

Tuttavia, come hai sperimentato, questa semplice riga di comando potrebbe incasinare la qualità dell'immagine. Il motivo è che Ghostscript non viene "scaricato" quando elabora i PDF: li interpreta completamente durante la lettura e crea un file completamente nuovo quando scrive il risultato. Per creare il risultato, utilizzerà automaticamente le impostazioni predefinite per molti dettagli nell'elaborazione complessiva. Queste impostazioni predefinite si applicheranno a tutti i casi in cui le sue invocazioni non avevano altrimenti indicato Ghostscript.

Quindi il metodo di Ghostscript per creare il nuovo book.pdf è molto più "intelligente" (ma anche molto più lento) del pdftkmetodo. (Questo è anche il motivo per cui Ghostscript in molti casi è in grado - entro i limiti - di "riparare" file PDF b0rken o di incorporare caratteri nei PDF di output che non sono incorporati nei PDF di input o di rimuovere immagini duplicate, sostituendo mediante semplici riferimenti, ecc. - e nel complesso creato file più piccoli e meglio ottimizzati da PDF di input gonfiati ...)

La soluzione è non permettere a Ghostscript di usare i suoi valori predefiniti: aggiungendo più parametri personalizzati alla riga di comando.

Che cosa significa "Ghostscript" interpreta "il suo input PDF" ?

Tutto il file e il suo contenuto (oggetti, flussi, caratteri, immagini, ...) vengono letti, controllati e conservati nella propria rappresentazione interna, prima di sputare nuovamente il PDF risultante con i suoi oggetti PDF. Tuttavia, quando "sputa", Ghostscript applicherà tutte le sue impostazioni predefinite interne per le centinaia di parametri [*] che sono disponibili.

Sfortunatamente, ciò provoca il "rielaborazione" delle immagini in base a queste impostazioni predefinite, che possono essere evitate o ignorate solo aggiungendo i propri parametri (desiderati) della riga di comando.

I tuoi problemi di immagine potrebbero essere causati dalla necessità di Ghostscript (a causa di problemi di licenza) di ricodificare le immagini JPEG2000 in codifica JPEG. Se si desidera evitare ciò, aggiungere quanto segue alla riga di comando:

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

Altre opzioni da riga di comando relative all'immagine da considerare per l'inclusione sono:

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

Quindi la riga di comando completa di Ghostscript che potrebbe renderti felice dovrebbe leggere:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

Puoi anche dire a Ghostscript di non comprimere affatto le immagini nel PDF di output, usando questa riga di comando:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf

.


[*]:
Se sei interessato a conoscere un elenco completo delle impostazioni predefinite utilizzate dal dispositivo pdfwrite di Ghostscript , esegui il comando seguente. Ti restituisce l' elenco completo :

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

Per spiegazioni sul significato esatto di tutti questi parametri, è necessario leggere nella documentazione Adobe sui "Parametri del distillatore" . Ghostscript fa di tutto per imitare tutti questi ...


7
risposta eccezionale!
Matt Wilkie,

5
questo è oro proprio qui!
Vincent,

3
(FYI) Nel mio caso, le bandiere dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImagescausano il file di output per diventare molto più massiccia. Rimuovendoli, la dimensione del file è cambiata da 22 MB a 3,1 MB e la qualità dell'immagine sembra esattamente come con l'uso di questi flag. Tutte le uniche bandiere con che uso sono: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Dor

@Kurt Pfeifle Quali sono le opzioni consentite -dColorImageFilter? Posso solo trovare FlateEncodee DCTEncode. DCT sembra fare JPEG (perché l'hanno crittografato?). Penso che FLATE sia ormai un'opzione obsoleta per le immagini da quando il brevetto Bell Labs su LZW non è più un problema? Tuttavia, dopo aver trascorso un po 'di tempo a cercare, non riesco a trovare come usare PNG (o altro) ... Le mie immagini originali sono PNG e voglio che rimangano invariate. Ho provato l'opzione -c, ma mi dà -c can only be used in a built with POSTSCRIPT included....
Louis Somers il
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.