如何将 pdf 文件从灰度转换为黑白?

如何将 pdf 文件从灰度转换为黑白?

我的操作系统是 Ubuntu 12.04。如何将 pdf 文件从灰度转换为黑白?灰度pdf文件来自于使用灰度选项扫描,而黑白灰度pdf是OCR需要的。


更新:

在马可的回复后,BW.pdf不好,原始文件是这里

答案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

我发现的最好的方法是,在不损失质量的情况下,去除下一页的阴影、噪音、文本等:

  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

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
  1. 这是为了将每个 jpg 图像制作为 pdf 文件,而不会损失分辨率或质量:

    ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

  2. 这将 pdfpages 连接成一个:

    pdftk *.pdf cat output combined.pdf

  3. 最后,我添加了一个 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

相关内容