我试图为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来调整页面大小,并用白色填充页面的空白部分?
编辑:示例文件
要了解问题所在,请尝试使用这些示例文件 (还有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(由于某种原因,这将有效)。确保图像填充了PDF的整个页面(在用Ghostscript测试的PDF中不应该有空白/边框,但是Ghostscript创建的输出PDF应该有一些空格)。
发布于 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
进行尝试。
你需要..。
/CropBox
,/MediaBox
相同,如果需要做pdfmark
操作。为了获得更多的指针,您可能希望参考这个答案。
发布于 2015-05-24 17:16:43
只是另外一个指针..。
/CropBox
定义的情况下,通过Ghostscript的参数提供方法将无法工作!在这些情况下,首先将PDF文件中的现有/CropBox
关键字“解除”为小写通常会有所帮助:让它读取/cropBox
(因为PDF关键字区分大小写,它将不再被识别/使用)。
您可以使用您可以使用的任何方法来完成此操作:文本编辑器(使用一个不会在背后更改EOL字符的编辑器),或者sed
,或者.
要检查,如果定义了与默认/MediaBox
不同的*框(必须在每个pdfinfo -box
文件中),则可以使用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
命令不会发现在将各自的/CropBox
对象嵌入到/ObjStm
对象(“对象流”)中而使其模糊的情况下的/ObjStm
设置。
https://stackoverflow.com/questions/30406169
复制相似问题