我正在尝试为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应该有一些空格。)
答案 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)
只是一个额外的指针......
/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
设置( “对象流”)。