答案1
1)使用鬼脚本使用以下命令将 PDF 转换为单色 PostScript 文件ps单声道设备:
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
答案2
我发现的最好的方法是,在不损失质量的情况下,去除下一页的阴影、噪音、文本等:
首先将pdf转换为单个图像
pdfimages combined_ocr.pdf page
其次,去除下一页中的阴影、噪音和文本(来源到这个博客)
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
50-60% 的fuzz
攻击性较小,并获得更具可读性的结果:
ls ./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg
这是为了将每个 jpg 图像制作为 pdf 文件,而不会损失分辨率或质量:
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
这将 pdfpages 连接成一个:
pdftk *.pdf cat output combined.pdf
最后,我添加了一个 OCRed 文本图层,该图层不会改变 pdf 中的扫描质量,因此可以搜索它们:
pypdfocr combined.pdf
答案3
实际上,如果它来自扫描,唯一合理的方法是使用 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
答案4
感谢 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