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