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文件内容 的相关文章

随机推荐

  • 通过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