У меня также были некоторые отсканированные цветные PDF-файлы и PDF-файлы в градациях серого, которые я хотел преобразовать в BW. Я попытался использовать gs
с кодом, перечисленным здесь , и качество изображения хорошее с текстом PDF все еще там. Однако этот код GS конвертируется только в оттенки серого (как задано в вопросе) и по-прежнему имеет большой размер файла. convert
дает очень плохие результаты при непосредственном использовании.
Я хотел получить PDF-файлы с хорошим качеством изображения и небольшим размером файла. Мое решение использует gs
для извлечения bmp-файлов в градациях серого из pdf, convert
пороговых значений bmp для bw и сохранения их в виде tiff-файлов, а затем img2pdf для сжатия tiff-изображений и объединения их всех в один pdf.
Я попытался перейти непосредственно к PDF из TIFF, но качество не то же самое, поэтому я сохраняю каждую страницу в BMP. Для одностраничного PDF-файла convert
отлично справляется с bmp в pdf. Пример:
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -r300x300 \
-sOutputFile=./pdf_image.bmp ./input.pdf
convert ./pdf_image.bmp -threshold 40% -compress zip ./bw_out.pdf
Для нескольких страниц, gs
можно объединить несколько файлов PDF в один, но img2pdf
дает меньший размер файла, чем GS. Файлы TIFF должны быть распакованы как входные данные для img2pdf. Имейте в виду, что для большого количества страниц промежуточные файлы bmp и tiff обычно имеют большой размер. pdftk
или joinpdf
было бы лучше, если бы они могли объединять сжатые файлы PDF из convert
.
Я думаю, что есть более элегантное решение. Однако мой метод дает результаты с очень хорошим качеством изображения и гораздо меньшим размером файла. Чтобы вернуть текст обратно в bw pdf, снова запустите OCR.
Мой сценарий оболочки использует gs, convert и img2pdf. При необходимости измените параметры (количество страниц, dpi сканирования, пороговое значение% и т. Д.), Указанные в начале, и запустите chmod +x ./pdf2bw.sh
. Вот полный скрипт (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