Ghostscript 是否支持在现有 PDF 中插入 JavaScript?

Does Ghostscript support inserting JavaScript into an existing PDF?

我在文档中找不到任何相关内容:https://www.ghostscript.com/doc/current/Use.htm

我确实找到了一个在每个页面上插入水印的相关示例,所以它似乎是可能的。

Is it possible in Ghostscript to add watermark to every page in PDF

但是,从该示例中不清楚如何插入 Javascript。

Ghostscript 的 pdfwrite 设备支持许多 PostScript pdfmark 操作(但不是全部)。不,没有关于哪些支持的文档,但从广义上讲,除了逻辑结构之外的所有内容。

pdfmark 参考(可从 Adob​​e 网站的某处获得......)描述了 pdfmark 语法,结合 PDF 参考手册(或 ISO 规范)我们可以看到 JavaScript仅限于小部件注释。 pdfmark 参考中甚至有一个例子,所以我做了显而易见的事情,并尝试了它。以下代码执行 'something'。我认为它是正确的,但无法确定(也就是说,PDF 内容是正确的;我不知道 JavaScript):

[
/Subtype /Widget
/Rect [216 647 361 684]
/F 4
/T (SL Text)
/FT /Tx
/DA (/Helv 14 Tf 0 0 1 rg)
/V (5)
/AA <<
  /K <<
    /S /JavaScript
    /JS (AFNumber_Keystroke\(2, 0, 0, 0, "$", true\);)
  >>
  /F <<
    /S /JavaScript
    /JS (AFNumber_Format\(2, 0, 0, 0, "$", true\);)
  >>
>> /ANN pdfmark

showpage

画了一个淡蓝色的矩形,当鼠标悬停在它上面画了一个黑色的边框,当你点击它的时候,它显示值5。将5换成一个数值,然后按return就变成了蓝色背景上的 $value.00。 看起来不错。

请注意,上面链接的示例对您没有帮助,因为它与纯 PostScript 有关。为了添加这样的注释,您需要:

  1. 正在使用 Ghostscript pdfwrite 设备
  2. 创建您首先处理现有 PDF 文件的命令行
  3. 在命令行 处理现有 PDF 文件后,执行 PostScript(使用 pdfmark,如上所述,但 不是 显示页面,只是 pdfmark 部分)来定义注释。您将需要使用 -c(引入 PostScript)和 -f(结束 PostScript)开关来执行此操作。

如果你想在文档加载时执行 JavaScript 你可以这样做(感谢这个 useful PDF primer)。

[ /_objdef {MyAlert} /type /dict /OBJ pdfmark
[ {MyAlert} << /JavaScript << /Names [ (MyAlertCode) << /S /JavaScript
/JS (app.alert\("Hello world 1."\);app.alert\("Hello world 2."\);) >> ]
>> >>
/PUT pdfmark
[ {Catalog} << /Names {MyAlert} >> /PUT pdfmark

复制的完整步骤为:

  1. 确保您的计算机上安装了 Ghostscript(gs 命令)
  2. 将您的源 PDF 放在包含上述代码的后记 (.ps) 文件旁边的文件夹中。
  3. cd 到那个文件夹
  4. 运行: gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=newpdf.pdf myps.ps mypdf.pdf(显然用您的实际文件名替换 myps.psmypdf.pdf)。
  5. 打开 newpdf.pdf 验证它是否有效!

其他提示:

  • Acrobat 使用的语法与您在传统 Web 开发中可能使用的语法并不完全相同(因此示例中的 app.alert 而不是传统的 alert()。)不要只是假设您尝试使用的函数存在。
  • 您需要使用反斜杠来转义 JavaScript 中的括号(例如 app.alert\("Hello World"\)
  • 你可以设置一个Javascript console on Acrobat来帮助JS调试

资源: