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


11

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


更新:

根据Marco的回复,BW pdf不好,原始文件在这里


试试scantailor
frostschutz

scantailor在准备OCR扫描时,它还有许多其他有用的功能,这就是我建议使用它的唯一原因(作为评论,而不是答案)
frostschutz

您可以在libreoffice中打开和导出(至少一些).pdf(并因此导出)(因此,我猜想大多数现代的文字处理器)。不知道这是否会使您所需的更改变得容易或容易。
goldilocks

1
还有pdfimages(poppler)从其PDF容器中提取扫描的图像。首先使用ImageMagick处理它们可能会更有效率。
弗罗斯特斯

Answers:


9

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

谢谢!运行第一个命令的一个问题:原始灰度pdf约为25MB,并且15分钟后运行尚未完成,输出文件mono.ps已经为150MB并仍在增加。我为此担心。还有其他方法,例如打印到BW pdf文件吗?
蒂姆(Tim)

@Tim并不少见。PostScript文件未压缩,因此生成的PDF会更小。
Marco Marco

谢谢。花了大约20分钟。BW pdf不好。原始文件在这里
Tim

@Tim糟糕的质量,无论您做什么都不适合OCR。
弗罗斯特斯

4

我发现的最好方法是没有质量损失的情况,它消除了阴影,噪音,下一页上的文字渗入等等:

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 

3

我还扫描了一些要转换为黑白的彩色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

2

实际上,如果它来自扫描,则唯一合理的方法是使用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

2

感谢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

您应该引用外壳变量;尤其是来自参数或其他用户输入的参数,例如"./$input_pdf_name"and seq 1 "$num_pages"。另外,您可能想要更改`…`$(…)-参见thisthisthis
G-Man说

这是OccamsRazor的脚本,除了我指出的更改。我不是shell程序员,所以我不想弄乱任何有用的东西。但是,如果有人要清理,请多谢。
低墙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.