java 读取pdf文件内容

一、引入maven

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.25</version>
</dependency>

二、代码工具类

package com.jiayou.peis.utils;//import com.itextpdf.text.pdf.PdfReader;
//import com.itextpdf.text.pdf.parser.PdfTextExtractor;
//import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;import com.google.common.collect.Lists;
import com.jiayou.peis.entity.ImageObject;
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImage;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;/*** PDF处理** @author Bob Ren (Copyright © 2015-2029 贵州家有在线网络有限公司)* @version 1.0.0* @date 2022-02-07 16:21*/
public class PdfUtils {//    /**
//     * 使用itextpdf提取PDF文本(解析不靠谱)
//     *
//     * @param inputStream
//     * @return
//     * @throws IOException
//     */
//    @Deprecated
//    public static String toText(InputStream inputStream) throws IOException {
//        try {
//            StringBuilder buf = new StringBuilder();
//            PdfReader reader = new PdfReader(inputStream);
//            int pageNum = reader.getNumberOfPages();
//            for(int i=1;i<=pageNum;i++){
//                // 读取第i页的文档内容
//                buf.append(PdfTextExtractor.getTextFromPage(reader, i, new SimpleTextExtractionStrategy()));
//            }
            return buf.toString();
//            return StrUtils.removeReturnChar(buf.toString());
//        } finally {
//            CloseUtils.closeQuietly(inputStream);
//        }
//    }public static String text(byte[] data) throws IOException {return PdfUtils.text(data, true);}public static String text(byte[] data, boolean sortByPosition) throws IOException {ByteArrayInputStream inputStream = new ByteArrayInputStream(data);return PdfUtils.text(inputStream, sortByPosition);}/*** 使用pdfbox提取PDF文本(解析正常,可使用)** @param file* @return* @throws IOException*/public static String text(File file, boolean sortByPosition) throws IOException {InputStream inputStream = new FileInputStream(file);return PdfUtils.text(inputStream, sortByPosition);}public static String text(File file) throws IOException {return PdfUtils.text(file, true);}public static String text(InputStream inputStream) throws IOException {return text(inputStream, true);}/*** 使用pdfbox提取PDF文本(解析正常,可使用)** @param inputStream* @return* @throws IOException*/public static String text(InputStream inputStream, boolean sortByPosition) throws IOException {PDDocument document = null;try {
//            document = PDDocument.load(inputStream);document = Loader.loadPDF(inputStream);PDFTextStripper textStripper = new PDFTextStripper();// Get total page count of the PDF documentint numberOfPages = document.getNumberOfPages();//set the first page to be extractedtextStripper.setStartPage(1);// set the last page to be extractedtextStripper.setEndPage(numberOfPages);// 获取文本内容textStripper.setSortByPosition(sortByPosition);textStripper.setShouldSeparateByBeads(true);return StrUtils.removeReturnChar(textStripper.getText(document));} finally {CloseUtils.closeQuietly(document, inputStream);}}/*** 使用pdfbox提取PDF文本(解析正常,可使用)** @param file* @return* @throws IOException*/public static List<ImageObject> images(File file) throws IOException {InputStream inputStream = new FileInputStream(file);return PdfUtils.images(inputStream);}public static List<ImageObject> images(byte[] data) throws IOException {ByteArrayInputStream inputStream = null;try {inputStream = new ByteArrayInputStream(data);return PdfUtils.images(inputStream);} finally {CloseUtils.closeQuietly(inputStream);}}/*** 使用pdfbox提取PDF图片列表** @param inputStream* @return* @throws IOException*/public static List<ImageObject> images(InputStream inputStream) throws IOException {List<ImageObject> imageList = Lists.newArrayList();PDDocument document = null;try {
//            document = PDDocument.load(inputStream);document = Loader.loadPDF(inputStream);// get resources for a pagePDResources pdResources = document.getPage(0).getResources();int i = 0;for (COSName csName : pdResources.getXObjectNames()) {
//                System.out.println(i+":"+csName);PDXObject pdxObject = pdResources.getXObject(csName);if (pdxObject instanceof PDImageXObject) {
//                    i++;PDStream pdStream = pdxObject.getStream();PDImageXObject image = new PDImageXObject(pdStream, pdResources);String imageSuffix = imageSuffix(image);// image storage location and image nameBufferedImage bufferedImage = image.getImage();ImageObject object = new ImageObject();object.setIndex(i++);object.setImage(bufferedImage);object.setSuffix(imageSuffix);imageList.add(object);}}} finally {CloseUtils.closeQuietly(document, inputStream);}return imageList;}/*** 获取图片后缀** @param pdImage* @return* @throws IOException*/private static String imageSuffix(PDImageXObject pdImage) throws IOException {String suffix = pdImage.getSuffix();if (suffix == null || "jb2".equals(suffix)) {suffix = "png";} else if ("jpx".equals(suffix)) {// use jp2 suffix for file because jpx not known by windowssuffix = "jp2";}if (hasMasks(pdImage)) {// TIKA-3040, PDFBOX-4771: can't save ARGB as JPEGsuffix = "png";}return suffix;}private static boolean hasMasks(PDImage pdImage) throws IOException {if (pdImage instanceof PDImageXObject) {PDImageXObject ximg = (PDImageXObject) pdImage;return ximg.getMask() != null || ximg.getSoftMask() != null;}return false;}/*** 保存图片到指定文件夹** @param imageList* @param dir* @param prefixName* @throws IOException*/public static void saveImage(List<ImageObject> imageList, String dir, String prefixName) throws IOException {File imgDir = new File(dir);FileUtils.forceMkdir(imgDir);for(ImageObject image:imageList){File imgFile = new File(dir, prefixName+"_"+image.getIndex()+"."+image.getSuffix());ImageIO.write(image.getImage(), image.getSuffix(), imgFile);}}
}

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

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

