我需要将我的 PDF 文件中的某个部分裁剪为 PNG(这将使用 Ghostscript 和 PHP 自动完成)。这就是我现在所做的,它基本上将 PDF 的第一页转换为 PNG:
gs -q -dNOPAUSE -dBATCH \
-sDEVICE=pngalpha -dEPSCrop \
-sOutputFile=output.png input.pdf
具体来说,我正在尝试将这张左上角的卡片裁剪为 PNG。我也愿意就如何实现这一目标提出更多建议。
我需要将我的 PDF 文件中的某个部分裁剪为 PNG(这将使用 Ghostscript 和 PHP 自动完成)。这就是我现在所做的,它基本上将 PDF 的第一页转换为 PNG:
gs -q -dNOPAUSE -dBATCH \
-sDEVICE=pngalpha -dEPSCrop \
-sOutputFile=output.png input.pdf
具体来说,我正在尝试将这张左上角的卡片裁剪为 PNG。我也愿意就如何实现这一目标提出更多建议。
首先,
确定您的第一个 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 磅(= 464 - 119
)和高 283 磅(= 814 - 531
)。这导致页面大小为-g345x283
(以像素为单位,因为 Ghostscript 默认使用 72 dpi 进行图像输出(除非另有说明),因此72 px == 1 inch
.
或者更好的是,我们保持距离边界框 1 pt 的安全区域,因此我们使图像比最低限度大一点,我们得到这个图像尺寸:-g347x285
.
您还需要从左边缘切掉 119 pt(118 pt 用于“安全”)和 531 pt 从底部边缘(530 用于安全)。
因此命令将是:
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
)。此外,您必须将其^
用作续行字符(而不是\
)。
在 Windows 上,Ghostscript 的控制台应用程序名称是gswin32c.exe
和/或gswin64c.exe
(而不是gs
)。
在 CMD 窗口中,您必须将其^
用作续行符(而不是\
)。此外,grep
可能不可用 - 请findstr
改用。最后,如果gswinXX.exe
不在 your%PATH%
中,并且完整路径包含空格,则必须引用它:
"c:\program files\ghostscript\gswin64c.exe" ^
-q ^
-dBATCH ^
-dNOPAUSE ^
-sDEVICE=bbox ^
-dLastPage=1 ^
stackoverflowQuestion.pdf ^
| findstr %%BoundingBox
在 PowerShell 窗口中,仅引用可执行文件的完整路径是行不通的。你必须运行:
& "c:\program files\ghostscript\gswin64c.exe" -q -o nul: -sDEVICE=bbox my.pdf