JAVA实现使用PdfBox读取PDF的文本信息和图片信息

举报
object 发表于 2022/08/27 14:39:30 2022/08/27
【摘要】 针对某些特殊情况,需要从pdf中获取指定的数据,便于进行数据的计算。本次主要介绍如何使用pdfbox获取文本内容和图片内容。1.依赖<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version></dependency><d...

针对某些特殊情况,需要从pdf中获取指定的数据,便于进行数据的计算。本次主要介绍如何使用pdfbox获取文本内容和图片内容。

1.依赖

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>fontbox</artifactId>
    <version>2.0.24</version>
</dependency>

2.代码实现

代码仅做演示,代码规范,细节自行调整

package com.example.pdf.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.UUID;

import javax.imageio.ImageIO;

import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;


public class PdfboxReadTextAndImage {

    public static void main(String[] args) {
        readTextAndImage();
    }

    /**
     * 读取pdf的文本内容和图片内容
     */
    public static void readTextAndImage() {
        String path = "D:\\temp\\PdfboxReadTextAndImage\\readPdfTemp.pdf";
        File file = new File(path);
        // 尽可能使用try-with-resource代替try-catch-finally
        try (PDDocument document = PDDocument.load(file)) {
            int pageSize = document.getNumberOfPages();
            // 一页一页读取
            for (int i = 0; i < pageSize; i++) {
                // 文本内容
                PDFTextStripper stripper = new PDFTextStripper();
                // 设置按顺序输出
                stripper.setSortByPosition(true);
                stripper.setStartPage(i + 1);
                stripper.setEndPage(i + 1);
                String text = stripper.getText(document);
                System.out.println(text.trim());
                System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-");

                // 图片内容
                PDPage page = document.getPage(i);
                PDResources resources = page.getResources();
                Iterable<COSName> cosNames = resources.getXObjectNames();
                if (cosNames != null) {
                    Iterator<COSName> cosNamesIter = cosNames.iterator();
                    while (cosNamesIter.hasNext()) {
                        COSName cosName = cosNamesIter.next();
                        if (resources.isImageXObject(cosName)) {
                            PDImageXObject Ipdmage = (PDImageXObject) resources.getXObject(cosName);
                            BufferedImage image = Ipdmage.getImage();
                            try (FileOutputStream out = new FileOutputStream(
                                    "D:\\temp\\PdfboxReadTextAndImage\\" + UUID.randomUUID() + ".png")) {
                                ImageIO.write(image, "png", out);
                            } catch (IOException e) {
                            }
                        }
                    }
                }

            }
        } catch (InvalidPasswordException e) {
        } catch (IOException e) {
        }
    }

}

3.效果展示

读取的pdf

读取后内容及图片:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。