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

Groovy调用PDFBox提取PDF文本遇方法签名错误及实例化问题

Groovy使用PDFBox提取PDF文本报错问题

问题代码

def PDDocumentClass =  Class.forName("org.apache.pdfbox.pdmodel.PDDocument", true, urlLoader);
def PDPageClass =  Class.forName("org.apache.pdfbox.pdmodel.PDPage", true, urlLoader);
def PDFTextStripper =  Class.forName("org.apache.pdfbox.text.PDFTextStripper", true, urlLoader);
def pdfTextStripperArea =  Class.forName("org.apache.pdfbox.text.PDFTextStripperByArea", true, urlLoader);
def pdfTextRandom =  Class.forName("org.apache.pdfbox.io.RandomAccessFile", true, urlLoader);

def d = docman.getNodeByName(docman.getNode(346462 as long), "cv1.pdf").content

File f1 = new File("${d.content}")

def pdfstrip = PDFTextStripper.getText(PDDocumentClass.load(f1))

报错信息

No signature of method: static org.apache.pdfbox.text.PDFTextStripper.getText() is applicable for argument types: (org.apache.pdfbox.pdmodel.PDDocument) values: [org.apache.pdfbox.pdmodel.PDDocument@1590d92b]
Possible solutions: getText(org.apache.pdfbox.pdmodel.PDDocument), endText(), beginText(), getAt(java.lang.String), getLevel(), writeText(org.apache.pdfbox.pdmodel.PDDocument, java.io.Writer)

尝试创建PDFTextStripper实例时同样报错,错误内容为:无法实例化类org.apache.pdfbox.text.PDFTextStripper

解决方法

方法1:直接依赖PDFBox包(推荐)

放弃动态加载类的方式,直接导入PDFBox相关类,避免类加载器不一致问题:

import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.text.PDFTextStripper

def d = docman.getNodeByName(docman.getNode(346462 as long), "cv1.pdf").content
File f1 = new File("${d.content}")

// 加载PDF文档并提取文本
PDDocument document = null
try {
    document = PDDocument.load(f1)
    String text = PDFTextStripper.getText(document)
    // 处理提取到的文本
    println(text)
} finally {
    // 确保文档资源被关闭
    if (document != null) {
        document.close()
    }
}

方法2:修复动态加载的调用方式

如果必须使用动态加载类,通过Groovy反射调用语法正确执行方法:

调用静态getText方法

def PDDocumentClass = Class.forName("org.apache.pdfbox.pdmodel.PDDocument", true, urlLoader)
def PDFTextStripper = Class.forName("org.apache.pdfbox.text.PDFTextStripper", true, urlLoader)

def d = docman.getNodeByName(docman.getNode(346462 as long), "cv1.pdf").content
File f1 = new File("${d.content}")

def document = PDDocumentClass.load(f1)
try {
    // 通过invokeStatic调用静态方法
    def text = PDFTextStripper.invokeStatic('getText', [document] as Object[])
    println(text)
} finally {
    document.close()
}

创建实例调用getText方法

def PDDocumentClass = Class.forName("org.apache.pdfbox.pdmodel.PDDocument", true, urlLoader)
def PDFTextStripper = Class.forName("org.apache.pdfbox.text.PDFTextStripper", true, urlLoader)

def d = docman.getNodeByName(docman.getNode(346462 as long), "cv1.pdf").content
File f1 = new File("${d.content}")

def document = PDDocumentClass.load(f1)
try {
    // 创建PDFTextStripper实例
    def stripper = PDFTextStripper.newInstance()
    def text = stripper.getText(document)
    println(text)
} finally {
    document.close()
}

问题原因

报错核心是动态加载类时,Groovy动态方法调用无法正确识别静态方法签名,或不同类加载器加载的类被视为不同类型,导致参数匹配失败。直接导入类或使用Groovy反射调用语法可解决该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:55:31