You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iText7中PdfReader类getJavascript方法的等效替代方案咨询

在iText7中替代PdfReader.getJavascript的方案

没错,iText7里确实没有和旧版iText5中PdfReader.getJavascript()直接对应的方法,但你可以通过遍历PDF文档的不同结构来提取(并清理)所有JavaScript内容,刚好适配恶意内容清理的需求。下面是具体的实现思路和代码示例:

1. 提取/清理文档级别的JavaScript

PDF的文档级JavaScript通常存储在目录(Catalog)的JavaScript字典中。你可以这样获取并移除它:

PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output.pdf"));
PdfDictionary catalog = pdfDoc.getCatalog().getPdfObject();

// 检查并移除文档级JavaScript
if (catalog.containsKey(PdfName.JavaScript)) {
    catalog.remove(PdfName.JavaScript);
}

pdfDoc.close();

如果文档级JavaScript是数组形式(多个脚本),上面的代码也能直接移除整个数组,达到清理效果。

2. 处理表单字段中的JavaScript

很多恶意PDF会把脚本藏在表单字段的附加动作(AA字典)里,比如鼠标点击、聚焦时触发的脚本。你可以遍历所有表单字段来清理:

PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output.pdf"));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, false);

if (form != null) {
    for (PdfFormField field : form.getFormFields().values()) {
        PdfDictionary aaDict = field.getPdfObject().getAsDictionary(PdfName.AA);
        if (aaDict != null) {
            // 移除所有包含JavaScript的动作(比如OnMouseUp、OnFocus等)
            for (PdfName key : aaDict.keySet()) {
                PdfDictionary action = aaDict.getAsDictionary(key);
                if (action != null && PdfName.JS.equals(action.getAsName(PdfName.S))) {
                    aaDict.remove(key);
                }
            }
            // 如果AA字典为空了,直接移除整个字段的AA条目
            if (aaDict.isEmpty()) {
                field.getPdfObject().remove(PdfName.AA);
            }
        }
    }
}

pdfDoc.close();

3. 清理页面级别的JavaScript

页面的打开、关闭动作也可能包含恶意脚本,需要遍历每个页面检查:

PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output.pdf"));

for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
    PdfPage page = pdfDoc.getPage(i);
    PdfDictionary pageDict = page.getPdfObject();
    PdfDictionary aaDict = pageDict.getAsDictionary(PdfName.AA);

    if (aaDict != null) {
        // 移除页面动作中的JavaScript
        for (PdfName key : aaDict.keySet()) {
            PdfDictionary action = aaDict.getAsDictionary(key);
            if (action != null && PdfName.JS.equals(action.getAsName(PdfName.S))) {
                aaDict.remove(key);
            }
        }
        if (aaDict.isEmpty()) {
            pageDict.remove(PdfName.AA);
        }
    }
}

pdfDoc.close();

恶意内容清理的额外提示

除了JavaScript,恶意PDF还可能包含其他危险元素,比如:

  • 嵌入式恶意文件(可以通过PdfDocument.getCatalog().getNames().getAsDictionary(PdfName.EmbeddedFiles)检查并移除)
  • 跳转至恶意链接的URI动作(在动作字典中检查S为URI的条目并移除)
  • 可疑的注释或多媒体内容

建议把这些检查逻辑整合到你的清理流程中,确保PDF的安全性。

内容的提问来源于stack exchange,提问作者sushma rajaraman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:08:29