Pdf 将ImageMagic转换脚本转换为Ghostscript脚本

Pdf 将ImageMagic转换脚本转换为Ghostscript脚本,pdf,imagemagick,ghostscript,imagemagick-convert,Pdf,Imagemagick,Ghostscript,Imagemagick Convert,我有一个ImageMagick命令,用于将PDF的第一页转换为图像 convert file.pdf[0] -background white -flatten -resize 173 \ -crop 173X229+0+0 -gravity NorthWest +repage test.jpg 这里我需要173像素宽的图像,最大229像素高的第一页。 对于较大的文件(约9MB),转换大约需要2分钟 当我尝试使用gs测试它时,脚本只花了几分之一秒: gs -sDEVICE=jpeg

我有一个ImageMagick命令,用于将PDF的第一页转换为图像

convert file.pdf[0] -background white -flatten -resize 173 \
     -crop 173X229+0+0 -gravity NorthWest +repage test.jpg
这里我需要173像素宽的图像,最大229像素高的第一页。 对于较大的文件(约9MB),转换大约需要2分钟

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

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

我需要帮助将图像大小调整为173像素,然后将高度裁剪为229像素。有人能帮上忙吗?

在/ghostpdl/Resource/Init/pdf_main.ps的第2086行左右是执行缩放的常规pdf_PDF2PS_矩阵。在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开关,因为这样可以保留正常的资源,并且只在需要执行此任务时才使用此修改后的代码。

阅读Ghostscript文档:-)您将需要-dFIXEDMEDIA开关以及-gXandY来设置所需的页面大小(以像素为单位)然后您最终需要-dPDFFitPage将页面缩放到这些维度。谢谢@KenS。通过使用上面的提示,我可以让它工作一些-`gs-sDEVICE=jpeg-dFirstPage=1-dLastPage=1-g173x229-dFIXEDMEDIA-dPDFFitPage-o test6.jpg file.pdf`但是还有一个问题-当我使用面向横向的pdf时,我会得到一个旋转的图像。i、 e图像旋转为potrait。我似乎找不到对此有用的东西。你能帮忙吗?我尝试添加params--c“setpagedevice”,但这会引发一个错误如果它在旋转时更适合,FitPage例程将旋转它,因为它涉及的降尺度更少。如果要避免这种情况,需要重写代码。他们是用PostScript写的,你是如何用PostScript编码的?改变媒体匹配中的方向不会有帮助,因为您已经用-gI指定了媒体大小,但我想学习一下。我需要知道,如果这不是一个大任务,那么我会深入去做。如果有一些例子可供参考,那将非常有帮助。在我看来,这项工作是在/ghostpdl/Resource/Init/pdf_main.ps中定义的常规pdf_PDF2PS_矩阵中完成的。它确实有一些最低限度的意见在那里,所以你可能能够了解到底发生了什么。谢谢。工作非常好。我发现风景画和肖像画都留下了大量空白。我们能做些什么吗?你可以做各种各样的事情。我记得空白在原始文档中,但它使用CropBox让Acrobat显示,而没有它。要么首先使文档不带空格,要么设置-dUseCropbox。如果将横向页面渲染到固定的纵向介质,则它们总是会有空白。