使用itextpdf提取pdf内容
package test; import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern; import org.apache.pdfbox.cos.COSDocument;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.util.PDFTextStripper; import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor; public class UploadUtils { private final static Pattern pattern = Pattern.compile("\\d+");
private final static int stateParaOverFlag = 800;
private final static int thankParaOverFlag = 800; /**
* 读取pdf参考文献内容
*
* @param s
* @return
*/
public String readPdf(String filePath) {
StringBuilder buffer = new StringBuilder();
FileInputStream fis = null;
PdfReader pdfReader = null;
COSDocument cosDocument = null;
String[] paragraphs = null;
PDFParser p;
boolean addBool = true;
boolean judgeState = false;
boolean judgeThank = false;
StringBuilder tempSb = new StringBuilder();
try {
fis = new FileInputStream(filePath);
p = new PDFParser(fis);
p.parse();
cosDocument = p.getDocument();
// 加密文档判断
if (cosDocument.isEncrypted()) {
StringBuilder tempContent = new StringBuilder();
pdfReader = new PdfReader(filePath);
int i = pdfReader.getNumberOfPages();
for (int j = 1; j <= i; j++) {
tempContent.append(PdfTextExtractor.getTextFromPage(pdfReader, j));
}
paragraphs = tempContent.toString().split("\n");
} else {
PDFTextStripper ts = new PDFTextStripper();
paragraphs = ts.getText(p.getPDDocument()).split("\n");
}
boolean mark = false;
List<Integer> errornum = new ArrayList<Integer>();
int flag = 0;
int endRange = paragraphs.length * 70 / 100;
int rangeFlag = 0;
for (String lineContent : paragraphs) {
if (judgeState) {
tempSb.append(lineContent);
if (tempSb.length() >= stateParaOverFlag) {
judgeState = false;
addBool = true;
tempSb.delete(0, tempSb.length() - 1);
}
}
if (judgeThank) {
tempSb.append(lineContent);
if (tempSb.length() >= thankParaOverFlag) {
judgeThank = false;
addBool = true;
tempSb.delete(0, tempSb.length() - 1);
}
}
if (addBool) {
buffer.append(lineContent);
}
if (mark && rangeFlag >= endRange) {
if (lineContent.length() < 5) {
errornum.add(++flag);
rangeFlag++;
continue;
}
if (pattern.matcher(lineContent.substring(0, 5)).find()) {
if (flag != 0) {
flag = 0;
errornum.clear();
}
} else {
errornum.add(++flag);
}
if (errornum.size() > 2) {
mark = false;
}
}
rangeFlag++;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
fis = null;
}
}
if (pdfReader != null) {
pdfReader.close();
}
if (cosDocument != null) {
try {
cosDocument.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
cosDocument = null;
}
}
}
return buffer.toString();
} public static boolean isBlank(CharSequence cs) {
int strLen;
if (cs == null || (strLen = cs.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (Character.isWhitespace(cs.charAt(i)) == false) {
return false;
}
}
return true;
} public static void main(String[] args) {
// System.err.println(new UploadUtils()
// .readPdf("/opt/fileCache/2014/125/13/shuangping_D7037870CF4FC5C421A3E5359DCF8BBE.pdf"));
System.err.println(new UploadUtils().readPdf("E:\\MyWork\\guyezhai\\pdf提取\\路径依赖视角下高校新专业建设的策略创新(1).pdf")); } }
其中用到的jar包:
bcpkix-jdk15on-1.47.jar
bcprov-jdk15on-1.49.jar
commons-logging-1.1..jar
fontbox-1.8..jar
icu4j-4.0..jar
itextpdf-5.4..jar
jempbox-1.8..jar
pdfbox-1.8..jar
使用itextpdf提取pdf内容的更多相关文章
- 利用python第三方库提取PDF文件的表格内容
小爬最近接到一个棘手任务:需要提取手机话费电子发票PDF文件中的数据.接到这个任务的第一时间,小爬决定搜集各个地区各个时间段的电子发票文件,看看其中的差异点.粗略统计下来,PDF文件的表格框架是统一的 ...
- java 获取pdf内容
1. 说明 将pdf中的文字读取处理还有一些限制:1. 文档的安全属性不能过于严格 2. 不能存在图片. 2. 直接贴相关的源码 有两种读取方式,maven对应的pom文件 <dependenc ...
- Python使用Tabula提取PDF表格数据
今天遇到一个批量读取pdf文件中表格数据的需求,样式大体是以下这样: python读取PDF无非就是三种方式(我所了解的),pdfminer.pdf2htmlEX 和 Tabula.综合考虑后,选择了 ...
- LIMS系统仪器数据采集-使用xpdf解析pdf内容
不同语言解析PDF内容都有各自的库,比如Java的pdfbox,.net的itextsharp. c#解析PDF文本,关键代码可参考: http://www.cnblogs.com/mahongbia ...
- Java从URL获取PDF内容
Java直接URL获取PDF内容 题外话 网上很多Java通过pdf转 HTML,转文本的,可是通过URL直接获取PDF内容,缺没有,浪费时间,本人最近工作中刚好用到,花了时间整理下,分享出来,防止浪 ...
- Java之生成Pdf并对Pdf内容操作
虽说网上有很多可以在线导出Pdf或者word或者转成png等格式的工具,但是我觉得还是得了解知道是怎么实现的.一来,在线免费转换工具,是有容量限制的,达到一定的容量时,是不能成功导出的;二来,业务需求 ...
- Java文件操作系列[1]——PDFBox实现分页提取PDF文本
需求:用java分页提取PDF文本. PDFBox是一个很好的可以满足上述需求的开源工具. 1.PDF文档结构 要解析PDF文本,我们首先要了解PDF文件的结构. 关于PDF文档,最重要的几点: 一, ...
- Java 添加、提取PDF中的图片
Spire.Cloud.SDK for Java提供了PdfImagesApi接口可用于添加图片到PDF文档addImage().提取PDF中的图片extractImages(),具体操作步骤和Jav ...
- spring boot:用itextpdf处理pdf表格文件(spring boot 2.3.2)
一,什么是itextpdf? 1,itextpdf的用途 itextpdf是用来生成PDF文档的一个java类库, 通过iText可以生成PDF文档, 还可以把XML/Html文件转化为PDF文件 2 ...
随机推荐
- Windows上安装、配置MySQL的常见问题
一,MySQL的下载安装 MySQL的安装过程就不说了,基本上和一般软件的安装过程没什么两样,就是一路点next,设置的root用户的密码要牢记.具体教程可以参考:http://jingyan.bai ...
- Spring boot整合shiro框架(2)
form提交 <form th:action="@{/login}" method="POST"> <div class="form ...
- BZOJ 1562 变换序列(二分图匹配)
显然每个位置只有两个情况,所以用二分图最大匹配来求解. 如果二分图有完全匹配,则有解. 关键是如何求最小的字典序解. 实际上用匈牙利算法从后面开始找增广路,并优先匹配字典序小的即可. # includ ...
- 【BZOJ3105】新Nim游戏(线性基)
[BZOJ3105]新Nim游戏(线性基) 题面 BZOJ Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以 ...
- Netsh命令-网络禁用开启
禁用无线网卡:netsh interface set interface wlan0 disabled 启用无线网卡:netsh interface set interface wlan0 enabl ...
- MySQL数据库无法远程连接的解决办法
远程登陆数据库的时候出现了下面出错信息: ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx', 经过今天下午的 ...
- (转)MS14-068域内提权漏洞总结
0x01 漏洞起源 说到ms14-068,不得不说silver ticket,也就是银票.银票是一张tgs,也就是一张服务票据.服务票据是客户端直接发送给服务器,并请求服务资源的.如果服务器没有向域控 ...
- 电子商务(电销)平台中用户模块(User)数据库设计明细
以下是自己在电子商务系统设计中的订单模块的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 用户基础表(user_base)|-- 自动编号 (user_id)|-- 用户名 (us ...
- MapReduce(一) mapreduce基础入门
一.mapreduce入门 1.什么是mapreduce 首先让我们来重温一下 hadoop 的四大组件:HDFS:分布式存储系统MapReduce:分布式计算系统YARN: hadoop 的资源调度 ...
- 解题:CTSC 2017 吉夫特
题面 首先有个结论:$C_n^m$为奇数当且仅当$m$是$n$的一个子集 于是从后往前推,记录每个数出现的位置,然后对每个位置枚举子集统计在它后面的贡献即可 #include<cstdio> ...