¿Cómo puedo convertir un PNG a PDF en alta calidad para que no sea borroso o borroso?

54

Hay muchas preguntas sobre cómo convertir un archivo PDF en una imagen PNG, pero estoy buscando tomar un buen archivo PNG nítido y básicamente envolverlo o incrustarlo en un archivo PDF sin que se vea borroso o borroso.

Me doy cuenta de que con imagemagic instalado puedo hacer una conversión simple como:

convert sample.png sample.pdf

También probé muchos de los interruptores para establecer la profundidad, y también la configuración de calidad:

convert -quality 100 sample.png sample.pdf

Sin embargo, el PDF todavía se ve borroso / borroso.

Aquí hay una imagen de muestra:

http://img406.imageshack.us/img406/6461/picture3mu.png

Como png es crujiente y limpio. Cuando lo convierto a PDF, incluso con el mismo tamaño se ve borroso:

Imagen 4.png http://img803.imageshack.us/img803/9969/picture4at.png

¿Cómo puedo convertir PNG a PDF en alta calidad?

cwd
fuente
Espero que encuentre una buena respuesta a su pregunta, pero creo que es solo una propiedad dada de PDF para almacenar imágenes en formato JPG. PNG, como el que nos muestra, tiene una calidad mucho mejor que JPG.
jippie
1
@cwd: ¿Intentaste ponerlo en un archivo .tex y luego generar el PDF? Con \usepackage[pdftex, final]{graphicx}y \includegraphics[width=516px]{calendar.png}, por ejemplo.
Emanuel Berg
2
@jippie: No, PDF puede almacenar mapas de bits sin pérdidas . El enlace proporciona una lista de algoritmos de compresión en lugar de formatos, porque los datos de mapa de bits dentro de un PDF no se pueden extraer y ver directamente como JPEG o TIFF, pero no se equivocaría si dijera que las imágenes PDF son JPEG (con pérdida ), JPEG 2000 (también con pérdida) o cualquiera de varias variantes TIFF (sin pérdida). Lo que es cierto, sin embargo, es que un destilador PDF dado puede por defecto a los mapas de bits se traduce en DCT (también conocido como JPEG) la forma, y tienen que ser indicado que use una forma sin pérdidas en su lugar.
Warren Young
@cwd ¿Has pensado en aceptar alguna respuesta? Creo que la respuesta de user32208 es bastante buena unix.stackexchange.com/a/64495/16920
Léo Léopold Hertz 준영

Respuestas:

34

Intenta usar la -densityopción. La resolución predeterminada es 72 puntos por pulgada. Así que intenta algo como -density 300.

Para referencia, consulte -densityla documentación de las opciones de la línea de comandos de ImageMagick.

user32208
fuente
La densidad definitivamente parece ser la clave. La escala y la densidad parecen estar inversamente relacionadas, por lo que he estado jugando con ambas configuraciones para obtener un resultado óptimo en términos de apariencia y tamaño de archivo ... Si hay una fórmula establecida, me gustaría saberlo.
Brian Z
¿Cómo encontrar la mejor opción de densidad? ¿Cuánto se pierden los datos with density 300con una imagen de ejemplo? Creo que el resultado depende de la entrada. Un nuevo hilo sobre esto aquí unix.stackexchange.com/q/292025/16920
Léo Léopold Hertz 준영
Esto no cambia la calidad para mí.
Guillaume Chevalier
19

Puede ser muy complicado obtener una buena salida de PDF convert. Intenta en su img2pdflugar. Del léame:

Conversión sin pérdida de imágenes a PDF sin volver a codificar innecesariamente archivos JPEG y JPEG2000. Por lo tanto, no hay pérdida de calidad ni archivos de salida grandes innecesarios.

Para aclarar: PDF puede incrustar imágenes JPEG 2000 sin pérdidas (y la mayoría de los lectores parecen admitirlas ). Entonces esta conversión es completamente sin pérdidas:

convert sample.png -quality 0 sample.jp2
img2pdf -o sample.pdf sample.jp2

(Suponiendo que el delegado JP2 esté disponible, por supuesto: verifique identify -list format | grep JP2).

