Como posso converter um PNG para PDF em alta qualidade para que não fique embaçado ou confuso?

54

Existem muitas perguntas sobre como converter um arquivo PDF em uma imagem PNG, mas estou procurando um bom arquivo PNG nítido e basicamente envolvê-lo ou incorporá-lo a um arquivo PDF sem parecer embaçado ou difusa.

Sei que, com o imagemagic instalado, posso fazer uma conversão simples como:

convert sample.png sample.pdf

Eu também tentei várias opções para definir a profundidade e também a qualidade:

convert -quality 100 sample.png sample.pdf

No entanto, o PDF ainda sai embaçado / confuso.

Aqui está uma imagem de exemplo:

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

Como png, é nítido e limpo. Quando o converto em PDF, mesmo no mesmo tamanho, fica embaçado:

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

Como posso converter PNG para PDF em alta qualidade?

cwd
fonte
Espero que você encontre uma boa resposta para sua pergunta, mas acho que é apenas uma propriedade específica do PDF armazenar imagens no formato JPG. O PNG, como o que você nos mostra, tem uma qualidade muito melhor que o JPG.
jippie
11
@cwd: Você tentou colocá-lo em um arquivo .tex e depois gerar o PDF? Com \usepackage[pdftex, final]{graphicx}e \includegraphics[width=516px]{calendar.png}, por exemplo.
Emanuel Berg
2
@ippie: Não, o PDF pode armazenar bitmaps sem perdas . O link fornece uma lista de algoritmos de compactação em vez de formatos, porque os dados de bitmap dentro de um PDF não podem ser extraídos e visualizados diretamente como JPEG ou TIFF, mas você não erraria ao dizer que as imagens PDF são JPEG (com perdas) ), JPEG 2000 (também com perdas) ou qualquer uma das várias variantes TIFF (sem perdas). O que é verdade, no entanto, é que um determinado destilador de PDF pode ter como padrão a conversão de bitmaps no formato DCT (também conhecido como JPEG) e deve ser solicitado que você use um formulário sem perdas.
Warren Young
@cwd Você já pensou em aceitar alguma resposta? Acho user32208 resposta 's é bastante boa unix.stackexchange.com/a/64495/16920
Léo Léopold Hertz 준영

Respostas:

34

Tente usar a -densityopção A resolução padrão é 72 pontos por polegada. Então tente algo como -density 300.

Para referência, consulte -densitya documentação das opções de linha de comando do ImageMagick.

user32208
fonte
Definitivamente, a densidade parece ser a chave. Escala e densidade parecem estar inversamente relacionadas, portanto, eu tenho jogado com as duas configurações para obter um resultado ótimo em termos de aparência e tamanho do arquivo ... Se houver uma fórmula definida, eu gostaria de saber.
Brian Z
Como encontrar a melhor opção de densidade? Quanto são perdidos dados with density 300em qualquer imagem de exemplo? Eu acho que o resultado depende da entrada. Um novo segmento sobre isso aqui unix.stackexchange.com/q/292025/16920
Léo Léopold Hertz 준영
isso não muda a qualidade para mim.
Guillaume Chevalier
19

Pode ser muito complicado obter uma boa saída em PDF convert. Tente em img2pdfvez disso. No leia-me:

Conversão sem perdas de imagens em PDF sem recodificar desnecessariamente arquivos JPEG e JPEG2000. Assim, nenhuma perda de qualidade e nenhum arquivo de saída grande desnecessário.

Para esclarecer: O PDF pode incorporar imagens JPEG 2000 sem perdas (e a maioria dos leitores parece suportá-las ). Portanto, essa conversão é completamente sem perdas:

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

(Supondo que o delegado JP2 esteja disponível, é claro: verifique identify -list format | grep JP2.)

Brian Z
fonte
4
Esta é IMHO a melhor resposta aqui, mas você deve explicar melhor seu ponto de vista: o PDF pode incorporar imagens JPEG 2000 sem perdas. Assim, o comando completo para o OP seria algo como: convert sample.png -quality 0 sample.jp2; img2pdf -o sample.pdf sample.jp2. (Supondo que o delegado JP2 esteja disponível, é claro: verifique identify -list format | grep JP2.)
Nemo
11
Se você deseja manter os repositórios padrão no Ubuntu 14, convertaltere-os e depois tiff2pdf.
Camille Goudeseune
Esta é uma ótima resposta, muito obrigado e muito.
precisa saber é o seguinte
@ brian-z Na sua resposta , você pode explicar o argumento -quality 0?
SebMa 13/03
SebMa, @Nemo adicionou esse comando, mas estou pensando que talvez deva ser -quality 100?
Brian Z
14

