记一次使用pdfbox解析pdf,获取pdf的关键数据的工具使用

举报
object 发表于 2022/07/28 12:01:11 2022/07/28
【摘要】 因为一个需求,需要获取pdf中的数据,对于从没有类似经验的我,还是显得未知,一切未知往往都不好评判工作量,于是说了需求后,我就立马去了解这个pdf解析工具,随着了解,知道了一些解析工具,最后的解析代码也就几行,很简单。比起之前的未知的压力,就轻松太多了。之后再有类似的pdf处理,也有类似的经验了。pdfbox当然还有其他的解析工具,如iTika,iText,pdfparser等,我就只介绍本...

因为一个需求,需要获取pdf中的数据,对于从没有类似经验的我,还是显得未知,一切未知往往都不好评判工作量,于是说了需求后,我就立马去了解这个pdf解析工具,随着了解,知道了一些解析工具,最后的解析代码也就几行,很简单。比起之前的未知的压力,就轻松太多了。之后再有类似的pdf处理,也有类似的经验了。

pdfbox

当然还有其他的解析工具,如iTika,iText,pdfparser等,我就只介绍本次我使用了,其他的应该类似,请自行学习。

实际代码示例:

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 PdfTest {

    public static void main(String[] args) {
        String path = "D:\\temp\\temp\\test.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\\temp\\" + UUID.randomUUID() + ".png")) {
                                ImageIO.write(image, "png", out);
                            } catch (IOException e) {
                            }
                        }
                    }
                }

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

}

亲测可用,基本上不用改变代码,只需要把目标的文件放到目标位置,就可以试验。

PDDocument.load(file)也可以传入输入流的,这样处理就比较方便。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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