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
相关产品推荐
相关产品推荐

