PDF按行页读取文字

news/2024/4/27 18:50:06/文章来源:https://blog.csdn.net/WIK_7264/article/details/137102591

PDF按行&页读取文字

    • 前言
      • Apache PDFBox
      • iText
      • 其他库
    • pom文件
    • 代码
      • Apache PDFBox
        • 1.按行读取
        • 2.按页读取
      • iText

前言

Apache PDFBox

  • Apache PDFBox是一个强大的开源Java库,用于处理PDF文档。它可以读取、创建、修改以及转换PDF文件。使用PDFBox,可以轻松地从PDF中抽取文本内容,包括按行读取、提取表单数据等。

iText

  • iText也是Java领域流行的PDF处理库,不仅可以读取PDF,还能生成和修改PDF。尽管它的重点更多在于PDF内容的创作,但它也可以用来提取PDF的文本内容。
  • 使用iText读取PDF文本并不像PDFBox那样直接提供现成的方法,通常需要更多的低级别操作。

其他库

  • jPod
  • PDFsam SDK
  • PDFSmartCopy (也是iText的一部分,主要用于复制PDF页面内容)

注意:Apache PDFBox通常是读取pdf文字首选解决方案,因为它对于纯文本内容的提取更为简单直接。如果需要进行更复杂的PDF操作,如表单填写、签名认证等,iText则提供了更多的功能。

pom文件

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>最新版本号</version>
</dependency>

链接: Maven 中央仓库

代码

Apache PDFBox

