我有以下问题:
我从Kyocera扫描仪设备接收各种扫描的PDF文件。
我必须自动操作这些PDF文件才能:
我正在使用Bash-Script来完成这项工作。
要删除文字标记颜色并转换为灰度,请使用imagemagick:
convert -density 150 INPUT.pdf \
-channel rgba \
-alpha set \
-fuzz 15% \
-fill white \
-opaque 'rgb(255,200,195)' \
-opaque 'rgb(255,253,177)' \
-opaque 'rgb(255,155,240)' \
-opaque 'rgb(255,91,193)' \
-colorspace gray OUTPUT-convert.pdf
结果图像非常好,但PDF的大小很大:
原文:365K 转换:1.358K
所以我找到了一个ghostscript命令来完成这项工作并减小文件大小:
gs -dSAFER -dBATCH -dNOPAUSE -dNOCACHE -dCompatibilityLevel=1.4 \
-sDEVICE=pdfwrite \
-sColorConversionStrategy=/LeaveColorUnchanged \
-dPDFSETTINGS=/ebook \
-sOutputFile=OUTPUT-ghostscript.pdf OUTPUT-convert.pdf
现在文件大小为:
原文:365K 转换:1.358K(OUTPUT-convert.pdf) Ghostscript:500K(OUTPUT-ghostscript.pdf)
我无法弄清楚为什么操作后的PDF尺寸(从彩色到灰度)高于原始文档。密度(150 dpi)是原始文档的分辨率。
当我在Windows上通过Adobe Acrobat放置转换的PDF(1.358K)并重新创建PDF时,大小为213K。我没有质量上的损失。如何使用bash脚本在linux下实现这一目标?
感谢任何帮助!
以下是PDF文件的链接:
http://62.75.158.162/download/yKLu3fkbLy7MgkczDrKdG6osHdXh3jvy/
答案 0 :(得分:0)
如果没有看到示例文件,就不可能非常评论,以确定每个阶段到底发生了什么。
然而,我非常强烈怀疑你 &#39>失去了质量',只是在屏幕分辨率下,你无法说出来。您的原始PDF文件是使用ImageMagick以150 dpi的分辨率创建的。很可能图像是在PDF文件中未压缩存储的,这就是它的大小。
当您通过Ghostscript运行该PDF文件时,有两种效果。首先,您已经使用了PDFSETTINGS固定的作业配置集。 (在很多其他事物中)将灰度图像下采样到150 dpi的分辨率(幸运的是,对你来说没有效果)。它还使用JPEG压缩压缩图像数据。
现在我不知道原始PDF文件中的内容是什么,但是如果使用JPEG压缩数据,看起来似乎很可能,那么你就是双重应用JPEG量化。这是一个有损的过程,会导致质量下降。
由于您要更改原始图像数据(更改颜色),因此您无法解压缩图像数据。但是,为了保持质量,您不应再使用JPEG压缩,而应使用Flate压缩。压缩比不会很好,但它会保持质量不变。要做到这一点,你需要使用distillerparams指定GrayImageFilter,你不能使用PDFSETTINGS。
我无法想象Acrobat已经采取了哪些措施来进一步减少文件大小(而且您还没有说过如何重新创建PDF文件'),但我想象一下涉及进一步降低图像质量。很难看出如何在不这样做的情况下节省50%的文件大小。它也可能(如Ghostscript)JPEG压缩灰度数据,但使用更积极的JPEG参数集(当然,导致更多的质量损失)。
如果您发布了原始,Ghostscript输出和Acrobat输出的示例,我可以告诉您更多信息,但不能告诉您更多信息。
为了它的价值,Ghostscript中有一个新功能(需要9.23或更高版本),它允许您创建一个仅包含图像的PDF文件,并选择颜色模型。您可以使用以下内容通过Ghostscript运行原始PDF文件:
gs -sDEVICE = pdfimage8 -r150 -sOutputFile = gs.pdf
这将产生一个非常小的PDF文件,其中原始输入已被渲染为灰度图像(150 dpi),并且该图像被包裹为PDF文件。我不知道这对你来说是否会更好。
后来编辑
是的,这几乎是我的预期。
原始文件似乎标记为JPEG压缩文物(所有矩形'斑点'文本周围)。显然,如果没有看到原始文档,我无法判断这是因为原始文档是JPEG打印到纸上,还是文件是由扫描仪引入的,还是(更有可能)应用程序将扫描图像转换为PDF。检查存储在PDF文件中的图像我发现它确实是一个JPEG图像。
然而,原始图像(在我看来)确实非常嘈杂。
现在来自'转换'可以说比原版略好(在易读性方面)。我认为这是“'与转换命令行有关,无法确定。在这种情况下,图像不是JPEG,它使用RunLength编码压缩,当然这是无损的。它作为压缩方法的效率也较低,因此图像更大。出于ImageMagick最熟悉的原因,它还将软掩模应用于图像数据。所以现在每页只有两张图片,而不仅仅是1.不要太惊讶它比原版更大!
我怀疑软掩码是由你的命令行包括RGBA引起的。我假设产生了一个alpha通道,而PDF dons不支持简单的alpha通道混合,它自己的透明度模型很多更复杂。所以我怀疑你实际上是在使输出文件比它需要的更大。我担心我无法帮助你使用ImageMagick,我对此一无所知,但摆脱第二张图片会有很大帮助。
请注意,原始文件和ImageMagick的输出基本上都是未压缩的(根据PDF文件'结构')。
然后我们来到Ghostscript制作PDF。 '结构' PDF文件本身是压缩的,可以带来小尺寸的好处。图像都是JPEG压缩的,提供额外的压缩,但代价是质量。多次应用JPEG量化始终会降低质量。只需比较“转换”的输出即可。使用Ghostscript的输出我可以很容易地看到质量的下降。
现在我们来看Acrobat输出。与其他文件进行比较,显示质量最差。 JPEG图案在显示的图像中非常清晰可见。在这种情况下,图像和软掩模都使用JPEG2000压缩方案进行压缩,这是一种更好的压缩方案。压缩比JPEG。但是,看起来将它应用于已经为JPEG量化的数据会产生相当差的质量结果。或者至少将它应用于软掩模的JPEG图像: - )
JPEG2000的主要问题是它受到专利保护。虽然解码器可以免费编写,但要编写编码器,您必须从(许多)专利持有者那里获得专利技术许可,这是一个昂贵的过程。
因此AGPL版本的Ghostscript不包含JPEG2000解码器,因此无法写入JPEG2000图像。
显然,您可以使用Acrobat的副本,使用JPEG2000压缩来重写PDF文件。正如您在此处所做的那样。
假设你想避免这样做,那么我的建议是调查为什么转换正在生成一个应用了软掩码的图像。我强烈怀疑这是由于使用了rgba而不是rgb。
避免创建第二个(软掩码)图像(我相信)会显着减小' convert'生成的PDF文件的大小。通过Ghostscript的pdfwrite设备运行并为GrayImageFilter指定/ FlateEncode,您可以获得至少一些额外的好处,而不会有任何质量损失。这将产生PDF文件,其中PDF家具被压缩,并且更好的压缩方案应用于图像数据。
您也可以将Ghostscript线保留原样,质量下降可能足以让您忍受。
答案 1 :(得分:0)
如果您使用ubuntu,则可以在命令行上尝试。结果令人印象深刻
为Ubuntu / Debian安装ghostscript:
sudo apt-get install ghostscript
使用以下命令调整pdf大小:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
用文件名替换文件output.pdf和input.pdf。
答案 2 :(得分:0)
PDF可以作为矢量开始。但是,一旦将其读入ImageMagick,它就会被光栅化。写回PDF时,它只是将光栅图像嵌入到矢量PDF外壳中。因此,尚未对其进行矢量化处理。
您对-density 150的使用增加了栅格化的文件。标称密度为72。因此将其增加4倍,这几乎可以满足您的尺寸增加要求。我认为您说的增加是错误的。可能应该是Original: 365K Converted: 1.358M
而不是Original: 365K Converted: 1.358K
此外,如果扫描的PDF是矢量中的光栅,则其调色板格式或压缩JPG格式的颜色可能有限。栅格化已转换为24位颜色,并且通过处理已增加了颜色。因此,即使非压缩灰度也更大。
您可以按照以下方法在ImageMagick中压缩输出PDF,方法是将光栅图像写入压缩的JPG格式,然后通过管道传递到另一个转换文件以写入PDF。
convert -density XXX input.pdf ... -colorspace gray -quality 50 JPG:- | convert - output.pdf
根据需要调整质量值