首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ghostscript调整ImageMagick PDF的大小

Ghostscript调整ImageMagick PDF的大小
EN

Stack Overflow用户
提问于 2015-05-22 21:31:24
回答 2查看 1.1K关注 0票数 2

我试图为Linux编写一个小程序来调整PDF大小和调整页边距。我的计划是使用Ghostscript作为后端。这个终端命令成功地调整了大多数PDF的大小:

代码语言:javascript
运行
复制
gs -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dFIXEDMEDIA -dPDFFitPage \
 -dDEVICEWIDTHPOINTS=300 -dDEVICEHEIGHTPOINTS=400 -sOutputFile=out.pdf file.pdf

-dPDFFitPage选项缩放页面以适应新的大小,如果图像的高宽比与指定的尺寸不匹配,则添加空白作为填充。删除-dPDFFitPage会改变页面大小而不进行缩放-如果页面太大将被裁剪,如果太小则会添加空白。

但是,该命令不适用于ImageMagick的“转换”程序创建的PDF。PDF被缩放,但是没有添加空格,所以输出文件中只有一个维度是正确的。如果没有-dPDFFitPage选项,就会按照预期裁剪超大大小的图像,但是如果图像小于新的页面大小(即没有添加空白),则不会出现任何情况。

问题似乎在于,除了图像之外,PDF文件是空的。如果需要,我如何让Ghostscript来调整页面大小,并用白色填充页面的空白部分?

编辑:示例文件

要了解问题所在,请尝试使用这些示例文件 (还有Ghostscript输出PDF示例)。

或者,使用ImageMagick (或任何图像编辑器)自己创建一个合适的示例映像:

代码语言:javascript
运行
复制
convert -size 500x500 xc:skyblue -fill black -draw "circle 250,250 0,250" image.png

现在,使用ImageMagick (__而不是任何其他程序)将其转换为PDF:

代码语言:javascript
运行
复制
convert image.png file.pdf

现在用Ghostscript代码试试这个。看看你尝试的时候会发生什么:

  • 有和没有-dPDFFitPage
  • 它的宽度和高度比原来的要小,而且要大一些。

要了解它应该如何工作,请尝试使用任何其他工具将示例图像转换为PDF。您可以(例如)使用LibreOffice或LaTeX,也可以使用您刚刚创建的PDF (没有工作的PDF )并“打印”它来创建另一个PDF(由于某种原因,这将有效)。确保图像填充了PDF的整个页面(在用Ghostscript测试的PDF中不应该有空白/边框,但是Ghostscript创建的输出PDF应该有一些空格)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-24 13:30:06

原始的PDF文件(NotWorking.pdf)除了包含一个/CropBox之外,还包含一个/MediaBox。这被传递到输出PDF文件中,并且由于-dPDFFitPage的工作方式,它被适当地以与PDF文件的实际内容相同的方式进行修改。其结果是,缩放后的文件看起来与原始文件相同。

它是不一样的,原始文件有一个/MediaBox of [0 0 500 500],修改后的文件有一个/MediaBox of [0 0 300 400]。但其效果是,在强制执行/CropBox的阅读器中,它看起来是一样的。

尝试通过Ghostscript运行这两个“修改”文件,看看会发生什么。默认情况下,Ghostscript授予/MediaBox,而不是/CropBox

尝试通过Ghostscript运行这两个输出文件之后,使用-dUseCropBox进行尝试。

你需要..。

  • ...either禁用/CropBox
  • ...or将其设置为与/MediaBox相同,

如果需要做pdfmark操作。为了获得更多的指针,您可能希望参考这个答案

票数 1
EN

Stack Overflow用户

发布于 2015-05-24 17:16:43

只是另外一个指针..。

  • 在输入的PDF文件中已经有/CropBox定义的情况下,通过Ghostscript的参数提供方法将无法工作!

在这些情况下,首先将PDF文件中的现有/CropBox关键字“解除”为小写通常会有所帮助:让它读取/cropBox (因为PDF关键字区分大小写,它将不再被识别/使用)。

您可以使用您可以使用的任何方法来完成此操作:文本编辑器(使用一个不会在背后更改EOL字符的编辑器),或者sed,或者.

要检查,如果定义了与默认/MediaBox不同的*框(必须在每个pdfinfo -box文件中),则可以使用pdfinfo -box。这个命令不仅会报告/MediaBox的值,还会报告/CropBox/BleedBox/ArtBox/TrimBox的值。在/CropBox/BleedBox/ArtBox/TrimBox未在PDF文档中显式定义的情况下,该工具将报告与为/MediaBox设置的相同值。

代码语言:javascript
运行
复制
$ pdfinfo -box "out(NotWorking).pdf"

 Title:          NotWorking
 Producer:       GPL Ghostscript 9.15
 CreationDate:   Sun May 24 00:38:55 2015
 ModDate:        Sun May 24 00:38:55 2015
 Tagged:         no
 UserProperties: no
 Suspects:       no
 Form:           none
 JavaScript:     no
 Pages:          1
 Encrypted:      no
 Page size:      300 x 300 pts
 Page rot:       0
 MediaBox:           0.00     0.00   300.00   400.00
 CropBox:            0.00    50.00   300.00   350.00
 BleedBox:           0.00    50.00   300.00   350.00
 TrimBox:            0.00    50.00   300.00   350.00
 ArtBox:             0.00    50.00   300.00   350.00
 File size:      16316 bytes
 Optimized:      no
 PDF version:    1.5

但是,在/CropBox定义显式存在但设置为与/MediaBox相同的值的情况下,这没有帮助:

代码语言:javascript
运行
复制
$ pdfinfo -box NotWorking.pdf

 Title:          NotWorking
 Producer:       ImageMagick 6.8.9-9 Q16 x86_64 2015-01-06 http://www.imagemagick.org
 CreationDate:   Sun May 24 00:21:28 2015
 ModDate:        Sun May 24 00:21:28 2015
 Tagged:         no
 UserProperties: no
 Suspects:       no
 Form:           none
 JavaScript:     no
 Pages:          1
 Encrypted:      no
 Page size:      500 x 500 pts
 Page rot:       0
 MediaBox:           0.00     0.00   500.00   500.00
 CropBox:            0.00     0.00   500.00   500.00
 BleedBox:           0.00     0.00   500.00   500.00
 TrimBox:            0.00     0.00   500.00   500.00
 ArtBox:             0.00     0.00   500.00   500.00
 File size:      12343 bytes
 Optimized:      no
 PDF version:    1.4

在这些情况下,您必须查看PDF源代码,否则运行:

代码语言:javascript
运行
复制
for i in *.pdf ; do
   echo $i;
   echo -n "  ";
   grep -a -o --color -P "/.*?Box.*?]" "$i" ;
   echo ;
done

NotWorking.pdf
  /MediaBox [0 0 500 500]
  /CropBox [0 0 500 500]

Working.pdf
  /MediaBox [ 0 0 500 500 ]

out(NotWorking).pdf
  /Type/Page/MediaBox [0 0 300 400]
  /CropBox [0 50.0 300.0 350.0]

out(Working).pdf
  /Type/Page/MediaBox [0 0 300 400]

如您所见,NotWorking.pdf文件已经有了自己的显式/CropBox值预先设置.

还有一个警告:

我上面给出的grep命令不会发现在将各自的/CropBox对象嵌入到/ObjStm对象(“对象流”)中而使其模糊的情况下的/ObjStm设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30406169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档