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

发布于 2022-09-06 10:37:25 字数 3768 浏览 29 评论 0

各位前辈,我最近在做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图片。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文