如何在GhostScript裁剪PDF时设置TrimBox与BleedBox?
GhostScript裁剪PDF时TrimBox无法覆盖及批量设置问题
问题背景
尝试用GhostScript(v9.55.0)程序化裁剪PDF,裁剪效果基本正常,但TrimBox尺寸始终继承原PDF元数据,无法覆盖,导致无法生成PDFX格式文件。
当前接近可行的命令
gs -o OUTFILE.pdf -sDEVICE=pdfwrite -dFirstPage=2 -dLastPage=2\ -dPDFSETTINGS=/screen -g6120x6120 \ -c "<< /PageOffset [-9 -9] >> setpagedevice" \ -f INFILE.pdf
尝试过的无效PostScript命令
以下为调试时使用随机值的尝试,均无法覆盖TrimBox:
# 尝试1:设置Distiller参数 -c "<< /PDFXSetBleedBoxToMediaBox true /PDFXTrimBoxToMediaBoxOffset [90 90 90 90] /PDFXBleedBoxToTrimBoxOffset [50 50 50 50] >> setdistillerparams"\ # 尝试2:直接设置页面盒子参数 -c "<< /BleedBox [36 36 576 576] /TrimBox [72 72 540 540] /ArtBox [0 0 612 612] /CropBox [0 0 612 612] /MediaBox [0 0 612 612] /PDFXSetBleedBoxToMediaBox true >> setpagedevice" \ # 尝试3:使用pdfmark设置 -c "[/BleedBox [10 20 602 601] /Trim [10 20 598 597] /ArtBox [0 0 612 792] /CropBox [0 0 612 792] /MediaBox [0 0 612 792] /TrimBox pdfmark" \
PDF盒子尺寸异常情况
pdfinfo -box FILE.pdf无法显示PDF实际编码的盒子尺寸,仅默认显示MediaBox边界。通过cpdf -page-info FILE.pdf获取到准确尺寸:
MediaBox: 0.000000 0.000000 612.000000 612.000000 CropBox: 0.000000 0.000000 1242.000000 630.000000 BleedBox: 0.000000 0.000000 1242.000000 630.000000 TrimBox: 9.000000 9.000000 1233.000000 621.000000
可见BleedBox、CropBox和TrimBox均超出MediaBox范围,不符合规范。
问题解决中的尝试
单页有效但批量无效的命令
简化测试后,以下批量设置命令无效:
gs -o OUTFILE.pdf -sDEVICE=pdfwrite -g6120x6120 \ -f INFILE.pdf \ -c "/CropBox [0 0 288 288] /PAGES pdfmark"
使用/PAGE的命令同样无效,但逐个指定页码的命令可以正常覆盖TrimBox:
gs -o OUTPUT.pdf -sDEVICE=pdfwrite -g6120x6120 \ -f INPUT.pdf \ -c "[{Page 1} << /TrimBox [0 0 600 600] >> /PUT pdfmark" \ -c "[{Page 2} << /TrimBox [0 0 590 590] >> /PUT pdfmark"
批量循环的尝试问题
为避免多页重复写命令,尝试编写PostScript循环,但变量替换失败:
pages=2 # 后续会程序化替换 gs -o OUTPUT.pdf -sDEVICE=pdfwrite -g6120x6120 \ -f INPUT.pdf \ -c "1 1 $pages { /n exch def [ {Page n} << /TrimBox [0 0 600 600] >> /PUT pdfmark } for"
将{Page n}替换为{Page 1}可正常运行,但n无法被正确解析,会触发/typecheck错误;使用/Page 1会触发范围检查错误,尝试字符串替换也无效。
EndPage过程的尝试
尝试用EndPage过程批量设置,同样遇到页码替换问题,目前仅固定页码的命令可运行:
gs -o OUTPUT.pdf -sDEVICE=pdfwrite -g6120x6120 \ -f INPUT.pdf \ -c "<< /EndPage { [ {Page 1} << /TrimBox [0 0 600 600] >> /PUT pdfmark } bind >> setpagedevice"
内容的提问来源于stack exchange,提问作者PANICresponse
相关产品推荐
相关产品推荐