Estou quase certo de que o que você percebe como uma perda de qualidade no PDF, é apenas um efeito do seu visualizador de PDF 's anti- aliasing recurso.

Se você evincevisualizar o PDF, poderá ver o recurso de suavização de serrilhado desativado automaticamente em um determinado zoom (300% no meu teste rápido). Você pode ver isso nitidamente ao aumentar o zoom - perceberá que, em algum momento, os pixels se tornam repentinamente visíveis. Esse é o ponto em que o anti-aliasing deve ter sido desativado para permitir uma inspeção precisa da imagem.

rozcietrzewiacz
fonte
Hmm - isso faz sentido, mas acho que eu esperava poder definir de alguma forma a imagem e a "visualização inicial" para 100%, para parecer mais nítida.
Cwd
11
@cwd Não confunda o zoom (uma maneira de examinar o arquivo) com a causa real da suavização da imagem: anti-aliasing . A imagem está armazenada corretamente. É o visualizador de PDF que engana você. Mas pode ser o contrário - se você usar outros aplicativos de visualização ou alterar suas configurações. Você poderia ver uma imagem nítida em um arquivo PDF e um arquivo PNG suavizado em um visualizador de imagens.
rozcietrzewiacz
3

Brian Z acima forneceu o abaixo, que é a maneira correta, totalmente reversível e sem perdas (supondo que a etapa de conversão seja de fato sem perdas, o que eu acho que é ou pelo menos deveria ser) maneira de colocar pngs em um pdf. Você precisa converter de png para jp2 sem perdas para estar em conformidade com a estrutura / leitores de PDF (eu acho).

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

No entanto, é importante notar que você pode fornecer os arquivos .png diretamente para o img2pdf, como:

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

Isso produzirá o menor arquivo pdf e inserirá o hexadecimal bruto do png nos objetos do pdf sem perdas *.

* A desvantagem é que esse processo não é reversível ao contrário do jp2. Os dados do cabeçalho / rodapé e do cabeçalho / rodapé do bloco foram removidos (o que na verdade torna os arquivos ainda menores!) Do png inserido, deixando apenas os dados brutos da imagem (os metadados excluídos são integrados à estrutura do pdf), presumivelmente para "hackear" o pdf para exibir png bruto, que é tecnicamente não compatível com o contêiner. Ele é exibido corretamente no firefox e pode ser exibido em todos os leitores modernos, mas se png não for compatível com o contêiner, leitores rígidos poderão não renderizar os dados png brutos (pois eles não devem esperar / processá-los corretamente).

Aqui você pode encontrar um script bash extremamente bruto que funcionou para extrair e reconstruir os arquivos png com hashes correspondentes aos usados ​​para entrada no pdf. https://github.com/jack4455667788/RebuildRawPNGExtractedFromPDF

Jack Hadley
fonte
2

PDF é um formato vetorial (ou seja, o arquivo contém uma descrição das linhas a serem desenhadas), enquanto outros formatos (JPG, PNG) são formatos de varredura (o arquivo descreve qual cor pintar cada pixel). Se você explodir um PDF, ainda são apenas linhas nítidas; JPG e PNG mostram a pixelização.

(OK, OK, eu menti. Um PDF também pode ser uma varredura).

vonbrand
fonte
2

Eu acho que para o -densityparâmetro png-to-pdf deve ser pequeno e não grande. Você poderia tentar algo comoconvert -quality 100 -density 50

user39384
fonte
3
Não, a densidade mais alta é definitivamente melhor, apenas fiz um teste, 50 resulta em muitos pixels muito visíveis, 300 é bonito e bonito.
shaunhusain 28/09
Isso tem me confundido, mas acho que uma densidade mais alta resulta em saída com menor resolução. Isso significa que, se a saída for imprecisa (com excesso de alias, como o exemplo na pergunta original), menor densidade é o que você deseja. Mas se um PDF é pixelizado , é necessário converter com uma densidade mais alta .
Brian Z