pdfbox2.0.x版本如何获取PDF中的图片和字体?

各位前辈,我最近在做PDF的文本提取和分析。使用的是PDFBox这个工具。在这个工具1.0.8版本中,可以获取到图片,但是获取不到文本,代码如下:

public static void readPDF(String filename){
        File file = new File(filename);
        FileInputStream in = null;
        try {
            in = new FileInputStream(filename);
            PDFParser parser = new PDFParser(in);
            parser.parse();
            PDDocument pdDocument = parser.getPDDocument();
            PDFTextStripper stripper = new PDFTextStripper();
            String result = stripper.getText(pdDocument);
            System.out.println("PDF文件" + file.getAbsolutePath()+"内容如下:");
            System.out.println(result);
        } catch (IOException e) {
            //e.printStackTrace();
        }
    }

在getText这一步,报错了,错误信息:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.fontbox.afm.AFMParser.parse()V
    at org.apache.pdfbox.pdmodel.font.PDFont.addAdobeFontMetric(PDFont.java:146)
    at org.apache.pdfbox.pdmodel.font.PDFont.getAdobeFontMetrics(PDFont.java:114)
    at org.apache.pdfbox.pdmodel.font.PDFont.<clinit>(PDFont.java:106)
    at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:108)
    at org.apache.pdfbox.pdmodel.PDResources.getFonts(PDResources.java:203)
    at org.apache.pdfbox.util.PDFStreamEngine.getFonts(PDFStreamEngine.java:604)
    at org.apache.pdfbox.util.operator.SetTextFont.process(SetTextFont.java:54)
    at org.apache.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:554)
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:268)
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:235)
    at org.apache.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:215)
    at org.apache.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:455)
    at org.apache.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:379)
    at org.apache.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:335)
    at org.apache.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:254)
    at edu.scut.testapi.pdf.PDFReader.readPDF(PDFReader.java:164)
    at edu.scut.testapi.pdf.PDFReader.main(PDFReader.java:321)

打开源码发现,源码没有对应的parse()方法。把版本回退到任意1.0.X中,仍然报错。
在1.8.13版本中可以通过如下代码获取到PDF的图片:

            //打开pdf文件流
            FileInputStream fis = new FileInputStream(file);
            //加载 pdf 文档,获取PDDocument文档对象
            PDDocument document = PDDocument.load(fis);
            /** 文档页面信息 **/
            //获取PDDocumentCatalog文档目录对象
            PDDocumentCatalog catalog = document.getDocumentCatalog();
            //获取文档页面PDPage列表
            List pages = catalog.getAllPages();
            int count = 1;
            int pageNum = pages.size();   //文档页数
            //遍历每一页
            for (int i = 0; i < pageNum; i++) {
                //取得第i页
                PDPage page = (PDPage) pages.get(i);
                if (null != page) {
                    PDResources resource = page.findResources();
                    //获取页面图片信息
                    Map<String, PDXObjectImage> imgs = resource.getImages();
                    for (Map.Entry<String, PDXObjectImage> me : imgs.entrySet()) {
                        //System.out.println(me.getKey());
                        PDXObjectImage img = me.getValue();
                        //保存图片,会自动添加图片后缀类型
                        img.write2file(imgSavePath + count);
                        count++;
                    }
                }
            }

在2.0.8版本中,可以完美获取到文本。但是2.0.8版本中无法获取到图片,因为没有了PDXObjectImage这个类,改为了PDImageXObject这个类,并且网上没有相关的使用方法。
请问哪位前辈会使用PDFBox这个工具,我想提取PDF的文本以及对应的字体、PDF图片。

阅读 6.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题