Eu também tinha alguns PDFs em cores digitalizados e em escala de cinza que queria converter para bw. Tentei usar gs
com o código listado aqui e a qualidade da imagem é boa com o texto em pdf ainda lá. No entanto, esse código gs é convertido apenas em escala de cinza (conforme solicitado na pergunta) e ainda possui um tamanho de arquivo grande. convert
produz resultados muito ruins quando usado diretamente.
Eu queria PDFs BW com boa qualidade de imagem e tamanho pequeno de arquivo. 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 tiff e mesclá-las em um único pdf.
Eu tentei ir diretamente para tiff do pdf, mas a qualidade não é a mesma, então eu 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
possível mesclar vários arquivos pdf em um, mas img2pdf
gera um tamanho de arquivo menor que o gs. Os arquivos tiff devem ser descompactados como entrada para img2pdf. Lembre-se de que, para um grande número de páginas, os arquivos intermediários bmp e tiff tendem a ser grandes. pdftk
ou joinpdf
seria melhor se eles pudessem mesclar arquivos PDF compactados convert
.
Imagino que exista 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 recuperar o texto no PDF bw, execute o OCR novamente.
Meu script de shell usa gs, convert e img2pdf. Altere os parâmetros (número de páginas, dpi de digitalização,% de 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
scantailor