代码之家  ›  专栏  ›  技术社区  ›  Penguin

操作后压缩PDF

  •  2
  • Penguin  · 技术社区  · 7 年前

    我有以下问题:

    我正在接收来自京瓷扫描仪设备的各种扫描PDF文件。

    我必须自动处理这些PDF文件,以便:

    1. 从文本标记中删除颜色
    2. 将PDF转换为灰度
    3. 把它放在我们的DMS里

    我正在使用Bash脚本来完成这项工作。

    要删除textmarker颜色并转换为灰度,我使用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(输出Ghostscript.pdf)

    我不明白为什么处理后PDF的大小,从颜色到灰度,都比原始文档大。密度(150 dpi)是原始文档的分辨率。

    当我将转换后的PDF(1.358K)通过Adobe Acrobat放在Windows上并重新创建PDF时,大小是213K。我在质量上没有损失。如何在linux下使用bash脚本实现这一点?

    感谢您的帮助!

    以下是PDF文件示例链接:

    http://62.75.158.162/download/yKLu3fkbLy7MgkczDrKdG6osHdXh3jvy/

    3 回复  |  直到 5 年前
        1
  •  2
  •   KenS    7 年前

    在没有看到示例文件的情况下,不可能进行太多的注释,从而准确地确定每个阶段发生了什么。

    然而,我非常怀疑你 “质量下降”,只是在屏幕分辨率下,你无法分辨。原始PDF文件是使用ImageMagick以150 dpi的分辨率创建的。最有可能的是,图像未压缩存储在PDF文件中,这就是其较大的原因。

    当您通过Ghostscript运行该PDF文件时,有两种效果。首先,您使用了PDFSETTINGS固定作业配置集。(其中) 许多的 其他方面)将灰色图像的分辨率降低到150 dpi(幸运的是,没有效果)。它还使用JPEG压缩来压缩图像数据。

    现在我不知道原始PDF文件中有什么内容,但如果那里的数据是使用JPEG压缩的(这似乎是可能的),那么您将双重应用JPEG量化。这是一个有损过程,将导致质量损失。

    由于您正在更改原始图像数据(以更改颜色),因此您没有选择解压缩图像数据。然而,为了保持质量,不应再次使用JPEG压缩,而应使用扁平压缩。压缩比不会那么好,但会保持质量不变。要做到这一点,需要使用蒸馏参数指定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图像。

    尽管如此,原始图像(在我看来)确实非常嘈杂。

    现在,“convert”的输出(在易读性方面)可以说略优于原始输出。我想这与您的convert命令行有关,但不能确定。本例中的图像为 一个JPEG,它用运行长度编码进行压缩,这当然是无损的。作为一种压缩方法,它的效率也较低,因此图像更大。出于ImageMagick最为熟知的原因,它还将软掩码应用于图像数据。因此,现在每页有两张图像,而不仅仅是一张。不足为奇的是,它比原来的大!

    我怀疑软掩码是由于您的命令行(包括RGBA)造成的。我假设这会生成一个alpha通道,PDF不支持简单的alpha通道混合,它自己的透明度模型是 更复杂。所以我有点怀疑您实际上是在使输出文件比需要的大。恐怕我无法帮助您使用ImageMagick,我对此一无所知,但去掉第二张图像会有很大帮助。

    请注意,原始文件和ImageMagick的输出基本上都是未压缩的(就PDF文件“结构”而言)。

    然后我们来看看鬼脚本生成的PDF。PDF文件的“结构”本身是压缩的,因此具有小尺寸的优点。这些图像都是JPEG压缩的,提供了额外的压缩,但以牺牲质量为代价。多次应用JPEG量化 总是 成本和质量。通过简单地比较“convert”的输出和Ghostscript的输出,我可以很容易地看到质量的下降。

    现在我们来看看Acrobat的输出。与其他文件相比,它的质量最差。JPEG人工制品在显示的图像中非常清晰可见。在这种情况下,图像和软掩码都已使用JPEG2000压缩方案进行压缩,这是一种比JPEG“更好”的压缩。然而,将其应用于已经为JPEG量化的数据似乎会产生非常差的质量结果。或者至少,将其应用于软屏蔽JPEG图像会:-)

    JPEG2000的主要问题是它有专利权。虽然可以免费编写解码器,但要编写编码器,必须从(许多)专利持有人那里获得专利技术许可,这是一个昂贵的过程。

    因此,Ghostscript的AGPL版本不包括JPEG2000解码器,因此无法写入JPEG2000图像。

    显然,您可以使用Acrobat的副本用JPEG2000压缩重写PDF文件,就像您在这里所做的那样。

    假设您希望避免这样做,那么我的建议是调查convert为什么要生成应用了软遮罩的图像。我强烈怀疑这是由于使用rgba而不是rgb。

    避免创建第二个(软遮罩)图像(我相信)会显著减小“convert”生成的PDF文件的大小。通过Ghostscript的pdfwrite设备运行它并为GrayImageFilter指定/FlateEncode,您至少可以获得一些额外的好处,而不会损失任何质量。这将生成一个PDF文件,在该文件中对PDF家具进行压缩,并对图像数据应用更好的压缩方案。

    您也可以只保留Ghostscript行,质量下降可能足以让您忍受。

        2
  •  0
  •   M E S A B O    5 年前

    如果你使用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
    

    替换文件名输出。pdf和输入。包含文件名的pdf。

        3
  •  0
  •   fmw42    5 年前

    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
    


    根据需要调整质量值