Cómo destilar / rasterizar un PDF en Linux

13

Tenemos una impresora en nuestra oficina que imprime archivos PDF desde una memoria USB. Imprime bien la mayoría de los archivos, pero tiene problemas con algunos, especialmente los generados con Latex. Algunos archivos PDF simplemente se niega a imprimir, algunos archivos PDF que imprime con fuente tipo mensajería, y algunos imprime bien, excepto las ecuaciones.

Estoy buscando una manera de "destilar" archivos PDF en un formato seguro para imprimir. Simplificando / normalizando el PDF hasta el punto de que cualquier renderizador lo renderizará correctamente, o simplemente haciendo de cada página una imagen ráster de 600 ppp en el PDF. (Podría dividir el PDF en imágenes ráster individuales y combinarlas manualmente, pero quiero algo que tenga secuencias de comandos).

El tamaño del archivo de salida no importa, siempre que se imprima, tiene un tamaño de papel A4 (o el original) y una resolución de 300 ~ 600 ppp.

Sampo
fuente
Tal vez pdf2ps podría ayudar si la impresora admite postscript.
frlan
Se supone que es una impresora PostScript, pero ese soporte es aún peor que el de PDF (y no imprimirá PS desde una memoria USB).
Sampo

Respuestas:

22

Después de probar sin éxito algunas opciones para representar las fuentes como contornos (incluida esta pregunta y pstoedit), descubrí una forma de convertir fácilmente el PDF en forma rasterizada usando ImageMagick:

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

Esto crea un PDF renderizado a 600 ppp, con antialias desactivado (innecesario en esa resolución).

Los archivos de salida son enormes (~ 30 MB para un documento de 8 páginas) y extremadamente lentos para imprimir, pero deberían funcionar siempre que la impresora tenga suficiente memoria para procesar el contenido.

Sampo
fuente
1
¡Si! Utilicé esto para aplanar las capas en mi PDF con gran éxito. + antialias no era necesario porque solo teníamos imágenes (no había diferencia) y bajé la resolución a 150, ya que parecía lo suficientemente bueno para archivar sin ocupar tanto espacio. ¡Gracias!
mlissner
2
Tenga en cuenta que convertno conserva el contenido de los formularios que podría haber completado. (Quería rasterizar un PDF para asegurarme de que el contenido del formulario se vea igual en todas partes, en particular, en primer lugar, se mostrarán en cada visor de PDF). Para preservar el contenido del formulario, use evince(o lo que sea aplicación que usó para completar el formulario) para imprimir el documento "en un archivo" - este es otro PDF donde el contenido del formulario se ha convertido en parte del texto normal. Entonces aún puede rasterizar este nuevo PDF, según sus necesidades.
balu
Tenga en cuenta que esto activa el antialiasing ( +antialias) en lugar de desactivarlo ( -antialias).
xiii1408
No, +antialiasdeshabilita el antialiasing: imagemagick.org/script/command-line-options.php?#antialias
Sampo
1
Necesitaba ajustar imagemagick ( stackoverflow.com/questions/42928765/… ) para que esto funcione.
SteveSong
1

Usar imagemagick no es, en mi experiencia, estable con altas resoluciones y / o archivos grandes. Muchas impresoras pueden hacer 1200 ppp o más, por lo que el archivo rasterizado debe tener una resolución similar. Una mejor solución es usar pdf2djvu, que es más rápido, más robusto e incluso crea archivos con un tamaño que a menudo rivaliza con el PDF original a 1200 o 2400 ppp. Estos archivos se pueden ver e imprimir usando okular o evince.

Ejemplo:

pdf2djvu -d 2400 file.pdf > rastered.djvu
mjo
fuente
1

Creo que mi forma preferida actual de hacerlo es:

  1. Use pdftoppm para convertir el archivo PDF en una serie de imágenes.

    $ pdftoppm source.pdf salida -png

  2. Use img2pdf para crear un archivo pdf a partir de esas imágenes.

    $ img2pdf * .png -o output.pdf

La buena noticia es que puede crear un script bash para automatizar todo el proceso por usted.

Aquí hay un script bash que destilará todos los archivos pdf dentro de un directorio y preservará los originales en un nuevo directorio "originales".

#!/bin/bash

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

Créditos: img2pdf answer & pdftoppm answer & bash script help: 1 & 2

(Nota al margen ) Puede instalar img2pdf usando:

$ sudo apt install img2pdf

Miguel
fuente
-1

Otra alternativa es convertir a imágenes a través de algo como

pdfimages

Desde la página de manual, "Pdfimages guarda imágenes de un archivo de Formato de Documento Portátil (PDF) como Portable Pixmap (PPM), Portable Bitmap (PBM) o archivos JPEG. Pdfimages lee el archivo PDF PDF-file, escanea una o más páginas, y escribe un archivo PPM, PBM o JPEG para cada imagen, image-root-nnn.xxx, donde nnn es el número de imagen y xxx es el tipo de imagen (.ppm, .pbm, .jpg) ".

Luego use pdftk para volver a convertir a PDF https://www.pdflabs.com/docs/pdftk-cli-examples/

Finalmente, imprima este archivo. Obviamente, la pregunta clave es cómo escribir esto.

Puede automatizar esto a través de una página web simple de algún tipo para los usuarios. Finalmente, imprimen el archivo convertido y debería tener un mayor rendimiento e impresión de trabajo.

dtbnguyen
fuente
3
pdfimages extrae imágenes ráster incrustadas de archivos PDF, no rasteriza el texto o los gráficos vectoriales.
Sampo