我的操作系统是Ubuntu 12.04。如何将pdf文件从灰度转换为黑白?灰度pdf文件来自具有灰度选项的扫描,而OCR要求使用黑白pdf文件。
更新:
scantailor
在准备OCR扫描时,它还有许多其他有用的功能,这就是我建议使用它的唯一原因(作为评论,而不是答案)
pdfimages
(poppler)从其PDF容器中提取扫描的图像。首先使用ImageMagick处理它们可能会更有效率。
我的操作系统是Ubuntu 12.04。如何将pdf文件从灰度转换为黑白?灰度pdf文件来自具有灰度选项的扫描,而OCR要求使用黑白pdf文件。
更新:
scantailor
在准备OCR扫描时,它还有许多其他有用的功能,这就是我建议使用它的唯一原因(作为评论,而不是答案)
pdfimages
(poppler)从其PDF容器中提取扫描的图像。首先使用ImageMagick处理它们可能会更有效率。
Answers:
1)通过psmono设备使用ghostscript将PDF转换为单色PostScript文件:
gs -q -sDEVICE=psmono -o mono.ps input.pdf
2)然后将单色PostScript转换回PDF:
ps2pdf mono.ps
编辑:该psmono
设备创建一个1位的半色调图像这显然不是你想要的。我找不到使用ghostscript指定阈值的方法,因此我求助于imagemagick。convert
内部使用ghostscript转换PDF。然后,它应用阈值过滤来生成1位图像,并再次使用ghostscript创建PDF。由于convert
默认情况下使用的分辨率为75DPI(可能与您的实际分辨率不匹配),因此可以提供density
参数。并尝试threshold
设置。最佳值高度取决于输入文件。
convert -density 150 -threshold 50% input.pdf output.pdf
我发现的最好方法是没有质量损失的情况,它消除了阴影,噪音,下一页上的文字渗入等等:
1)首先将pdf转换为单个图像
pdfimages combined_ocr.pdf page
2)第二步清除下一页上的阴影,噪音和文本(通过此博客获得的信誉)
ls ./p*.ppm | xargs -L1 -I {} convert {} -quality 100 -density 300 -fill white -fuzz 80% +opaque "#000000" {}.jpg
可以将其添加为额外的步骤,也可以添加为上面的命令以实际上仅获得两种颜色:
ls ./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg
3)这样可以从每个jpg图像中制作一个pdf文件,而不会降低分辨率或质量:
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
4)这样可以将pdfpage连接成一个:
pdftk *.pdf cat output combined.pdf
5)最后,我添加了一个OCRed文本层,该层不会更改pdf中扫描的质量,因此可以搜索它们:
pypdfocr combined.pdf
我还扫描了一些要转换为黑白的彩色pdf和灰度pdf。我尝试使用此处列出gs
的代码,并且仍然存在pdf文本,因此图像质量很好。但是,该gs代码仅转换为灰度(如问题所要求),并且文件大小仍然很大。convert
直接使用时,效果很差。
我希望黑白PDF具有良好的图像质量和较小的文件大小。我的解决方案用于gs
从pdf提取灰度bmp文件,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。
我的shell脚本使用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
实际上,如果它来自扫描,则唯一合理的方法是使用pdfimages并转换基础图形。我使用以下脚本对其进行了转换:
#!/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
感谢OccamsRazor提供的脚本,该脚本在将彩色和灰度PDF都转换为紧凑且清晰的单色版本方面做得很好。这确实是对OccamsRazor帖子的评论,但我没有足够的观点要发表评论。
该脚本将失败,
img2pdf -o ./$output_pdf_name --dpi $dpi_res $input_files
因为--dpi
它不再是img2pdf的可接受参数。相反,它从输入文件获取分辨率,因此您可以将其省略。
这是我的脚本版本。我不想编辑每个文件的脚本,因此在运行它时,我会传递页面数并输入文件名。我有输出名称设置为和分辨率设置为200 dpi,以适合我的工作流程,但您可能希望改变它,或者把它们变成和,并通过他们进来。00input_name
$3
$4
要运行,请使用,例如。./pdf2bw.sh <number_of_pages> <input_name>
./pdf2bw.sh 55 input.pdf
#!/bin/bash
num_pages=$1
input_pdf_name=$2
output_pdf_name="00$2"
bw_threshold=40%
dpi_res=200
#-------------------------------------------------------------------------
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 $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