【问题标题】:How to crop a section of a PDF file to PNG using Ghostscript如何使用 Ghostscript 将 PDF 文件的一部分裁剪为 PNG
【发布时间】:2012-09-11 03:36:48
【问题描述】:

我需要将我的 PDF 文件中的某个部分裁剪为 PNG(这将使用 Ghostscript 和 PHP 自动完成)。这就是我现在所做的,基本上将 PDF 的第一页转换为 PNG:

gs -q -dNOPAUSE -dBATCH \
   -sDEVICE=pngalpha -dEPSCrop \
   -sOutputFile=output.png input.pdf

具体来说,我正在尝试将 this top left card 裁剪为 PNG。我也愿意就如何实现这一点提出更多建议。

【问题讨论】:

  • 链接失效。有机会把它放在 imgur 上吗?

标签: php pdf png ghostscript


【解决方案1】:

首先,
确定您的第一个 PDF 页面的边界框:

gs                          \
 -q                         \
 -dBATCH                    \
 -dNOPAUSE                  \
 -sDEVICE=bbox              \
 -dLastPage=1               \
  stackoverflowQuestion.pdf \
2>&1                        \
| grep %%BoundingBox

结果输出将是:

%%BoundingBox: 119 531 464 814

意思是:

  • 边界框的左下角在坐标(119,531)
  • 边界框的右上角在坐标(464,814)

这些值在 PostScript 点 中(其中72 pt == 1 inch)。边界框就是那个矩形,其中包括这些在页面上留下墨水或墨粉标记的图形 PDF 对象。

那么,
创建你的 PNG。

根据边界框值,您似乎希望它宽 345 pt (= 464 - 119) 和高 283 pt (= 814 - 531)。这导致页面大小为-g345x283(以像素为单位,因为 Ghostscript 默认使用 72 dpi 进行图像输出(除非另有说明),因此72 px == 1 inch

或者更好的是,我们保持距离边界框 1 pt 的安全区域,因此我们使图像比最低限度大一点,我们得到这个图像尺寸:-g347x285

您还需要从左边缘剪掉 119 pt('security' 为 118 pt)和底部边缘 531 pt(为 security 剪下 530 pt)。

因此命令将是:

gs                                                      \
  -o out.png                                            \
  -sDEVICE=pngalpha                                     \
  -g347x285                                             \
  -dLastPage=1                                          \
  -c "<</Install {-118 -530 translate}>> setpagedevice" \
  -f stackoverflowQuestion.pdf 

这是生成的 PNG:

为了获得更好的 PNG 质量,请将分辨率从默认的 72 dpi 提高到 720 dpi 并使用以下命令:

gs                                                      \
  -o out720dpi.png                                      \
  -sDEVICE=pngalpha                                     \
  -r720                                                 \
  -g3470x2850                                           \
  -dLastPage=1                                          \
  -c "<</Install {-118 -530 translate}>> setpagedevice" \
  -f stackoverflowQuestion.pdf 

更新:

在 CMD 窗口中的 Windows 上,Ghostscript 的控制台应用程序名称为 gswin32c.exe 和/或 gswin64c.exe(而不是 gs)。此外,您必须使用 ^ 作为行继续符(而不是 \)。

【讨论】:

  • 哇,以前从未见过这样的详细答案!非常感谢库尔特
  • @Tom:看看我的其他答案——我经常这样做。 ;-)
  • 为了保险起见,不是左上角 (119,531) 右下角 (464,814) 吗?
  • @Tom:不。PostScript(和 PDF)的图形模型从左下角开始它们的坐标系。 (而且我确实在我的答案中运行了这些命令以获得结果图片。)
  • 这很有趣,库尔特。我现在正在阅读手册页以了解更多信息,谢谢!
【解决方案2】:

在 Windows 上,Ghostscript 的控制台应用程序名称为 gswin32c.exe 和/或 gswin64c.exe(而不是 gs)。

1。 CMD窗口

在 CMD 窗口中,您必须使用 ^ 作为行继续符(而不是 \)。此外,grep 可能不可用 - 请改用 findstr。最后,如果gswinXX.exe 不在您的%PATH% 中,并且如果完整路径包含空格,则必须引用它:

"c:\program files\ghostscript\gswin64c.exe" ^
 -q                         ^
 -dBATCH                    ^
 -dNOPAUSE                  ^
 -sDEVICE=bbox              ^
 -dLastPage=1               ^
  stackoverflowQuestion.pdf ^
| findstr %%BoundingBox

2。 PowerShell 窗口

在 PowerShell 窗口中,仅引用可执行文件的完整路径是行不通的。你必须跑:

& "c:\program files\ghostscript\gswin64c.exe" -q -o nul: -sDEVICE=bbox my.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2011-09-05
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多