Brian Z
fuente
44
Esta es, en mi humilde opinión, la mejor respuesta aquí, pero debe explicar mejor su punto, es decir, que PDF puede incrustar imágenes JPEG 2000 sin pérdida. Por lo que el comando completo para el OP sería algo así como: convert sample.png -quality 0 sample.jp2; img2pdf -o sample.pdf sample.jp2. (Suponiendo que el delegado JP2 esté disponible, por supuesto: consultar identify -list format | grep JP2.)
Nemo
1
Si desea apegarse a los repositorios estándar en Ubuntu 14, converttiff y luego tiff2pdf.
Camille Goudeseune
Esta es una gran respuesta, muchas y muchas gracias.
Lyubomyr Shaydariv
@ brian-z En tu respuesta , ¿puedes explicar el argumento -quality 0?
SebMa
SebMa, @Nemo agregó ese comando, pero estoy pensando que tal vez debería ser así -quality 100.
Brian Z
14

Estoy casi seguro de que lo que se percibe como una pérdida de calidad en el PDF, es sólo un efecto de su visor de PDF 's anti- aliasing función.

Si usa evincepara ver el PDF, puede ver que la función antisolapamiento se apaga automáticamente con cierto zoom (300% en mi prueba rápida). Puedes verlo vívidamente cuando sigues haciendo zoom: notarás que en algún momento, los píxeles se vuelven claramente visibles de repente. Ese es el punto cuando el suavizado debe haberse desactivado para permitir una inspección precisa de la imagen.

rozcietrzewiacz
fuente
Hmm, eso tiene sentido, pero supongo que esperaba poder configurar de alguna manera la imagen y la "vista inicial" al 100% para que se vea más nítida.
cwd
1
@cwd No confunda el zoom (una forma de examinar el archivo) con la causa real del suavizado de la imagen: suavizado . La imagen se almacena correctamente. Es el visor de PDF que te engaña. Pero podría ser al revés, incluso si toma otras aplicaciones de visualización o cambia su configuración. Luego, puede ver una imagen nítida en un archivo PDF y un archivo PNG suavizado en un visor de imágenes.
rozcietrzewiacz
3

Brian Z proporcionó lo siguiente, que es la forma correcta, totalmente reversible y sin pérdidas (suponiendo que el paso de conversión sea realmente sin pérdidas, lo que creo que es o al menos debería ser) forma de poner png en un pdf. Debe convertir de png a jp2 sin pérdidas para cumplir con la estructura / lectores de PDF (creo).

$ convert sample.png -quality 0 sample.jp2
$ img2pdf -o sample.pdf sample.jp2

Sin embargo, vale la pena señalar que puede suministrar los archivos .png directamente a img2pdf como:

$ img2pdf -o sample.pdf sample-page1.png <sample-page2.png ...>

Esto producirá el archivo pdf más pequeño e insertará el hexadecimal en bruto de png en los objetos dentro del pdf sin pérdidas *.

* El inconveniente es que este proceso no es reversible a diferencia del uso de jp2. Los datos del encabezado / pie de página y del encabezado / pie de página se han eliminado (lo que en realidad hace que los archivos sean aún más pequeños) del png que se inserta, dejando solo los datos de la imagen sin procesar (los metadatos que se eliminaron se integran en la estructura pdf), presumiblemente para "hackear" el pdf para mostrar png sin formato que técnicamente no cumple con el contenedor. Se muestra bien en firefox, y puede mostrarse bien en todos los lectores modernos, pero si png no cumple con el contenedor, entonces los lectores estrictos pueden no representar los datos png brutos (ya que no deberían esperarlo / procesarlos correctamente).

Aquí puede encontrar un script bash extremadamente crudo que me funcionó para extraer y reconstruir los archivos png con hashes coincidentes con los utilizados para la entrada en el pdf. https://github.com/jack4455667788/RebuildRawPNGExtractedFromPDF

Jack Hadley
fuente
2

PDF es un formato vectorial (es decir, el archivo contiene una descripción de líneas para dibujar), mientras que otros formatos (JPG, PNG) son formatos de trama (el archivo describe de qué color pintar cada píxel). Si explota un PDF, sigue siendo solo líneas definidas; JPG y PNG muestran la pixelación.

(OK, OK, mentí. Un PDF también puede ser una trama).

vonbrand
fuente
2

Creo que para el -densityparámetro png a pdf debería ser pequeño en lugar de grande. Podrías probar algo comoconvert -quality 100 -density 50

usuario39384
fuente
3
No, una mayor densidad es definitivamente mejor, solo hice una prueba, 50 resulta en muchos píxeles muy visibles, 300 es agradable y nítido.
shaunhusain
Esto me ha estado confundiendo, pero creo que una mayor densidad da como resultado una salida con menor resolución. Eso significa que si la salida es difusa (demasiado alias, como el ejemplo en la pregunta original), entonces lo que desea es una densidad más baja . Pero si un PDF está pixelado, entonces debes convertirlo con una densidad más alta .
Brian Z