【问题标题】:Rendering the whole media box of a pdf page into a png file using ghostscript使用ghostscript将pdf页面的整个媒体框渲染为png文件
【发布时间】:2011-09-21 01:34:49
【问题描述】:

我正在尝试使用 Ghostscript v9.02 将 Pdfs 页面呈现为 png 文件。为此,我使用以下命令行:

gswin32c.exe -sDEVICE=png16m -o outputFile%d.png mypdf.pdf

当pdf裁剪框与媒体框相同时,这可以正常工作,但如果裁剪框小于媒体框,则仅显示媒体框并且pdf页面的边框丢失。
我知道通常 pdf 查看器只显示裁剪框,但我需要能够在我的 png 文件中看到整个媒体页面。

Ghostscript 文档说默认情况下会呈现文档的媒体框,但这在我的情况下不起作用。 任何人都知道如何使用 ghostscript 渲染整个媒体框?
可能是对于 png 文件设备,只渲染裁剪框吗?我可能忘记了特定命令吗?

例如,this pdf 在裁剪框之外包含一些注册标记,这些注册标记在输出 png 文件中不存在。有关此 pdf 的更多信息:

  • 媒体框:
    • 宽度:667
    • 身高:908 分
  • 裁剪框:
    • 宽度:640
    • 身高:851

【问题讨论】:

  • 你只需要这个文件吗?或者您是否需要它来处理更大的文件集,每个文件(可能)具有不同的 *Box 值?
  • @pipitas:不幸的是,我需要为所有可能的 pdf 做一个通用代码,当然还有不同的 *Box 值。但我知道处理 *Box 值所需的所有 pdf。
  • 嗯,您对问题的最初描述并没有足够清楚地说明这一点。我下面的回答确实解决了你所说的问题。

标签: pdf png ghostscript


【解决方案1】:

首先,让我们消除一个误解。你写道:

"当 pdf 裁剪框与媒体框相同时,这可以正常工作,但如果裁剪框小于媒体框,则仅显示媒体框并且 pdf 页面的边框为丢了。”

这是不正确的。如果 CropBox 小于 MediaBox,则只应显示 CropBox(而不是 MediaBox)。这正是它的设计方式。这就是 CropBox 概念背后的全部理念......


目前我想不出一种解决方案可以自动适用于每个 PDF 以及所有可能存在的值(除非您想使用付费软件)。

手动处理链接到的 PDF:

  1. 在良好的文本编辑器中打开 PDF(不会与现有 EOL 约定混淆,并且不会抱怨文件中的二进制部分)。
  2. 搜索文件中包含/CropBox 关键字的所有位置。
  3. 由于 PDF 中只有一页,它应该只找到一个位置。
  4. 这可能读作/CropBox [12.3456 78.9012 345.67 890.123456]
  5. 现在编辑此部分,小心避免添加(或丢失)现有字符的数量:
  6. 将值设置为您想要的值:/CropBox [0.00000 0.00000 667.00 908.000000]。 (您可以使用空格代替我的 .0000.. 部分,但如果我这样做,SO 编辑器会吃掉它们,您将看不到我最初输入的内容......)
  7. 以新名称保存文件。
  8. PDF 查看器现在应该显示完整的 MediaBox(按照您的规范)。
  9. 当您使用 Ghostscript 将新文件转换为 PNG 时,更大的页面将可见。

【讨论】:

    【解决方案2】:

    好的,现在 revers 已经将他的问题重新陈述为他正在寻找“通用代码”,让我再试一次。

    “通用代码”的问题在于,“CropBox”语句可能出现在 PDF 中的许多“合法”形式表示。以下所有内容都是可能的且正确的,并为页面的 CropBox 设置相同的值:

    • /CropBox[10 20 500 700]

    • /CropBox[ 10 20 500 700 ]

    • /CropBox[10 20 500 700 ]

    • /CropBox [10 20 500 700]

    • /CropBox [ 10 20 500 700 ]

    • /CropBox [ 10.00 20.0000 500.0 700 ]

    • /CropBox [
                10
                20
                500
                700
               ] 

    ArtBoxTrimBoxBleedBoxCropBoxMediaBox 也是如此。因此,如果您想编辑它,您需要将 PDF 源代码中的 *Box 表示“标准化”。

    第一步:“规范化”PDF源代码

    这是你的做法:

    1. 为您的操作系统平台下载qpdf
    2. 在您的输入 PDF 上运行此命令:
      qpdf --qdf input.pdf output.pdf

    output.pdf 现在将具有一种规范化 结构(类似于上面给出的最后一个示例),并且即使使用像sed 这样的流编辑器也会更容易编辑。

    第二步:删除所有多余的*Box语句

    接下来,您需要知道唯一必不可少的 *Box 是 MediaBox。这个必须存在,其他是可选的(以某种优先级的方式)。如果其他人缺失,则默认为与MediaBox 相同的值。因此,为了实现您的目标,我们可以简单地删除与它们相关的所有代码。我们将在sed 的帮助下完成。

    该工具通常安装在所有 Linux 系统上 -- 在 Windows 上从 gnuwin32.sf.net 下载并安装它。 (如果您决定使用 .zip 文件而不是安装程序 .exe,请不要忘记安装命名的“依赖项”)。

    现在运行这个命令:

    1. sed.exe -i.bak -e "/CropBox/,/]/s#.# #g" output.pdf

    这是该命令应该执行的操作:

    • -i.bak 告诉 sed 内联编辑原始文件,但还要创建一个带有.bak 后缀的备份文件(以防出现问题)。
    • /CropBox/ 表示要由 sed 处理的第一个地址行。
    • /]/ 表示要由 sed 处理的最后一个地址行。
    • s 告诉 sed 替换从第一行到最后一个寻址行的所有行。
    • #.# #g 告诉 sed 进行哪种替换:全局替换地址空间中的每个任意字符 ('.') ('') ('g')。

    我们将所有字符替换为空格(而不是“无”,即删除它们),否则我们会收到有关“PDF 文件损坏”的投诉,因为对象引用计数和流长度会发生变化。

    第三步:运行你的 Ghostscript 命令

    你已经很清楚了:

    gswin32c.exe -sDEVICE=png16m -o outputImage_%03d.png output.pdf
    

    上面的所有三个步骤都可以很容易地编写脚本,我将留给您自己享受。

    【讨论】:

    • 非常感谢您的解决方案并帮助我更好地理解 pdf *Boxes!我希望能够仅使用 Ghostscript 来完成,但我想我除了修改原始 pdf 之外没有其他解决方案。
    • @revers:呸!一个赞成票的两个答案是艰苦的工作! :-) :-)
    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 2017-06-02
    • 2013-12-27
    • 2017-11-15
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多