首页 > 解决方案 > 使用 iText 从 PDF 获取 Javascript

问题描述

我正在使用 iText 尝试从 PDF 的字段中获取 Javascript。我注意到 usingGetAdditionalAction()会给我我需要的 Javascript,除非代码有一定的长度。如果我将 JS 放在一个字段上,假设onMouseEnter它的长度超过约 5 行,GetAdditionalAction()则会将此代码截断为字母数字字符串。在我的示例中,我试图在 if 语句中获取一些代码,但由于它太长,它返回类似:630 0 R。我在网上找不到任何关于此的信息或任何其他人谈论它。帮助将不胜感激。

标签: javascriptpdfitextadobeacrobat

解决方案


如果我将 JS 放在一个字段上,假设onMouseEnter它的长度超过约 5 行,GetAdditionalAction()则会将此代码截断为字母数字字符串。

实际上GetAdditionalAction()不会截断。您观察到的是,在生成JavaScript操作时可以选择 PDF 生成器:

JS – 文本字符串或文本流 – (必需)包含要执行的 JavaScript 脚本的文本字符串或文本流。 PDFDocEncoding或 Unicode 编码(后者由 Unicode 前缀U+FEFF标识)用于对字符串或流的内容进行编码。

(ISO 32000-1,表 217 – 特定于 JavaScript 操作的附加条目)

显然,如果脚本长达约 5 行,则您的 PDF 生成器使用文本字符串,否则使用文本流。因此,当您从操作字典中检索JS条目的值时,请执行以下操作action

PdfObject direct = action.Get(PdfName.JS, true);
if (direct == null)
{
    [handle case of missing JavaScript script in action]
}
else if (direct.GetObjectType() == PdfObject.STRING)
{
    PdfString scriptString = (PdfString) direct;
    [handle case of JavaScript script contained in text string]
}
else if (direct.GetObjectType() == PdfObject.STREAM)
{
    PdfStream scriptStream = (PdfStream) direct;
    [handle case of JavaScript script contained in text stream]
}
else
{
    [handle case of invalid JavaScript script object type]
}

推荐阅读