【问题标题】:Convert ImageMagic convert script to Ghostscript script将 ImageMagick 转换脚本转换为 Ghostscript 脚本
【发布时间】:2016-09-09 11:23:35
【问题描述】:

我有一个 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 脚本?

【问题讨论】:

  • 阅读 Ghostscript 文档 :-) 您将需要 -dFIXEDMEDIA 开关以及 -gXandY 来设置所需的页面大小(以像素为单位),然后您最终需要 -dPDFFitPage 将页面缩放到那些尺寸。
  • 谢谢@KenS。通过使用您上面的提示,我可以得到一些工作 - ` gs -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -g173x229 -dFIXEDMEDIA -dPDFFitPage -o test6.jpg file.pdf `但是还有一个问题- 当我使用面向横向的 pdf 时,我得到一个旋转的图像。即图像被旋转为肖像。我似乎找不到任何有用的东西。你能帮我吗?我尝试添加参数 - -c "> setpagedevice" 但这会引发错误
  • 如果它在旋转时更适合,FitPage 例程将旋转它,因为它涉及的缩小较少。如果您想避免这种情况,则需要重写该代码。它们是用 PostScript 编写的,您在 PostScript 中编码如何?更改媒体匹配中的方向无济于事,因为您已使用 -g 指定了媒体大小
  • 我从来没有用过 PostScript 编码,但我想学习它。我需要知道它是否不是一项大任务,然后我会深入去做。如果有一些例子可供参考,那将有很大帮助。
  • 好吧,在我看来这项工作是在 /ghostpdl/Resource/Init/pdf_main.ps 中定义的例程 pdf_PDF2PS_matrix 中完成的。它确实有一些最小的 cmets,所以你可以弄清楚发生了什么。

标签: pdf imagemagick ghostscript imagemagick-convert


【解决方案1】:

在 /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 子句执行(通过从堆栈中弹出布尔值并将其替换为“假”),因此不会发生轮换。

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

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

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

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

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

【讨论】:

  • 谢谢。工作得很好。我看到横向和纵向样式的图片中都留下了很多空白。我们能做些什么呢?
  • 你可以做各种各样的事情。我记得空白在原始文档中,但它使用 CropBox 让 Acrobat 显示没有它。要么首先制作没有空格的文档,要么设置 -dUseCropbox。如果将横向页面渲染到固定的纵向媒体,横向页面总是会有空白。
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2011-02-19
相关资源
最近更新 更多