如何通过Ghostscript设置PDF元数据?解决DOMPDF生成PDF打印问题
解决Ghostscript处理PDF后元数据丢失的问题
Ghostscript默认处理PDF时会重置文档元数据,但你可以通过两种方式解决这个问题——要么保留原PDF的元数据,要么手动指定自定义元数据,下面分别给出具体实现方案:
1. 保留原PDF的元数据(推荐)
如果想直接沿用DOMPDF生成的原PDF里的作者、优化状态等元数据,只需在Ghostscript命令中添加-dPreserveMetadata参数,同时指定目标PDF版本(比如1.4,解决打印机兼容问题)即可。
示例PHP exec()调用:
$inputPdf = 'path/to/your/input.pdf'; $outputPdf = 'path/to/your/output.pdf'; // Ghostscript命令:转换PDF版本为1.4并保留原元数据 $command = "gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPreserveMetadata=true -o \"{$outputPdf}\" \"{$inputPdf}\""; exec($command, $output, $returnVar); // 检查执行结果 if ($returnVar === 0) { echo "PDF处理完成,原元数据已保留"; } else { echo "处理失败:" . implode("\n", $output); }
注意:
-dPreserveMetadata参数需要Ghostscript 9.19及以上版本支持,如果你的Ghostscript版本较低,建议升级到最新稳定版,或者使用下面的手动设置方法。
2. 手动指定自定义元数据
如果需要修改或重新定义元数据,可以利用Ghostscript的pdfmark功能,通过PostScript命令来设置文档信息。
示例PHP exec()调用:
$inputPdf = 'path/to/your/input.pdf'; $outputPdf = 'path/to/your/output.pdf'; // 定义元数据的PostScript片段 $pdfmark = <<<EOD [/Author (G.J) /Title (Your Document Title) /Subject (PDF Compatibility Fix) /Keywords (DOMPDF, Ghostscript, PDF Metadata) /Creator (DOMPDF + Custom Ghostscript Processing) /DOCINFO pdfmark EOD; // Ghostscript命令:转换版本+设置自定义元数据 $command = "gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -o \"{$outputPdf}\" -c \"{$pdfmark}\" -f \"{$inputPdf}\""; exec($command, $output, $returnVar); // 检查执行结果 if ($returnVar === 0) { echo "PDF处理完成,自定义元数据已设置"; } else { echo "处理失败:" . implode("\n", $output); }
常用可设置的元数据字段:
/Author:文档作者/Title:文档标题/Subject:文档主题/Keywords:文档关键词(逗号分隔)/Creator:文档创建工具/Producer:文档生成工具(Ghostscript会自动添加,也可手动指定)
额外注意事项
- 确保Ghostscript的路径在PHP的环境变量中,或者在命令里指定完整路径(比如Linux的
/usr/bin/gs,Windows的C:\Program Files\gs\gsX.X.X\bin\gswin64c.exe)。 - 如果路径或元数据包含特殊字符,记得用
escapeshellarg()做转义处理,避免命令执行出错。
内容的提问来源于stack exchange,提问作者G.J
相关产品推荐
相关产品推荐

