Linux PDF/Postscript 优化

6
我有一个使用Java和iText构建的报告系统。PDF模板是使用Scribus创建的。Java代码使用iText将数据合并到文档中。然后将文件复制到NFS共享,BASH脚本打印它们。
我使用acroread将它们转换为PS,然后打印PS。
FOSS应用程序pdftops效率非常低。
我的主要问题是使用iText / Scribus生成的PDF非常大。最近,我遇到了这样的问题,即acroread在处理大型(300+页)文档时会达到4GB的内存使用量而崩溃。(Adobe更新64位软件的速度非常慢)
现在,我可以在Windows上使用Adobe Reader,并使用“减小文件大小”选项或类似选项,它可以大大(> 10倍)减小PDF的大小(它似乎删除了有关表单字段等的大量元数据),并生成基本上是打印图像的PDF。
我的问题是,是否有人知道Linux上做类似事情的好解决方案/程序。理想情况下,它将优化PDF,减小大小,并减少PS复杂性,以便打印机可以更快地打印,因为现在每页需要15-20秒才能打印。

Scribus被认为可以创建出色的PDF,iText也备受尊重。然而,pdftops基本上会在PostScript中发出矢量列表,这几乎是最糟糕的方式。你为什么需要PostScript?PDF更容易处理。 - Javier
我实际上没有使用pdftops,我正在使用acroread。我使用PS打印到一台不直接支持pdf打印的打印机。 - Sheldon Ross
您可以使用CUPS打印PDF,同时注意打印机特定问题。 - Javier
如上所述,lpr是CUPS系统的一部分。实际上,CUPS使用pdftops来转换和打印pdf文件。由于pdftops存在上述的低效问题,我使用acroread -toPostScript将pdf转换为ps格式。然后使用lpr(CUPS)打印生成的Postscript文件。 - Sheldon Ross
gs -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf input.pdf离成功只差一步之遥。这个命令可以大大减小文件大小,但是会破坏字体。我已经尝试了很长时间,但无法找到正确的字体。 - Sheldon Ross
2个回答

5
为了减小PDF文件的大小,可以使用我正在开发的软件pdfsizeopt。它支持Linux、Mac OS X、Windows(也可能支持其他系统)。
由于pdfsizeopt有许多依赖项,因此安装可能会有点麻烦(需要大约10分钟)。我正在努力使安装更加简便。
如果您需要快速解决问题,可以尝试其中的一个依赖项:Multivalent tool.pdf.Compress,它是纯Java工具。
获取Multivalent20060102.jar,安装Java并运行即可。
java -cp Multivalent20060102.jar tool.pdf.Compress input.pdf

gs -sDEVICE=pdfwrite的功能有限制:

  • 无法生成xref流(因此PDF将比必要的大)
  • 无法生成对象流(因此PDF将比必要的大)
  • 不能去重图片或其他对象(即,如果相同的图像在输入PDF中出现多次,则gs会为每个出现的副本在输出中创建一个副本)
  • 它发出的图像不够优化
  • 它重新对图像进行低分辨率的采样
  • 它有时会省略PDF中的超链接
  • 它不能转换某些结构(因此输出的PDF可能与输入的视觉上不同)

pdfsizeopt和Multivalent的tool.pdf.Compress都没有这些限制。


4
gs \
  -dCompatibilityLevel=1.4 \
  -dPDFSETTINGS=/screen \
  -dNOPAUSE \
  -dBATCH \
  -sDEVICE=pdfwrite \
  -sOutputFile=output.pdf \
   input.pdf

Ghostscript似乎对大多数情况都有效。但我现在遇到了另一个问题,即Ghostscript破坏了嵌入的字体,但我会为此打开一个新问题。


2
你使用的是哪个Ghostscript版本?你是否知道/screen会将你的图像重新采样为相当低的分辨率(72 dpi),这可能适用于屏幕渲染,但可能会在打印机上出现打印质量问题。 - Kurt Pfeifle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接