¿Usa Ghostscript, pero le dice que no reprocese imágenes?

30

Tengo un PDF que ya tiene imágenes comprimidas y algo artefactos, y estoy usando Ghostscript para anteponer una página de título a ese PDF.

Sin embargo, no puedo encontrar ninguna manera de decirle a GS que solo use las imágenes existentes tal como están sin reprocesarlas, y ahora siento que tiene algo que ver con el funcionamiento de GS, es decir, no puede volver a compilar / vincular un PDF sin reprocesar sus imágenes ... ¿Es eso cierto?

Puedo aumentar la configuración de DPI en GS, pero pasará de 5 MB a 60 MB sin dejar de verse peor.

¿Hay alguna alternativa mejor a GS que haga lo que necesito (preferiblemente que compilará en OS X)?

Mahmoud Al-Qudsi
fuente
¿Puede editar su pregunta y citar la línea de comandos exacta que está utilizando para anteponer su página de título al PDF original? Entonces podría decirle exactamente qué cambiar o agregar a la línea de comandos para obtener una mejor salida para las imágenes ...
Kurt Pfeifle
No solo quiero que se vea mejor, quiero fusionarme sin reprocesarlo. Esto a) dará como resultado una mejor calidad (transformaciones sin pérdidas) yb) no perderá horas de tiempo de CPU procesando mi documento de más de 1000 páginas.
Mahmoud Al-Qudsi
1
Oye, no respondiste mi pregunta y no citaste la línea de comando GS exacta que estás utilizando. Lo que significa que no recibirá la ayuda sobre GS que está buscando ...
Kurt Pfeifle

Respuestas:

44

Si solo desea concatenar dos archivos PDF sin ningún reprocesamiento de su contenido, pdftkes para usted. (En Mac OS X, esto debería estar disponible a través de MacPorts o Fink, para Linux, hay paquetes nativos para todas las distribuciones principales; para Windows, mire aquí ) . Pruebe esto:

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

Esto antepondrá el título.pdf al contenido.pdf y escribirá el resultado en book.pdf .

pdftkes una forma "tonta" pero muy rápida de concatenar dos (o más) archivos PDF. "Dumb" hasta ahora, ya pdftkque de ninguna manera interpreta el flujo de datos PDF, solo se asegura de que los números de objeto internos se vuelvan a barajar según sea necesario y aparezcan en la xrefestructura PDF (que básicamente es una especie de PDF ToC para objetos).

Ghostscript:

Si desea utilizar Ghostscript, el comando básico para concatenar los mismos dos archivos sería:

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

Sin embargo, como has experimentado, esta línea de comando simple puede estropear la calidad de tu imagen. La razón es que Ghostscript no se 'voltea' cuando procesa archivos PDF: los interpreta completamente al leerlos y crea un archivo completamente nuevo al escribir el resultado. Para crear el resultado, utilizará automáticamente la configuración predeterminada para muchos detalles en el procesamiento general. Estos valores predeterminados se aplicarán a todos los casos en los que sus invocaciones no hayan indicado a Ghostscript lo contrario.

Entonces, el método de Ghostscript para crear el nuevo book.pdf es mucho más "inteligente" (pero también mucho más lento) que pdftkel método de ". (Esta es también la razón por la cual Ghostscript en muchos casos puede, dentro de ciertos límites, "reparar" archivos PDF borrados, o para incrustar fuentes en los PDF de salida que no están incrustados en los PDF de entrada, o para eliminar imágenes duplicadas, reemplazando por meras referencias, etc., y en general crearon archivos más pequeños y mejor optimizados a partir de archivos PDF de entrada hinchada ...)

La solución es no permitir que Ghostscript use sus valores predeterminados: agregando más parámetros personalizados a la línea de comandos.

¿Qué significa "Ghostscript 'interpreta' su entrada en PDF" ?

Todo el archivo y su contenido (objetos, secuencias, fuentes, imágenes, ...) se leen, verifican y mantienen en su propia representación interna, antes de escupir el PDF resultante con sus objetos PDF nuevamente. Sin embargo, al 'escupir', Ghostscript aplicará todas sus configuraciones internas predeterminadas para los cientos de parámetros [*] que están disponibles.

Desafortunadamente, esto provoca el "reprocesamiento" de las imágenes de acuerdo con esta configuración predeterminada, que solo puede evitarse o anularse agregando sus propios parámetros de línea de comandos (deseados).

Sus problemas de imagen podrían ser causados ​​por la necesidad de Ghostscript (debido a problemas de licencia) de volver a codificar las imágenes JPEG2000 a codificación JPEG. Si desea evitar esto, agregue lo siguiente a su línea de comandos:

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

Otras opciones de línea de comandos relacionadas con la imagen a tener en cuenta para incluir son:

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

Entonces, la línea de comandos completa de Ghostscript que podría hacerte feliz debería leer:

 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

También puede decirle a Ghostscript que NO comprima imágenes en absoluto en el PDF de salida, utilizando esta línea de comando:

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

.


[*]:
Si estás interesado en conocer una lista completa de configuraciones predeterminadas que está utilizando el dispositivo pdfwrite de Ghostscript , ejecuta el siguiente comando. Te devuelve la lista completa :

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

Para obtener explicaciones sobre qué significan exactamente todos estos parámetros, deberá leer la documentación de Adobe sobre "Parámetros de Distiller" . Ghostscript se esfuerza mucho por imitar todo esto ...

Kurt Pfeifle
fuente
3
(FYI) En mi caso, las banderas dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImagescausa el archivo de salida a ser mucho más masiva. Al eliminarlos, el tamaño del archivo cambió de 22 MB a 3,1 MB y la calidad de la imagen se ve exactamente como con el uso de estos indicadores. Todas las únicas banderas con que utilizo son: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Dor
@Kurt Pfeifle ¿Qué opciones están permitidas -dColorImageFilter? Solo puedo encontrar FlateEncodey DCTEncode. DCT parece hacer JPEG (¿por qué cifraron eso?). ¿Creo que FLATE es una opción desactualizada para las imágenes ya que la patente de Bell Labs en LZW ya no es un problema? Sin embargo, después de pasar bastante tiempo buscando, no puedo encontrar cómo usar PNG (o cualquier otra cosa) ... Mis imágenes originales son PNG y quiero que permanezcan sin cambios. Probé la opción -c, pero me da -c can only be used in a built with POSTSCRIPT included....
Louis Somers