Como posso converter um arquivo pdf da escala de cinza para preto-branco?

9

Meu sistema operacional é o Ubuntu 12.04. Como posso converter um arquivo pdf da escala de cinza para preto-branco? O arquivo pdf em escala de cinza vem da digitalização com opção em escala de cinza, e o pdf em escala preto-branco é exigido pelo OCR.

Atualização:

Após a resposta de Marco, o PDF do BW não é bom e o arquivo original é aqui .

    
por Tim 28.07.2013 / 14:35

4 respostas

9

1) Use ghostscript para converter o PDF em um arquivo PostScript monocromático usando o dispositivo psmono :

gs -q -sDEVICE=psmono -o mono.ps input.pdf

2) Em seguida, converta o PostScript monocromático de volta para PDF:

ps2pdf mono.ps

EDIT: O dispositivo psmono cria uma imagem de meio tom de 1 bit que aparentemente não é o que você deseja. Não consegui encontrar uma maneira de especificar um limite usando ghostscript, então recorri ao imagemagick. convert internamente usa ghostscript para converter o PDF. Em seguida, aplica a filtragem de limite para produzir uma imagem de 1 bit e usa o ghostscript novamente para criar um PDF. Como convert usa uma resolução de 75DPI por padrão, o que pode não corresponder à sua resolução real, você pode fornecer o argumento density . E experimente a configuração threshold . Os valores ótimos dependem muito do arquivo de entrada.

convert -density 150 -threshold 50% input.pdf output.pdf
    
por 28.07.2013 / 14:44
3

Eu também tinha alguns pdfs digitalizados em cores e pdfs em tons de cinza que eu queria converter em bw. Eu tentei usar gs com o código listado aqui , e a qualidade da imagem é boa com o texto em PDF ainda disponível. No entanto, esse código gs só converte em escala de cinza (como solicitado na pergunta) e ainda tem tamanho de arquivo grande. convert produz resultados muito ruins quando usado diretamente.

Eu queria PDFs da BW com boa qualidade de imagem e tamanho de arquivo pequeno. Minha solução usa gs para extrair arquivos bmp em escala de cinza do pdf, convert para limitar esses bmps a bw e salvá-los como arquivos tiff e, em seguida, img2pdf para compactar as imagens do tiff e mesclá-las em um único pdf.

Eu tentei ir diretamente para o tiff do pdf, mas a qualidade não é a mesma, então salvei cada página em bmp. Para um arquivo pdf de uma página, convert faz um ótimo trabalho de bmp para pdf. Exemplo:

gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -r300x300 \
   -sOutputFile=./pdf_image.bmp ./input.pdf

convert ./pdf_image.bmp -threshold 40% -compress zip ./bw_out.pdf

Para várias páginas, gs pode mesclar vários arquivos PDF em um, mas img2pdf gera tamanho de arquivo menor que gs. Os arquivos tiff devem ser descompactados como entrada para img2pdf. Tenha em mente para um grande número de páginas, os arquivos intermediários bmp e tiff tendem a ser grandes em tamanho. pdftk ou joinpdf seria melhor se eles pudessem mesclar arquivos PDF compactados de convert .

Eu imagino que haja uma solução mais elegante. No entanto, meu método produz resultados com qualidade de imagem muito boa e tamanho de arquivo muito menor. Para obter o texto de volta no pdf do bw, execute o OCR novamente.

Meu shell script usa gs, convert e img2pdf. Altere os parâmetros (número de páginas, dpi digitalizado,% limite, etc) listados no início, conforme necessário, e execute chmod +x ./pdf2bw.sh . Aqui está o script completo (pdf2bw.sh):

#!/bin/bash

num_pages=12
dpi_res=300
input_pdf_name=color_or_grayscale.pdf
bw_threshold=40%
output_pdf_name=out_bw.pdf
#-------------------------------------------------------------------------
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -q -r$dpi_res \
   -sOutputFile=./%d.bmp ./$input_pdf_name
#-------------------------------------------------------------------------
for file_num in 'seq 1 $num_pages'
do
  convert ./$file_num.bmp -threshold $bw_threshold \
          ./$file_num.tif
done
#-------------------------------------------------------------------------
input_files=""

for file_num in 'seq 1 $num_pages'
do
  input_files+="./$file_num.tif "
done

img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files
#-------------------------------------------------------------------------
# clean up bmp and tif files used in conversion

for file_num in 'seq 1 $num_pages'
do
  rm ./$file_num.bmp
  rm ./$file_num.tif
done
    
por 14.01.2015 / 00:05
3

A melhor maneira que eu encontrei lá fora, sem perda de qualidade, remove sombras, ruído, texto da próxima página que está sendo analisada, etc:

1) Primeiro converta o pdf para imagens individuais

pdfimages combined_ocr.pdf page

2) Segundo, remova sombras, ruídos e textos da próxima página que estão vazando (créditos para este blog )

ls ./p*.ppm | xargs -L1 -I {} convert {}  -quality 100 -density 300 -fill white -fuzz 80% +opaque "#000000" {}.jpg

3) Isto para fazer um arquivo pdf de cada imagem jpg sem perda de resolução ou qualidade:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

4) Isso para concatenar as pdfpages em uma:

pdftk *.pdf cat output combined.pdf

5) E, por último, adiciono uma camada de texto com OCR que não altera a qualidade da verificação nos PDFs para que possam ser pesquisáveis:

pypdfocr combined.pdf 
    
por 03.02.2018 / 20:32
2

Na verdade, se vier de uma varredura, a única maneira razoável é usar pdfimages e converter os gráficos subjacentes. Eu usei esse script para convertê-lo:

#!/bin/sh
if [ -z "$1" -o -z "$2" ]; then
    echo "Syntax: $0 <input.pdf> <output.pdf>"
    exit 1
fi

pdfimages "$1" scan
for a in scan*.ppm; do 
   convert -white-threshold 85% -monochrome $a 'basename $a .ppm'.tiff
done
tiffcp scan*.tiff output.tiff
tiff2pdf output.tiff -o "$2" -p A4 -F
rm scan*.ppm scan*.tiff output.tiff
    
por 05.10.2013 / 17:55