转换 ImageMagick 将脚本转换为 Ghostscript 脚本

Convert ImageMagic convert script to Ghostscript script

我有一个 ImageMagick 命令可以将 PDF 的第一页转换为图像。

convert file.pdf[0] -background white -flatten -resize 173 \
     -crop 173X229+0+0 -gravity NorthWest +repage test.jpg

这里我需要 173px 宽度的图像,最大 229px 高度的第一页。 对于更大的文件 (~9MB),转换大约需要 2 分钟。

当我尝试使用以下 gs 测试它时,脚本只用了几分之一秒:

gs -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -o test4.jpg file.pdf

我需要帮助将图像大小调整为 173 像素,然后将高度裁剪为 229 像素。任何人都可以帮助这个 gs 脚本吗?

在 /ghostpdl/Resource/Init/pdf_main.ps 中,大约第 2086 行是执行缩放的例程 pdf_PDF2PS_matrix。在第 2094 行附近,我们看到:

currentpagedevice /.HWMargins get aload pop
currentpagedevice /PageSize get aload pop
% Adjust PageSize and .HWMargins for the page portrait/landscape orientation
2 copy gt   % PageSize_is_landscape
7 index aload pop 3 -1 roll sub 3 1 roll exch sub exch
10 index /Rotate pget not { 0 } if cvi 90 idiv 1 and 0 ne { exch } if
gt  % Box_is_landscape
ne {
  1 index 0 translate 90 rotate % add in a rotation

这将根据 PDF 文件中请求的媒体方向检查已设置的媒体方向,如果它们不相同,则将 PDF 文件旋转 90 度。

您可以将其更改为:

currentpagedevice /.HWMargins get aload pop
currentpagedevice /PageSize get aload pop
% Adjust PageSize and .HWMargins for the page portrait/landscape orientation
2 copy gt   % PageSize_is_landscape
7 index aload pop 3 -1 roll sub 3 1 roll exch sub exch
10 index /Rotate pget not { 0 } if cvi 90 idiv 1 and 0 ne { exch } if
gt  % Box_is_landscape
ne pop false {
  1 index 0 translate 90 rotate % add in a rotation

这将阻止 if 子句的执行(通过从堆栈中弹出布尔值并将其替换为 'false'),因此不会发生旋转。

对我来说,这不会旋转您的横向页面。

你如何使用它取决于你的 Ghostscript 是如何构建的,这可能取决于你的 Linux 发行版的包维护者。

如果资源被内置到ROM文件系统中,那么您将需要找到存储在磁盘上的副本,修改文件,然后重建Ghostscript以便将修改后的文件内置到ROM文件系统中,或者使用 -I 开关告诉 Ghostscript 忽略 ROM 文件系统并从磁盘上的某个位置读取资源。

如果 Ghostscript 未构建为使用 ROM 文件系统,那么您需要在磁盘上找到资源,并修改该文件。或者您可以再次使用 -I 开关告诉 Ghostscript 使用一组修改后的资源。

总的来说最好使用 -I 开关,因为这样您可以保留正常资源,并且仅在您要执行此任务时才使用此修改后的代码。