JAVA中通过poi和pdfbox读取office文件和pdf文件内容

2023-05-16

          最近做了个文档管理系统,实现了公司文档资源在线化。因为涉及到全文搜索,所以需要读取文件的内容创建全文索引。

本人通过POI读取的office文件和pdfbox读取的pdf文件内容,具体代码如下:

(1)首先在工程中引入需要的jar包文件。如果项目用的是maven工程则需要在pom.xml文件中添加如下代码:

<!--读取pdf内容  -->
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.4</version>
</dependency>

<!--操作office的JAR包  -->
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.9</version>
</dependency>

(2)读取文件内容代码:

/**
* 读取ppt内容
* @param file
* @return
* @throws IOException
*/
public static String readPPT(String file) throws IOException {
StringBuilder sb = new StringBuilder();
SlideShow ppt = new SlideShow(new HSLFSlideShow(file));
Slide[] slides = ppt.getSlides();
//提取文本信息 
for (Slide each : slides) {
    TextRun[] textRuns = each.getTextRuns();
    for (int i=0 ;i< textRuns.length; i++ ) {
        RichTextRun[] richTextRuns = textRuns[i].getRichTextRuns();
        for (int j = 0; j < richTextRuns.length; j++) {
            sb.append(richTextRuns[j].getText());
        }
        sb.append("\n");
    }
        sb.append("\n");
}
return sb.toString();
}


/**
* 读取pptx文件内容
* @param file
* @return
* @throws IOException
* @throws XmlException
* @throws OpenXML4JException
*/
 
public static String readPPT2007(String file) throws IOException, XmlException, OpenXML4JException {
     return new XSLFPowerPointExtractor(POIXMLDocument.openPackage(file)).getText();   
}


/**
* 读取xls文件内容
*/
public static String readEXCEL(String file) throws IOException {
StringBuilder content = new StringBuilder();
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));// 创建对Excel工作簿文件的引用
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
if (null != workbook.getSheetAt(numSheets)) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet
.getLastRowNum(); rowNumOfSheet++) {
if (null != aSheet.getRow(rowNumOfSheet)) {
HSSFRow aRow = aSheet.getRow(rowNumOfSheet); // 获得一个行
for (short cellNumOfRow = 0; cellNumOfRow <= aRow
.getLastCellNum(); cellNumOfRow++) {
if (null != aRow.getCell(cellNumOfRow)) {
HSSFCell aCell = aRow.getCell(cellNumOfRow);// 获得列值
if (convertCell(aCell).length() > 0) {
content.append(convertCell(aCell));
}
}
content.append("\n");
}
}
}
}
}
return content.toString();
}

/**
*
读取xlsx
* @param file
* @return
* @throws IOException
*/
public static String readEXCEL2007(String file) throws IOException {
StringBuilder content = new StringBuilder();
XSSFWorkbook workbook = new XSSFWorkbook(file);
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
if (null != workbook.getSheetAt(numSheets)) {
XSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet
.getLastRowNum(); rowNumOfSheet++) {
if (null != aSheet.getRow(rowNumOfSheet)) {
XSSFRow aRow = aSheet.getRow(rowNumOfSheet); // 获得一个行
for (short cellNumOfRow = 0; cellNumOfRow <= aRow
.getLastCellNum(); cellNumOfRow++) {
if (null != aRow.getCell(cellNumOfRow)) {
XSSFCell aCell = aRow.getCell(cellNumOfRow);// 获得列值
if (convertCell(aCell).length() > 0) {
content.append(convertCell(aCell));
}
}
content.append("\n");
}
}
}
}
}
return content.toString();
}

private static String convertCell(Cell cell) {
NumberFormat formater = NumberFormat.getInstance();
formater.setGroupingUsed(false);
String cellValue = "";
if (cell == null) {
return cellValue;
}
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
cellValue = formater.format(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_STRING:
cellValue = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BLANK:
cellValue = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
cellValue = Boolean.valueOf(cell.getBooleanCellValue()).toString();
break;
case HSSFCell.CELL_TYPE_ERROR:
cellValue = String.valueOf(cell.getErrorCellValue());
break;
default:
cellValue = "";
}
return cellValue.trim();
}

/**
* 读取doc文件
* @param file
* @return
* @throws Exception
*/
public static String readWORD(String file) throws Exception {
String returnStr = "";
try {
WordExtractor wordExtractor = new WordExtractor(new FileInputStream(new File(file)));
returnStr = wordExtractor.getText();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return returnStr;
}

/**
* 读取docx文件
* @param file
* @return
* @throws Exception
*/
public static String readWORD2007(String file) throws Exception {
     return new XWPFWordExtractor(POIXMLDocument.openPackage(file)).getText();   
}

/**
* 读取txt文件
* @param file
* @return
* @throws IOException
*/
public  static String readTXT(String file) throws IOException {
String encoding = get_charset(new File(file));
if (encoding.equalsIgnoreCase("GBK")) {
return FileUtils.readFileToString(new File(file), "gbk");
} else {
return FileUtils.readFileToString(new File(file), "utf8");
}
}

private static String get_charset(File file) throws IOException {
String charset = "GBK";
byte[] first3Bytes = new byte[3];
BufferedInputStream bis = null;
try {
boolean checked = false;
bis = new BufferedInputStream(new FileInputStream(file));
bis.mark(0);
int read = bis.read(first3Bytes, 0, 3);
if (read == -1)
return charset;
if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {
charset = "UTF-16LE";
checked = true;
} else if (first3Bytes[0] == (byte) 0xFE
&& first3Bytes[1] == (byte) 0xFF) {
charset = "UTF-16BE";
checked = true;
} else if (first3Bytes[0] == (byte) 0xEF
&& first3Bytes[1] == (byte) 0xBB
&& first3Bytes[2] == (byte) 0xBF) {
charset = "UTF-8";
checked = true;
}
bis.reset();
if (!checked) {
// int len = 0;
int loc = 0;


while ((read = bis.read()) != -1) {
loc++;
if (read >= 0xF0)
break;
if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
break;
if (0xC0 <= read && read <= 0xDF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
// (0x80
// - 0xBF),也可能在GB编码内
continue;
else
break;
} else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
charset = "UTF-8";
break;
} else
break;
} else
break;
}
}
// System.out.println( loc + " " + Integer.toHexString( read )
// );
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
bis.close();
}
}
return charset;
}

/**
* 读取pdf文件内容
* @param file
* @return
* @throws IOException
*/
public static String readPDF(String file) throws IOException {
String result = null;
FileInputStream is = null;
PDDocument document = null;
try {
is = new FileInputStream(file);
PDFParser parser = new PDFParser(new RandomAccessBuffer(is));
parser.parse();
document = parser.getPDDocument();
PDFTextStripper stripper = new PDFTextStripper();
result = stripper.getText(document);
} finally {
if (is != null) {
is.close();
}
if (document != null) {
document.close();
}
}
return result;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA中通过poi和pdfbox读取office文件和pdf文件内容 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 通过Nginx反向代理实现IP访问分流

    根据特定IP来实现分流 将IP地址的最后一段最后一位为0或2或6的转发至test 01 com来执行 xff0c 否则转发至test 02 com来执行 upstream test 01 com server 192 168 1 100 8
  • nginx map 妙用

    worker processes auto stream map remote addr dynamic backend 02468 34 test1 34 ip最后一位是偶数 13579 34 test2 34 ip最后一位是奇数 一个正
  • shell脚本通过mysql获取数据

    数据库查询结果 xff0c 结果为每行从左到右每个单元格为一行 xff08 首行为SQL查询结果的列名 xff09 数组默认分割符号是空格 xff0c 当查询结果中包含空格字符时 xff0c 会导致一个字段被分割开 xff0c 例如 xff
  • Activemq Artemis jmx使用

    1 修改 目录 mybroker etc broker xml 修改 lt name gt myartemis lt name gt 后面会用 加入2行 lt jmx management enabled gt true lt jmx ma
  • SpringBoot设置mysql的ssl连接

    因工作需要 xff0c mysql连接需要开启ssl认证 xff0c 本文主要讲述客户端如何配置ssl连接 SpringBoot xff1a 2 0 5 RELEASEmysql connector java xff1a 8 0 18mys
  • ThinkPHP URL路由解析

    ThinkPHP是国内非常火的一个轻量级框架 xff0c 采用MVC模式 xff0c 结构写的非常好 xff0c 今天 大象 带大家走一下ThinkPHP框架系统运行流程 xff0c 我将跟随ThinkPHP的执行进行代码讲解 xff0c
  • 【gRPC】双向认证下grpc-gateway原理及简单使用

    文章目录 前言一 grpc gateway原理二 环境准备三 服务端改造四 总结 前言 在上一篇文章自签CA 服务端和客户端双向认证中 xff0c 我们了解了双向认证并进行了实践 xff0c 本篇文章将基于双向认证 xff0c 使用gRPC
  • php 装饰模式

    lt php abstract class component public abstract function operation class concretecomponent extends component public func
  • Beyond Compare在Mac OS系统下永久试用

    亲测可用 一 原理 Beyond Compare每次启动后会先检查注册信息 xff0c 试用期到期后就不能继续使用 解决方法是在启动前 xff0c 先删除注册信息 xff0c 然后再启动 xff0c 这样就可以永久免费试用了 二 下载 首先
  • RSA加密解密(PHP Demo)

    private key 61 39 BEGIN RSA PRIVATE KEY MIICXQIBAAKBgQDpoODVtnSztGyb p 43 g Ob36jb3jzWzS2qovOjpY rrTjwlVcQ pB2m1nZDQNpTF
  • 【Pandas】优化读取文件内存占用过大的问题

    编写于2022 11 6 1 内存占用计算 做了个小实验 xff0c 发现pandas读取文件时 xff0c 内存占用是真的高 xff1a span class token keyword import span sys span clas
  • springboot+chatgpt+chatUI Pro开发智能聊天工具

    应广大网友要求 xff0c 也为了节约大家的时间现为大家奉献上源码下载地址 xff1a https download csdn net download xiangyuanhong08 87708197源码下载后在IDEA导入项目后自己修改
  • dockerfile指令解析

    Dockerfile 是一个文本文件 xff0c 其内包含了一条条的指令 Instruction xff0c 用于构建镜像 指令集描述FROM指定基础镜像 xff0c 必须为第一个命令MAINTAINER维护者信息RUN构建镜像 docke
  • openEuler社区人才评定考试流程指引

    最近因为公司工作的需要参加考试了openEuler社区人才评定考试 xff0c 本次考试题型主要包括单选 多选 判断三类题型 考试内容基本都是操作系统使用相关的内容 考试需要注意事项 xff1a 1 考试为线上答题考试 xff0c 需开启摄
  • spire.doc 让java操作word文档更简单优雅

    Spire Doc for Java 是一款专业的 Java Word 组件 xff0c 开发人员使用它可以轻松地将 Word 文档创建 读取 编辑 转换和打印等功能集成到自己的 Java 应用程序中 作为一款完全独立的组件 xff0c S
  • jodconverter 2.2.2 +openoffice4.0 doc转换成pdf

    一 环境 linux下安装openoffice 1 首先先下载好需要的rpm包 xff1a Apache OpenOffice 4 0 0 Linux x86 64 install rpm zh CN tar gz 或直接命令下载 xff1
  • JAVA和PHP版CAS客户端集成

    一 背景 随着公司的不断的发展壮大和公司信息的建设逐步完善 xff0c 公司内部系统也在不断的增加 xff0c 为避免公司员工因系统过多造成账号密码混乱或忘记密码情况 公司决定将公司内部系统进行统一登录管理 通过CAS实现公司内部业务系统
  • 【gRPC】批量操作、服务端、客户端、双向流介绍及使用案例

    文章目录 前言服务端准备一 传统批量操作方式二 服务端流三 客户端流四 双向流 前言 在之前的文章中 xff0c 我们通常的做法都是客户端请求 服务端响应的模式 xff0c 客户端收集好所有的请求信息 xff0c 发送到服务端 xff0c
  • JAVA中文件下载和文件批量下载方法

    JAVA中的文件下载 文件下载 64 param request 64 param response 64 param filePath 文件路径 64 param filename 下载时文件名称 public static void d
  • JAVA中通过poi和pdfbox读取office文件和pdf文件内容

    最近做了个文档管理系统 xff0c 实现了公司文档资源在线化 因为涉及到全文搜索 xff0c 所以需要读取文件的内容创建全文索引 本人通过POI读取的office文件和pdfbox读取的pdf文件内容 xff0c 具体代码如下 xff1a