Tôi cũng đã có một số pdf màu quét và pdf thang độ xám mà tôi muốn chuyển đổi sang bw. Tôi đã thử sử dụng gs
với mã được liệt kê ở đây và chất lượng hình ảnh vẫn tốt với văn bản pdf vẫn còn đó. Tuy nhiên, mã gs đó chỉ chuyển đổi sang thang độ xám (như được hỏi trong câu hỏi) và vẫn có kích thước tệp lớn. convert
mang lại kết quả rất kém khi sử dụng trực tiếp.
Tôi muốn bw pdf với chất lượng hình ảnh tốt và kích thước tệp nhỏ. Giải pháp của tôi sử dụng gs
để trích xuất các tệp bmp thang độ xám từ pdf, convert
để ngưỡng các bmps đó thành bw và lưu chúng dưới dạng tệp tiff, sau đó img2pdf để nén các hình ảnh tiff và hợp nhất tất cả chúng thành một pdf.
Tôi đã cố gắng trực tiếp đến tiff từ pdf nhưng chất lượng không giống nhau nên tôi lưu từng trang vào bmp. Đối với một tệp pdf một trang, convert
thực hiện một công việc tuyệt vời từ bmp đến pdf. Thí dụ:
gs -sDEVICE=bmpgray -dNOPAUSE -dBATCH -r300x300 \
-sOutputFile=./pdf_image.bmp ./input.pdf
convert ./pdf_image.bmp -threshold 40% -compress zip ./bw_out.pdf
Đối với nhiều trang, gs
có thể hợp nhất nhiều tệp pdf thành một, nhưng img2pdf
mang lại kích thước tệp nhỏ hơn gs. Các tệp tiff phải được giải nén làm đầu vào cho img2pdf. Hãy ghi nhớ với số lượng lớn các trang, các tệp bmp và tiff trung gian có xu hướng có kích thước lớn. pdftk
hoặc joinpdf
sẽ tốt hơn nếu họ có thể hợp nhất các tệp pdf nén từ convert
.
Tôi tưởng tượng có một giải pháp thanh lịch hơn. Tuy nhiên, phương pháp của tôi tạo ra kết quả với chất lượng hình ảnh rất tốt và kích thước tệp nhỏ hơn nhiều. Để lấy lại văn bản trong pdf bw, hãy chạy lại OCR.
Kịch bản shell của tôi sử dụng gs, convert và img2pdf. Thay đổi các tham số (# trang, quét dpi, ngưỡng%, v.v.) được liệt kê ngay từ đầu khi cần và chạy chmod +x ./pdf2bw.sh
. Đây là tập lệnh đầy đủ (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