如何让GhostScript仅自动缩放大于A3尺寸的PDF页面?
GhostScript实现超大页面自动缩放到A3的方案
GhostScript支持直接实现你需要的功能,无需提前单独检测页面尺寸,通过自定义PostScript脚本结合命令行参数就能完成逐页判断与缩放,同时保留A3及以下页面的原尺寸。
核心实现思路
利用GhostScript的PostScript处理能力,在每个页面渲染前获取其边界框尺寸,与A3标准尺寸对比:
- 若页面宽度或高度超过A3,计算最小缩放比例(确保页面完整放入A3),对页面进行缩放并调整输出媒体框为A3;
- 若页面尺寸≤A3,则保持原尺寸输出。
具体命令与脚本
以下是直接可用的命令,其中嵌入了处理逻辑:
gs -o output.pdf -sDEVICE=pdfwrite \ -c "<</PageSize[842 1191]>> setpagedevice" \ -c " % 定义A3尺寸(单位:点,1点≈0.3527mm) /A3W 842 def /A3H 1191 def % 页面处理钩子 << /EndPage { % 获取当前页面边界框 gsave initgraphics /PageBBox currentpagedevice /PageSize get def PageBBox 0 get /PageW def PageBBox 1 get /PageH def % 判断是否需要缩放 PageW A3W gt or PageH A3H gt { % 计算缩放比例(取宽高缩放的较小值) A3W PageW div /ScaleW def A3H PageH div /ScaleH def ScaleW ScaleH lt { ScaleW } { ScaleH } ifelse /Scale def % 应用缩放并设置媒体框为A3 grestore <</PageSize[A3W A3H]/MediaBox[0 0 A3W A3H]>> setpagedevice Scale Scale scale (Scaling page to A3 with factor: ) print Scale == } { % 保持原尺寸 grestore (Keeping original page size: ) print PageW print (x) print PageH == } ifelse true % 继续处理后续页面 } bind >> setpagedevice " \ -f input.pdf
关键细节说明
- 尺寸单位:GhostScript默认使用点(point)作为单位,A3的标准尺寸转换为842×1191点;
- 逐页处理:
/EndPage钩子会在每个页面处理时触发,自动适配混合尺寸的文档; - 缩放逻辑:取宽度和高度方向缩放比例的最小值,避免页面变形,保证完整放入A3边界;
- 性能优化:无需提前解析PDF获取尺寸,所有判断与处理在GhostScript的PDF转换流程中一次性完成,避免额外的IO或解析开销。
注意事项
- 若你的A3尺寸为横向(420×297mm),只需将
A3W和A3H的值互换(1191×842); - 可根据实际需求调整输出设备(如
ps2write用于生成PostScript),核心脚本逻辑通用。
内容的提问来源于stack exchange,提问作者Steffen Urban
相关产品推荐
相关产品推荐

