【问题标题】:Getting Javascript from PDF using iText使用 iText 从 PDF 获取 Javascript
【发布时间】:2020-08-27 04:14:27
【问题描述】:

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

【问题讨论】:

  • 你提到了GetAdditionalAction。具有该名称的 iText 7 方法返回 PdfDictionary 实例,而不是字符串。我假设您从该字典中错误地检索了 JS 代码。
  • @mkl 是的,它不返回字符串,但我能够从该对象中提取 JS,因为我似乎无法找出从该对象中获取 JS 的正确方法。有什么建议吗?

标签: javascript pdf itext adobe acrobat


【解决方案1】:

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

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

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

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

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

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]
}

【讨论】:

  • 我没有明确提到这一点,但示例代码指的是 iText 7.x。
  • 你是一个救生员,这非常有效。我不得不改变一些东西,但我得到了它的工作。谢谢!
  • 附带问题@mkl,您知道如何从 iText 7 中的页面操作(例如 PdfName.O)获取 javascript 吗?我注意到 PdfPage 有一个 SetAdditionalAction 但没有 GetAdditionalAction,有什么提示吗?
猜你喜欢
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2022-09-27
  • 2022-08-04
  • 1970-01-01
相关资源
最近更新 更多