重影脚本调整PDF大小不使用ImageMagick 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选项缩放页面以适应新的

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

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
  • 宽度和高度小于原始尺寸,且尺寸更大
要了解它应该如何工作,请尝试使用任何其他工具将示例图像转换为PDF。你可以(例如)使用LibreOffice或LaTeX,或者把你刚刚制作的PDF(不起作用的那个)打印出来,创建另一个PDF(出于某种原因,它会起作用)。确保图像填充整个PDF页面(用于使用Ghostscript测试的PDF中不应有空格/边框,但Ghostscript创建的输出PDF中应有一些空格。)

原始PDF文件(
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
    定义,则通过
    -c“[…pdfmark”
    参数为Ghostscript提供定义的方法将不起作用
在这些情况下,通常先将PDF文件中现有的
/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