Ghostscript调整PDF不能使用ImageMagick PDF

时间:2015-05-22 21:31:24

标签: pdf ghostscript

我正在尝试为Linux编写一个小程序来调整PDF大小并调整边距。我的计划是使用Ghostscript作为后端。此终端命令成功调整了大多数PDF的大小:

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调整页面大小并用白色填充页面的空白部分?

编辑:示例文件

要查看问题,请尝试使用这些example files(还有示例Ghostscript输出PDF)。

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

convert -size 500x500 xc:skyblue -fill black -draw "circle 250,250 0,250" image.png

现在,使用ImageMagick 任何其他程序)将其转换为PDF:

convert image.png file.pdf

现在尝试使用Ghostscript代码。看看你尝试时会发生什么:

  • 有和没有-dPDFFitPage
  • 宽度和高度小于原始宽度和高度

要了解假设的工作原理,请尝试使用任何其他工具将示例图像转换为PDF。您可以(例如)使用LibreOffice或LaTeX,或者使用您刚制作的PDF (不起作用的那个)和“打印”它来创建另一个PDF (对于某些人来说)理由会奏效)。确保图像填满PDF的整个页面(用于使用Ghostscript测试的PDF中不应有空格/边框,但Ghostscript创建的输出PDF应该有一些空格。)

2 个答案:

答案 0 :(得分:1)

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

它不相同,原始文件的/MediaBox[0 0 500 500],修改后的文件的/MediaBox[0 0 300 400]。但效果是它在看起来相同,在强制执行/CropBox的读者中。

尝试运行两个修改过的'通过Ghostscript返回文件,看看会发生什么。默认情况下,Ghostscript尊重/MediaBox,而不是/CropBox

一旦您尝试通过Ghostscript运行两个输出文件,请使用-dUseCropBox进行尝试。

你需要......

  • ...要么停用/CropBox
  • ...或将其设置为与/MediaBox
  • 相同

如果需要执行pdfmark操作。您可能希望参考this answer以获取更多指示。

答案 1 :(得分:0)

只是一个额外的指针......

  • 如果输入PDF文件中已有/CropBox个定义,则 方法通过Ghostscript的-c "[...pdfmark"参数提供 不管用!

在这些情况下,首先通过将PDF文件中的现有/CropBox关键字更改为小写来解除对其进行“撤防”通常会有所帮助:将其设为读取/cropBox(因为PDF关键字区分大小写,因此将不再被识别/使用。)

您可以使用任何方法执行此操作:文本编辑器(使用不会改变您背后的EOL字符的文本编辑器!),或sed,或...

要检查是否有*框定义的不同与默认/MediaBox(每个PDF文件中必须存在),您可以使用pdfinfo -box。此命令始终不仅会报告/MediaBox的值,还会报告/CropBox/BleedBox/ArtBox/TrimBox的值。如果/CropBox/BleedBox/ArtBox/TrimBox未在PDF文档中明确定义,则该工具将报告为/MediaBox设置的相同值:

$ 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的相同值,则无效:

$ 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源代码,或运行:

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对象来隐藏相应PDF对象,则上面给出的/CropBox命令不会发现/ObjStm设置( “对象流”)。