Como destilar / rasterizar um PDF no Linux

13

Temos uma impressora em nosso escritório que imprime arquivos PDF a partir de um dispositivo USB. Ele imprime a maioria dos arquivos, mas tem problemas com alguns, especialmente os gerados com Látex. Alguns PDFs simplesmente se recusam a imprimir, alguns PDFs são impressos com fonte do tipo courier e outros são impressos corretamente, exceto pelas equações.

Estou procurando uma maneira de "destilar" PDFs em um formato de impressão segura. Simplificando / normalizando o PDF até o ponto em que qualquer renderizador o renderize corretamente, ou simplesmente tornando cada página uma imagem rasterizada de 600dpi no PDF. (Eu poderia dividir o PDF em imagens raster individuais e combiná-las manualmente, mas quero algo com script.)

O tamanho do arquivo de saída não importa, desde que seja certo imprimir, possui tamanho de papel A4 (ou original) e resolução de 300 ~ 600dpi.

Sampo
fonte
Talvez o pdf2ps possa ajudar se a impressora estiver suportando postscript.
frlan
Ele deveria ser uma impressora PostScript, mas esse suporte é ainda pior que o do PDF (e não imprime PS a partir de um dispositivo USB).
Sampo

Respostas:

22

Depois de tentar, sem sucesso, algumas opções para renderizar as fontes como contornos (incluindo esta pergunta e pstoedit), descobri uma maneira de converter facilmente o PDF em formato rasterizado usando o ImageMagick:

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

Isso cria um PDF renderizado em 600 dpi, com antialias desativadas (desnecessárias nessa resolução).

Os arquivos de saída são enormes (~ 30 MB para um documento de 8 páginas) e extremamente lentos para imprimir, mas devem funcionar desde que a impressora tenha memória suficiente para renderizar o conteúdo.

Sampo
fonte
1
Sim! Usei isso para nivelar as camadas do meu PDF com grande sucesso. + antialias não era necessário, porque só tínhamos imagens (não fazia diferença) e eu reduzi a resolução para 150, pois isso parecia bom o suficiente para arquivar sem ocupar muito espaço. Obrigado!
mlissner
2
Observe que convertnão preserva o conteúdo dos formulários que você pode ter preenchido. (Eu queria rasterizar um PDF para garantir que o conteúdo do formulário tenha a mesma aparência em todos os lugares, em particular que eles sejam exibidos por todos os visualizadores de PDF em primeiro lugar.) Para preservar o conteúdo do formulário, use evince(ou qualquer outro aplicativo que você usou para preencher o formulário) para imprimir o documento "em um arquivo" - este é outro PDF em que o conteúdo do formulário se tornou parte do texto comum. Você ainda pode rasterizar esse novo PDF, dependendo de suas necessidades.
balu
Observe que isso ativa o antialiasing ( +antialias) em vez de desativá-lo ( -antialias).
xiii1408
Não, +antialiasdesativa antialiasing: imagemagick.org/script/command-line-options.php?#antialias
Sampo
1
Eu precisava ajustar o imagemagick ( stackoverflow.com/questions/42928765/… ) para fazer isso funcionar.
precisa saber é o seguinte
1

Usar o imagemagick, na minha experiência, não é estável com altas resoluções e / ou arquivos grandes. Muitas impressoras podem fazer 1200 dpi ou mais, portanto o arquivo rasterizado deve ter uma resolução semelhante. Uma solução melhor é usar o pdf2djvu, que é mais rápido, mais robusto e até cria arquivos com um tamanho que geralmente rivaliza com o PDF original em 1200 ou 2400 dpi. Esses arquivos podem ser visualizados e impressos usando okular ou evince.

Exemplo:

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

Eu acho que minha atual maneira preferida de fazer isso é:

  1. Use pdftoppm para converter o arquivo PDF em uma série de imagens.

    $ pdftoppm source.pdf output -png

  2. Use img2pdf para criar um arquivo pdf a partir dessas imagens.

    $ img2pdf * .png -o output.pdf

A boa notícia é que você pode criar um script bash para automatizar todo o processo para você.

Aqui está um script bash que destila todos os arquivos pdf em um diretório e preserva os originais em um novo diretório "originais".

#!/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 lateral) Você pode instalar o img2pdf usando:

$ sudo apt install img2pdf

Michael
fonte
-1

Outra alternativa é converter para imagens através de algo como

pdfimages

Na página do manual ", o Pdfimages salva imagens de um arquivo PDF (Portable Document Format) como arquivos Portable Pixmap (PPM), Portable Bitmap (PBM) ou JPEG. O Pdfimages lê o arquivo PDF-PDF, digitaliza uma ou mais páginas e grava um arquivo PPM, PBM ou JPEG para cada imagem, image-root-nnn.xxx, em que nnn é o número da imagem e xxx é o tipo de imagem (.ppm, .pbm, .jpg). "

Em seguida, use o pdftk para converter novamente em PDF https://www.pdflabs.com/docs/pdftk-cli-examples/

Por fim, imprima este arquivo. Obviamente, a questão principal é como escrever isso.

Você pode automatizar isso por meio de uma página da Web simples de algum tipo para os usuários. Finalmente, eles imprimem o arquivo convertido e você deve ter um desempenho melhor e uma impressão funcional?

dtbnguyen
fonte
3
O pdfimages extrai imagens raster incorporadas de arquivos PDF, não rasteriza o texto ou os gráficos vetoriais.
Sampo 25/02