1.按行读取
public static List<String> readRowPdf(String pdfUrl){// 返回对象List<String> result = new ArrayList<>();//加载PDF文档try (InputStream inputStream = new UrlResource(pdfUrl).getInputStream();//创建一个PDDocument对象PDDocument pdDocument = PDDocument.load(inputStream)) {//创建一个PDFTextStripper对象PDFTextStripper stripper = new PDFTextStripper();//设置起始页码和结束页码stripper.setStartPage(1);stripper.setEndPage(pdDocument.getNumberOfPages());//将PDF文档的内容提取为一个字符串String text = stripper.getText(pdDocument);//使用tokenizeToStringArray来分割文本(考虑到Windows/Linux系统的换行符差异)String[] split = StringUtils.tokenizeToStringArray(text, "\r\n");//添加到返回集合result.addAll(Arrays.asList(split));} catch (IOException e) {log.info("pdf按行读取 失败 原因:{}",e.getMessage());return result;}// 返回数据return result;}
  • 注意: PDF文档的内容可能不是按行排列的,所以按行读取PDF内容可能会出现一些问题。
2.按页读取
/*** 传入一个.pdf 地址* @param pdfUrl 地址* @throws Exception*/public static List<String> readPdf(String pdfUrl) throws Exception {// 是否排序boolean sort = false;// 编码方式String encoding = "UTF-8";// 开始提取页数int startPage = 1;// 内存中存储的PDF DocumentPDDocument pdDocument = null;//输入流InputStream inputStream = null;try {try {// 当作一个URL来装载文件URL url = new URL(pdfUrl);URLConnection con = url.openConnection();con.setConnectTimeout(3 * 1000);inputStream = con.getInputStream();pdDocument = PDDocument.load(inputStream);} catch (MalformedURLException e) {}// 获取页码int endPage = pdDocument.getNumberOfPages();PDFTextStripper stripper = null;stripper = new PDFTextStripper();// 设置是否排序stripper.setSortByPosition(sort);List<String> texts=new ArrayList<>();for (int i = 0; i < endPage; i++) {int page=i+1;// 设置起始页stripper.setStartPage(page);// 设置结束页stripper.setEndPage(page);texts.add(stripper.getText(pdDocument));}return texts;} finally {if (inputStream != null) {// 关闭输出流inputStream.close();}if (pdDocument != null) {// 关闭PDF DocumentpdDocument.close();}}}

iText

  • pom
<dependencies><!-- iText 7 Core --><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.0</version></dependency><!-- 布局和样式 (需要加不需要不加)--><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-layout</artifactId><version>7.2.0</version></dependency>
</dependencies>
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.layout.renderer.DocumentRenderer;
import com.itextpdf.layout.text.TextLine;/*** 此方法用于从给定路径的PDF文件中逐行提取文本内容,并将其存储在一个List<String>中返回。** @param filePath PDF文件的路径* @return 包含PDF文件所有文本行的列表* @throws IOException 当读取或处理PDF文件过程中出现IO异常时抛出*/
public List<String> readPdfWithItext(String filePath) throws IOException {List<String> contentLines = new ArrayList<>();// 使用try-with-resources语句确保PdfDocument和PdfReader在使用完毕后会被正确关闭try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(filePath))) {// 创建一个DocumentRenderer对象来渲染PDF页面上的内容DocumentRenderer renderer = new DocumentRenderer(pdfDoc);// 遍历PDF中的所有页面for (int pageNum = 1; pageNum <= pdfDoc.getNumberOfPages(); pageNum++) {// 设置当前渲染器处理的页码renderer.setPageNumber(pageNum);// 循环获取并处理页面上的每一行文本while (renderer.hasMoreLines()) {// 获取下一行文本TextLine line = renderer.getNextLine();// 将文本行添加到结果列表中contentLines.add(line.getText());}}}// 返回结果return contentLines;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026513.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Bug】记录2024年遇到的Bug以及修复方案

--------------------------------------------------------分割线 2024.3.22------------------------------------------------------- 1、load_sample_image raise AttributeError(“Cannot find sample image: %s” % image_name) AttributeError: Cannot find sample imag…

[linux初阶][vim-gcc-gdb] OneCharter: vim编辑器

一.vim编辑器基础 目录 一.vim编辑器基础 ①.vim的语法 ②vim的三种模式 ③三种模式的基本切换 ④各个模式下的一些操作 二.配置vim环境 ①手动配置(不推荐) ②自动配置(推荐) vim是vi的升级版,包含了更加丰富的功能. ①.vim的语法 vim [文件名] ②vim的三种模式 命令…

WPF —— DockPanel、ProgressBar 控件详解

ProgressBar 控件详解 1Progress bar简介 ProgressBar&#xff1a;进度条控件。 WPF带有一个方便的控件用于显示进度&#xff0c;称ProgressBar。它的工作原理就是设置最小值和最大值然后通过递增一个值&#xff0c;这样就可以直观的显示当前进度情况。 2 Progress bar常用的…

DFS:从递归去理解深度优先搜索

一、深入理解递归 二、递归vs迭代 三、深入理解搜索、回溯和剪枝 四、汉诺塔问题 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public: //笔试题&#xff0c;不讲武德&#xff0c;CAvoid move(int n,vector<int>& A, vector<int>& B, ve…

前端实现浏览器自定义滚动条

前言&#xff1a; 最近有个项目&#xff0c;产品觉得浏览器默认滚动条太丑了。想美化一下&#xff0c;比如自定义颜色&#xff0c;加上圆角&#xff0c;宽高都要更改一下。我查了资料和文档总结了一下 写法&#xff0c;特此记录以便之后使用。 浏览器滚动条api 总结&#xff…

【爬取网易财经文章】

引言 在信息爆炸的时代&#xff0c;获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而&#xff0c;手动浏览网页收集财经文章耗时费力&#xff0c;为了解决这一问题&#xff0c;本文将介绍如何使用Python编写一个爬虫程序来自动爬取网易财经下关于财经的文章 1. 爬…

代码随想录 Day-25

力扣题目 509.斐波那契数 思路 很理所当然的&#xff0c;可以使用递归的方式其次是用动态规划的方式&#xff0c;动态规划的核心就是递推公式。 那么递推和递归一字之差&#xff0c;有什么区别呢&#xff1f;&#xff08;递推和递归的区别&#xff09; 1、递归 class Solutio…

Java项目:77 springboot母婴商城

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本课题后端使用SpringBoot Spring Cloud框架&#xff0c;前端采用html&#xff0c;JQuery&#xff0c;JS&#xff0c;DIVCSS技术进行编程&…

Redis中AOF文件重写与同步

AOF文件的写入与同步 Redis服务器进程就是一个时间循环(loop),这个循环中的文件时间负责接收客户端的命令请求&#xff0c;以及向客户端发送命令回复&#xff0c;而时间事件则负责执行像serverCron函数这样需要定时运行的函数。因为服务器在处理文件事件时可能会执行些命令&am…

【Java程序设计】【C00416】基于(JavaWeb)Springboot的客户管理系统(含论文)

基于&#xff08;JavaWeb&#xff09;Springboot的客户管理系统&#xff08;含论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千…

C# 文件操作

文章目录 C# 文件操作创建文件运行结果 写入文件程序文件运行结果 WriteAllLines-写入多行运行结果 追加字符串运行结果追加多行字符串 读取文件ReadAllText运行结果 ReadAllLines-用数组接收读取的内容运行结果 采用流&#xff08;Stream&#xff09;的方式来读取内容运行结果…

stm32平衡车

目录 一.所需材料 二.PID算法&#xff08;简单说明&#xff09; 直立环 速度环 串级PID 三.使用到的外设 1.定时器输出比较-PWM 2.定时器编码器模式 3.编码器读取速度 4.电机驱动函数 5.外部中断 四、小车 调试 一.所需材料 1.陀螺仪MPU6050--读取三轴的加速度…

C++:梦的开始——创建第一个hello world(1)

我这里使用的编写代码的工具是Start Experimental Instance of Visual Studio 2022 你可以去微软的官网上寻找&#xff0c;并且安装 部署项目 项目就是一个文件夹&#xff0c;他将我们的数据都放到了里面&#xff0c;这就是一个项目 在Visual Studio 2022中 选择c 的空项目&a…

【Linux 08】进程概念

文章目录 &#x1f308; 01. 基本概念&#x1f308; 02. 描述进程 PCB&#x1f308; 03. 使用 ./ 的方式创建进程&#x1f308; 04. ps 查看进程&#x1f308; 05. getpid / getppid 获取进程标识符&#x1f308; 06. kill 终止指定进程&#x1f308; 07. fork 创建子进程&…

python学习14:python中的表达式

python中的表达式 1.表达式是什么呢&#xff1f; 表达式就是一个具有明确结果的代码语句&#xff0c;如11、type(‘字符串’)、3*5等 在定义变量的时候&#xff0c;如age108,等号右侧的就是表达式&#xff0c;也就是有具体的结果&#xff0c;将结果赋值给了等号左侧的变量 2.…

Linux 系统基础操作命令

当前市面上常见的系统&#xff1a;Windows、Linux、Mac OS、Android、IOS…… Linux 不太适合日常使用&#xff0c;但是非常适合用于开发。因此作为一个程序猿来说&#xff0c;Linux 都是务必要掌握的。 Linux 介绍 Linux 发行版 目前市面上比较知名的发行版有&#xff1a;R…

DNS隧道攻击

什么是DNS隧道&#xff1f; DNS隧道是一种网络通信技术&#xff0c;它利用DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议来建立隐蔽的通信通道。在正常情况下&#xff0c;DNS协议主要用于将域名解析为IP地址&#xff0c;但攻击者可以通过构造特殊的…

总结 | vue3项目初始化(附相应链接)

如何运行 vue 项目&#xff1a;vscode运行vue项目_vscode启动vue项目命令-CSDN博客 vue3项目搭建 目录管理 git管理&#xff1a;vue3项目搭建并git管理_git 新建vue3项目-CSDN博客 目录调整&#xff1a;vue3项目 - 目录调整-CSDN博客 vscode中快速生成vue3模板&#xff1a…

实现能效升级 | 基于ACM32 MCU的冰箱压缩机变频方案

概述 冰箱制冷系统中最重要的部件是压缩机。它从吸气管吸入低温低压的制冷剂气体&#xff0c;通过电机运转带动活塞对其进行压缩后&#xff0c;向排气管排出高温高压的制冷剂气体&#xff0c;为整个制冷循环提供源动力。这样就实现了压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环…

并查集|1971. 寻找图中是否存在路径、684.冗余连接、685.冗余连接II

目录 并查集基础 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II 并查集基础 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xf…