ghostcript(版本9.21)忽略pdf文件中的附件
使用的命令cmd / c%GHOST_SCRIPT_EXE%-dPDFA = 2 -dBATCH -dNOPAUSE -dSubsetFonts = false -dPDFSETTINGS = / printer -sProcessColorModel = DeviceRGB -sDEVICE = pdfwrite -dCompatibilityLevel = 1.7 -dOtimtimize = true -dPDFACompatibilityPolicy = 1 -dAutoRotatePages = / None -sOutputFile =“out.pdf”“test.pdf”
如您所见,test.pdf有一个附件1.pdf . 但在转换后的pdf中,out.pdf没有1.pdf .
1 回答
这不仅仅是一个附加文件,它是一个嵌入式文件 .
由于多种原因,不会复制嵌入数据 . 首先是因为我们根本不支持Ghostscript中的嵌入文件(我们不能对它们做任何有用的事情),其次是因为你正在创建一个PDF / A文件 .
嵌入文件仅在PDF / A中有效(如果它也是PDF / A文件(您的嵌入文件不是PDF / A PDF文件,因此需要先转换) . Ghostscript无法轻松验证,因此我们(再次)不复制嵌入文件 .
您(当然)可以自己增强Ghostscript . 您需要处理/ EF(嵌入式文件)密钥并使用pdfmarks创建流,然后将其插入到FileAttachment批注中的/ FS(FileSpec)密钥的字典中 .
[编辑]
当前的Ghostscript PDF解释器是用PostScript编写的 . 如果你查看/ghostpdl/Resource/Init/pdf_draw.ps,你会看到:
这就是处理FileAttachment注释的地方 . 如您所见,使用一个名为loadannot的函数将注释字典转换为存储在操作数堆栈中的一系列字符串,然后添加/ Ann并调用pdfmark来处理字符串 .
您可以在Adobe pdfmark参考中找到pdfmark运算符(可在Adobe网站上的某处获得,我推荐Google,他们会继续移动它) .
这是原始文件的样子,您需要创建pdfmarks来重现这个:
当前的Ghostscript实现将重现对象23,即FileAttachement注释,它将正确地将/ EF字典内联扩展到该注释中 . 但是,它不会写入对象25,即实际嵌入的PDF文件 .
因此,您需要添加代码以读取嵌入式文件对象,将其写为命名内容流,使用pdfmark,然后从FileSpec字典中的/ EF键引用该命名对象流(原始文件中的对象24,但扩展并包含在pdfwrite输出中的内联) .
除非你非常熟悉PostScript,否则这将是一个非常大的挑战 .