相关文章

软考 系统架构设计师系列知识点之设计模式(1)

所属章节&#xff1a; 老版&#xff08;第一版&#xff09;教材 第7章. 设计模式 第1节. 设计模式概述 7.1.4 设计模式的分类 设计模式的分类 软件模式主要可分为设计模式、分析模式、组织和过程模式等&#xff0c;每一类又可细分为若干个子类。在此着重介绍设计模式&#x…

asp.net文档管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net文档管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net文档管理系统 二、功能介绍 (1…

C++ list 的使用

目录 1. 构造函数 1.1 list () 1.2 list (size_t n, const T& val T()) 1.3 list (InputIterator first, InputIterator last) 2. bool empty() const 3. size_type size() const 4. T& front() 4. T& back() 5. void push_front (const T& val) 6.…

FL Studio 21 for Mac中文破解版百度网盘免费下载安装激活

FL Studio 21 for Mac中文破解版是Mac系统中的一款水果音乐编辑软件&#xff0c;提供多种插件&#xff0c;包括采样器、合成器和效果器&#xff0c;可编辑不同风格的音乐作品&#xff0c;Pattern/Song双模式&#xff0c;可兼容第三方插件和音效包&#xff0c;为您的创意插上翅膀…

java _JDBC 开发

目录 一.封装JDBCUtiles 二.事务 三.批处理 四.数据库连接池 C3P0 Druidf(德鲁伊&#xff09;阿里 五.Apache-DBUtiles 六.Apache-DBUtils 七.DAO 和增删改查 通用方法 - BasicDao 一.封装JDBCUtiles 说明&#xff1a;在jdbc操作中&#xff0c;获取连接和释放资源&#…

mysql 切割字符串函数

93、mysql 切割字符串函数 需求&#xff0c;使用in 匹配多个参数&#xff0c;name字段值类型&#xff1a;1234(小明) 结果&#xff1a; select * from user where SUBSTRING_INDEX(REPLACE(name, ), ), (, -1) in ( 小明,小李)使用的函数如下 1、使用SUBSTRING_INDEX函数 SU…

k8s-----7、Pod健康检查

健康检查 1、健康检查 1、健康检查 健康检查可以分为两种 1、livenessProbe (存活检查)。如果检查失败&#xff0c;将杀死容器&#xff0c;通过Pod的restartPolicy来操作。 2、readinessProbe(就绪检查)。如果检查失败&#xff0c;k8s会将Pod从Service endpoints中剔除。 Pr…

设计模式:代理模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《组合模式》 下一篇《命令模式》 简介&#xff1a; 代理模式&#xff0c;它是一种结构型设计模式&#xff0c;它通过引入一个代理对象来控制对原始对象的访问。代理模式的主要目的是在保持原始对象…

《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力

10.4.1 模型 Bahdanau 等人提出了一个没有严格单向对齐限制的可微注意力模型。在预测词元时&#xff0c;如果不是所有输入词元都相关&#xff0c;模型将仅对齐&#xff08;或参与&#xff09;输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现…

【Elasticsearch】es脚本编程使用详解

目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…

代码训练营第50天:leetcode198打家劫舍|leetcode213打家劫舍2|leetcode337打家劫舍3

leetcode198&#xff1a;打家劫舍 文章讲解&#xff1a;leetcode198 leetcode213&#xff1a;打家劫舍2 文章讲解&#xff1a;leetcode213 leetcode337&#xff1a;打家劫舍3 文章讲解&#xff1a;leetcode337 目录 1&#xff0c;leetcode198 打家劫舍 2&#xff0c;leetcode…

LSKA(大可分离核注意力):重新思考CNN大核注意力设计

文章目录 摘要1、简介2、相关工作3、方法4、实验5、消融研究6、与最先进方法的比较7、ViTs和CNNs的鲁棒性评估基准比较8、结论 摘要 https://arxiv.org/pdf/2309.01439.pdf 大型可分离核注意力&#xff08;LSKA&#xff09;模块的视觉注意力网络&#xff08;VAN&#xff09;已…

Linux CentOS 8(firewalld的配置与管理)

Linux CentOS 8&#xff08;firewalld的配置与管理&#xff09; 目录 一、firewalld 简介二、firewalld 工作概念1、预定义区域&#xff08;管理员可以自定义修改&#xff09;2、预定义服务 三、firewalld 配置方法1、通过firewall-cmd配置2、通过firewall图形界面配置 四、配置…

利用Jpom在线构建Spring Boot项目

1 简介 前面介绍了运用Jpom构建部署Vue项目&#xff0c;最近研究了怎么部署Spring Boot项目&#xff0c;至此&#xff0c;一套简单的前后端项目就搞定了。 2 基本步骤 因为就是一个简单的自研测试项目&#xff0c;所以构建没有使用docker容器&#xff0c;直接用java -jar命令…

Java程序设计进阶

Java异常处理机制 异常 异常的最高父类是 Throwable&#xff0c;在 java.lang 包下。 Throwable 类的方法主要有&#xff1a; 方法说明public String getMessage()返回对象的错误信息public void printStackTrace()输出对象的跟踪信息到标准错误输出流public void printSta…

【项目设计】网络对战五子棋(下)

我不再装模作样地拥有很多朋友&#xff0c;而是回到了孤单之中&#xff0c;以真正的我开始了独自的生活。有时我也会因为寂寞而难以忍受空虚的折磨&#xff0c;但我宁愿以这样的方式来维护自己的自尊&#xff0c;也不愿以耻辱为代价去换取那种表面的朋友。 文章目录 一、项目设…

Postman笔记

文章目录 1.安装2.简介和使用流程3 postman使用3.1 测试集与HTTP请求发送HTTP请求和分析响应数据 3.2 发送HTTP请求和分析响应数据3.3 Postman中请求体提交方式3.4 Postman使用之接口测试3.5 使用Postman新建一个mock服务3.6 请求数据的参数化3.7 断言与脚本导出 1.安装 官网地…

2-Java进阶知识总结-7-UDP-TCP

文章目录 网络编程概述网络编程三要素--IP地址IP地址--概念&#xff08;IP&#xff1a;Internet Protocol&#xff09;IP地址--分类IP地址--特殊的地址&#xff1a;127.0.0.1IP地址获取--DOS命令IP地址获取--InetAddress类 网络编程三要素--端口端口--概念端口号 网络编程三要素…

DP读书:《openEuler操作系统》(五)进程与线程

进程与线程 进程的概念程序&#xff1a;从源码到执行1. 编译阶段:2. 加载阶段:3. 执行阶段: 程序的并发执行与进程抽象 进程的描述进程控制块1. 描述信息2. 控制信息3. CPU上下文4. 资源管理信息 进程状态1.就绪状态2.运行状态3.阻塞状态4.终止状态 进程的控制进程控制源语1.创…

CrossOver23.6软件激活码怎么获取 CrossOver软件2023怎么激活

CrossOver一款类虚拟机&#xff0c;它的主要功能是在mac系统中安装windows应用程序。其工作原理是将exe格式的windows应用程序安装包安装至CrossOver容器中&#xff0c;并将运行该exe文件所需的配置文件下载至容器中&#xff0c;便能在mac正常运行windows应用程序了。下面就让我…