来自 Ghostscript 的页面超出范围错误的 PDF 尺寸

Posted

技术标签:

【中文标题】来自 Ghostscript 的页面超出范围错误的 PDF 尺寸【英文标题】:PDF Dimensions of Page Out of Range Errors from Ghostscript 【发布时间】:2018-01-08 10:48:40 【问题描述】:

我正在尝试生成仅更改第一页尺寸的新 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`

【问题讨论】:

【参考方案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。

以上是关于来自 Ghostscript 的页面超出范围错误的 PDF 尺寸的主要内容,如果未能解决你的问题,请参考以下文章

使用 ghostscript 删除页面(不提取范围)

Python Camelot / Ghostscript“错误的架构”错误

Python - 索引错误 - 列表索引超出范围

列表索引超出范围错误:Python

致命错误:索引超出范围tableview

Datagridview 错误:: 索引超出范围。我该如何解决?