我需要针对文件大小优化一些大型 PDF 文档,所以我尝试使用ghostscript
, 调用如下:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -sOutputFile=output-my-doc.pdf input-my-doc.pdf
我可以看到它在某些页面上运行,但是在特定页面上它崩溃了。
我更新到gs
9.02 版,我也有同样的经历。将文档拆分成单独的页面后,在每个页面上运行上面的命令,我可以确认哪些页面是有问题的;事实上,即使我只是调用,错误也会发生gs input-my-doc-pageX.pdf
- 这会启动一个查看器,我可以看到文本排版,直到它出现在图像中,当它崩溃时。
所以我可以确认在我的情况下,gs
特定图像上的崩溃 - 最后我还可以提供一个最小的工作(或者更确切地说,非工作)示例,它演示了问题(如下)。特别是,问题似乎是 8 位 RGB 图像,以某种方式指定。
现在,我不知道这是否是一个错误,但因为我需要完成这件事 - 我想也许我可以ghostscript
通过应用程序运行 PDF 来“作弊”,这几乎不会影响 PDF - 除了那个它会将图像重新编码为单一格式(例如 PNG);这样gs
优化器也可以在不崩溃的情况下运行这些文件。
在 Linux 中使用命令行仅重新编码给定 PDF 的图像有哪些选项?
非常感谢您的任何答案,
干杯!
PS:测试用例基本上是帖子中的源代码PDF示例:Imagemagick:为PDF flate嵌入生成原始图像数据?.
该 PDF ( hello2.pdf
) 可以很好地打开,例如evince
:
...但是由于它的外部参照表已损坏,因此我对其进行了修复:
$ pdftk hello2.pdf output hello2O.pdf
$ qpdf --check hello2O.pdf
checking hello2O.pdf
PDF Version: 1.4
File is not encrypted
File is not linearized
No errors found
修复后的文件hello2O.pdf
也可以正常打开evince
- 但是,当我尝试对其运行上述gs
优化命令时,它会失败:
$ gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -sOutputFile=optihello2O.pdf hello2O.pdf
GPL Ghostscript 9.02 (2011-03-30)
Copyright (C) 2010 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Loading NimbusSanL-Regu font from /usr/share/ghostscript/9.02/Resource/Font/NimbusSanL-Regu... 2756020 1410650 1869284 568021 3 done.
Error: /undefined in --run--
Operand stack:
--dict:6/15(L)-- false --dict:11/19(L)-- --dict:4/4(L)-- --nostringval-- FlateDecode --dict:4/4(L)-- 0
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1910 1 3 %oparray_pop 1909 1 3 %oparray_pop 1893 1 3 %oparray_pop --nostringval-- --nostringval-- 2 1 1 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- false 1 %stopped_push --nostringval-- %loop_continue --nostringval-- 576 --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- --nostringval--
Dictionary stack:
--dict:1160/1684(ro)(G)-- --dict:1/20(G)-- --dict:82/200(L)-- --dict:82/200(L)-- --dict:108/127(ro)(G)-- --dict:295/300(ro)(G)-- --dict:23/30(L)-- --dict:6/8(L)-- --dict:25/40(L)-- --dict:7/17(L)--
Current allocation mode is local
GPL Ghostscript 9.02: Unrecoverable error, exit code 1