重影脚本调整PDF大小不使用ImageMagick PDF
我正试图为Linux编写一个小程序来调整PDF大小和调整页边距。我的计划是使用Ghostscript作为后端。此终端命令成功调整了大多数PDF的大小:重影脚本调整PDF大小不使用ImageMagick PDF,pdf,ghostscript,Pdf,Ghostscript,我正试图为Linux编写一个小程序来调整PDF大小和调整页边距。我的计划是使用Ghostscript作为后端。此终端命令成功调整了大多数PDF的大小: gs -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dFIXEDMEDIA -dPDFFitPage \ -dDEVICEWIDTHPOINTS=300 -dDEVICEHEIGHTPOINTS=400 -sOutputFile=out.pdf file.pdf -dPDFFitPage选项缩放页面以适应新的
gs -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dFIXEDMEDIA -dPDFFitPage \
-dDEVICEWIDTHPOINTS=300 -dDEVICEHEIGHTPOINTS=400 -sOutputFile=out.pdf file.pdf
-dPDFFitPage
选项缩放页面以适应新的大小,如果图像纵横比与指定的尺寸不匹配,则添加空白作为填充。删除-dPDFFitPage
会在不缩放的情况下更改页面大小-如果页面太大,将被裁剪,如果页面太小,将添加空白
但是,该命令不适用于ImageMagick的“convert”程序创建的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
- 宽度和高度小于原始尺寸,且尺寸更大
NotWorking.PDF
)除了/MediaBox
之外,还包含一个/CropBox
。这会一直执行到输出PDF文件,并且由于-dPDFFitPage
的工作方式,它会以与PDF文件实际内容相同的方式进行适当修改。结果是缩放后的文件看起来与原始文件相同
这不一样,原始文件的/MediaBox
为[0 0 500]
,修改后的文件的/MediaBox
为[0 0 300 400]
。但效果是,在一个执行/CropBox
的阅读器中,它看起来是一样的
尝试通过Ghostscript运行这两个“修改过的”文件,看看会发生什么。默认情况下,Ghostscript尊重的是/MediaBox
,而不是/CropBox
尝试通过Ghostscript运行两个输出文件后,请使用-dUseCropBox
进行尝试
你需要
- …或者禁用
/CropBox
- …或将其设置为与
相同/MediaBox
如果需要执行
pdfmark
操作。您可能希望参考以获取更多指针。只是一个附加指针
- 如果输入PDF文件中已有
定义,则通过/CropBox
参数为Ghostscript提供定义的方法将不起作用-c“[…pdfmark”
/CropBox
关键字改为小写:使其读取/CropBox
(由于PDF关键字区分大小写,因此将不再识别/使用)
您可以使用任意方法执行此操作:文本编辑器(使用不会在背后更改下线字符的编辑器!),或sed
,或
要检查,是否定义了与默认值不同的*框(每个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
值预设
还有一个警告,请注意:
如果各个PDF对象被嵌入到/ObjStm
对象(“对象流”)中而变得模糊,则上面给出的grep
命令将不会发现/CropBox
设置
我看不到任何方法可以获得您描述的行为。在任何人能够提供帮助之前,您必须提供一个示例文件来查看。感谢您查看此文件。请查看我的编辑。我没有ImageMagick,我不会安装它来查看您的问题。如果您希望我查看,请提供一个显示问题的文件。P把它放到dropbox上或者别的什么东西上。如果你真的很感兴趣,你也可以发布一个工作副本,但失败的副本几乎肯定是你所需要的。好吧,我假设你使用的Linux发行版默认包含ImageMagick的副本。这是fa