我正在尝试为Linux编写一个小程序来调整PDF大小并调整边距 . 我的计划是使用Ghostscript作为后端 . 此终端命令成功调整大多数PDF的大小:
gs -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dFIXEDMEDIA -dPDFFitPage \
-dDEVICEWIDTHPOINTS=300 -dDEVICEHEIGHTPOINTS=400 -sOutputFile=out.pdf file.pdf
-dPDFFitPage
选项缩放页面以适合新大小,如果图像宽高比与指定尺寸不匹配,则将空格添加为填充 . 删除 -dPDFFitPage
会更改页面大小而不进行缩放 - 如果页面太大则会裁剪页面,如果太小则会添加空白页面 .
但是,该命令没有't work with PDFs created by ImageMagick' s "convert"程序 . 缩放PDF但不添加空格,因此输出文件中只有一个维度正确 . 如果没有 -dPDFFitPage
选项,则会按预期裁剪超大图像,但如果图像小于新页面大小(即没有添加空格),则不会发生任何事情 .
似乎问题在于PDF除了图像之外是空的 . 如果有必要,我如何让Ghostscript调整页面大小并用白色填充页面的空白部分?
Edit: Example files
要查看问题,请尝试使用这些example files(还有示例Ghostscript输出PDF) .
或者,使用ImageMagick(或任何图像编辑器)自己创建合适的示例图像:
convert -size 500x500 xc:skyblue -fill black -draw "circle 250,250 0,250" image.png
现在,使用ImageMagick( NOT 任何其他程序)将其转换为PDF:
convert image.png file.pdf
现在尝试使用Ghostscript代码 . 看看你尝试时会发生什么:
-
有和没有
-dPDFFitPage
-
的宽度和高度小于原始宽度,并且它们更大
要查看它应该如何工作,请尝试使用任何其他工具将示例图像转换为PDF . 您可以(例如)使用LibreOffice或LaTeX,或者使用您刚制作的PDF(不起作用的PDF)和"Print"来创建另一个PDF(由于某种原因可以使用) . 确保图像填满PDF的整个页面(用于使用Ghostscript测试的PDF中不应有空格/边框,但Ghostscript创建的输出PDF应该有一些空格 . )
2 回答
您的原始PDF文件(
NotWorking.pdf
)除/MediaBox
外还包含/CropBox
. 这将传递到输出PDF文件,并且由于-dPDFFitPage
的工作方式,它将以与PDF文件的实际内容相同的方式进行适当修改 . 结果是缩放文件看起来与原始文件相同 .它不一样,原始文件的
/MediaBox
为[0 0 500 500]
,修改后的文件/MediaBox
为[0 0 300 400]
. 但效果是它看起来是一样的,在一个执行/CropBox
的读者 .尝试通过Ghostscript运行两个'modified'文件,看看会发生什么 . 默认情况下,Ghostscript会尊重
/MediaBox
,而不是/CropBox
.一旦您尝试通过Ghostscript运行两个输出文件,请尝试使用
-dUseCropBox
.你需要......
...要么禁用
/CropBox
,...或将其设置为与
/MediaBox
相同,如果需要做
pdfmark
操作 . 您可能希望参考this answer以获取更多指示 .只是一个额外的指针......
/CropBox
个定义, method to provide one via a -c "[...pdfmark" parameter for Ghostscript 将无效!在这些情况下,通常将PDF文件中的现有
/CropBox
关键字更改为小写常常有帮助:将其更改为/cropBox
(因为PDF关键字区分大小写,将不再识别/使用) .您可以使用任何方法执行此操作:文本编辑器(使用不会改变您背后的EOL字符的文件编辑器!)或
sed
,或者......要检查,如果定义的* Box与默认的
/MediaBox
(每个PDF文件中必须存在)不同,则可以使用pdfinfo -box
. 此命令将始终报告/MediaBox
的值,也报告/CropBox
,/BleedBox
,/ArtBox
和/TrimBox
的值 . 在/CropBox
,/BleedBox
,/ArtBox
和/TrimBox
未在PDF文档中明确定义的情况下,该工具将报告为/MediaBox
设置的相同值:但是,如果
/CropBox
定义明确存在,但在设置为/MediaBox
时设置为相同的值,则无效:在这些情况下,您必须查看PDF源代码,或运行:
正如您所看到的,文件
NotWorking.pdf
确实已经预先设置了自己的显式/CropBox
值...One more caveat, be warned: