首页 文章

Ghostscript调整PDF不能使用ImageMagick PDF

提问于
浏览
2

我正在尝试为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 回答

  • 1

    您的原始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以获取更多指示 .

  • 0

    只是一个额外的指针......

    • 如果输入PDF文件中已有 /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 设置的相同值:

    $ 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 值...

    One more caveat, be warned:

    我的grep如果通过嵌入到/ ObjStm对象(“对象流”)中隐藏相应的PDF对象,上面给出的命令将不会发现/ CropBox设置 .

相关问题