【问题标题】:PDF Dimensions of Page Out of Range Errors from Ghostscript来自 Ghostscript 的页面超出范围错误的 PDF 尺寸
【发布时间】:2025-12-05 07:45:01
【问题描述】:

我正在尝试生成仅更改第一页尺寸的新 PDF(使用 CropBox)。我用的是How do I crop pages 3&4 in a multipage pdf using ghostscript的修改版

奇怪的是:一切运行正常,但是当我在典型应用程序(预览版、Acrobat 等)中打开 PDF 时,它们要么崩溃,要么我收到“警告:页面尺寸可能超出范围”错误.在 Acrobat 中,即使页数是 2、45、60 或其他任何值,也只会显示一页。

更奇怪的是:我通过电子邮件将 PDF 发送给某人,看看这是否是特定于机器的问题。在 Gmail 中,在 Google Apps 的 PDF 查看器中一切正常。所以这个过程“成功了”,但看起来尺寸或页面大小有些东西让其他应用程序失望了。

我尝试了多个 GS 选项(dPDFFitPage、dPrinted=false、dUseCropBox、将纸张大小更改为不合法的其他选项),但似乎没有任何效果。

我附上了经过此过程并产生这些错误的 PDF 版本。 https://www.dropbox.com/s/ka13b7bvxmql4d2/imfwb.pdf?dl=0

修改后的输出如下。 xmin、ymin、xmax、ymax、height、width 是在更大的脚本中其他地方定义的变量,GS 是其中的一部分。使用pdfinfo抓取数据

gs \
-o output/#{filename} \
-sDEVICE=pdfwrite \
-c \"<</EndPage {
0 eq {
  pop /Page# where {
    /Page# get
    1 eq {
      (page 1) == flush

      [/CropBox [#{xmin} #{ymin} #{xmax} #{ymax}] /PAGE pdfmark
      true
    }
    {
      (not page 1) == flush

      [/CropBox [0 #{height.to_f} #{width.to_f} #{height.to_f}] /PAGE pdfmark
      true
    } ifelse
  }{
    true
  } ifelse
}
{
  false
}
ifelse
}
>> setpagedevice\" \
 -f #{filename}"
`#{cmd}`

【问题讨论】:

    标签: pdf ghostscript


    【解决方案1】:

    对于您设置的第一个页面之后的页面

    [/CropBox [0 #{height.to_f} #{width.to_f} #{height.to_f}] /PAGE pdfmark
    

    即一个高度为零的裁剪框!

    例如如果您的示例文档第 2 页有裁剪框 [0 792.0 612.0 792.0]

    这肯定不是你想要的……

    如果你真的想“生成只改变第一页尺寸的新 PDF(使用 CropBox)”,你为什么要改变后面页面的裁剪框呢?在这种情况下根本不要做任何事情!


    为什么“页面尺寸可能超出范围”

    嗯,ISO 32000-1 在其规范性附录 C 中声明:

    默认用户空间中的最小页面大小应为 3 x 3 个单位

    因此,根据旧的 PDF 规范,页面高度 0 确实超出了 PDF 的范围!

    不过,同时,ISO 32000-2 已经放弃了这一要求,所以严格来说,页面高度为零应该没什么可抱怨的......

    【讨论】:

    • FWIW 提供的 PDF 文件在 Acrobat X 中打开时没有任何问题。正如 mkl 指出的那样,第二页非常小。我还应该注意(像往常一样),通过以这种方式使用 Ghostscript 的 pdfwrite 设备,您不仅仅是在更改(或添加)一个 CropBox,而是在创建一个全新的 PDF 文件。
    • 谢谢你们俩。 mkl: re: 非第一页的,这也是我的想法。简单地删除 CropBox 行(不是第 1 页)是正确的做法吗?我想告诉GS“只保留非第1页。”回复:坐标,我依赖*.com/questions/8158295/…,但可能读错了。首先是印象中的 # 指的是左下角的定位,而不是高度。这不对吗?再次感谢您的帮助。
    • "被印象第一#指的是左下角的定位,而不是高度。对吗?" - 前两个数字是一个角的坐标盒子里,剩下的两个另外一个,斜对着。由于您的代码将两个点的 y 坐标设置为相同的值,因此框的高度为零。
    • “简单地删除 CropBox 行(不是在第 1 页下)是正确的做法吗?” - 我想是这样,但我对 gs 并没有深入了解或ps。