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

  1. 利用python第三方库提取PDF文件的表格内容

    小爬最近接到一个棘手任务:需要提取手机话费电子发票PDF文件中的数据.接到这个任务的第一时间,小爬决定搜集各个地区各个时间段的电子发票文件,看看其中的差异点.粗略统计下来,PDF文件的表格框架是统一的 ...

  2. java 获取pdf内容

    1. 说明 将pdf中的文字读取处理还有一些限制:1. 文档的安全属性不能过于严格 2. 不能存在图片. 2. 直接贴相关的源码 有两种读取方式,maven对应的pom文件 <dependenc ...

  3. Python使用Tabula提取PDF表格数据

    今天遇到一个批量读取pdf文件中表格数据的需求,样式大体是以下这样: python读取PDF无非就是三种方式(我所了解的),pdfminer.pdf2htmlEX 和 Tabula.综合考虑后,选择了 ...

  4. LIMS系统仪器数据采集-使用xpdf解析pdf内容

    不同语言解析PDF内容都有各自的库,比如Java的pdfbox,.net的itextsharp. c#解析PDF文本,关键代码可参考: http://www.cnblogs.com/mahongbia ...

  5. Java从URL获取PDF内容

    Java直接URL获取PDF内容 题外话 网上很多Java通过pdf转 HTML,转文本的,可是通过URL直接获取PDF内容,缺没有,浪费时间,本人最近工作中刚好用到,花了时间整理下,分享出来,防止浪 ...

  6. Java之生成Pdf并对Pdf内容操作

    虽说网上有很多可以在线导出Pdf或者word或者转成png等格式的工具,但是我觉得还是得了解知道是怎么实现的.一来,在线免费转换工具,是有容量限制的,达到一定的容量时,是不能成功导出的;二来,业务需求 ...

  7. Java文件操作系列[1]——PDFBox实现分页提取PDF文本

    需求:用java分页提取PDF文本. PDFBox是一个很好的可以满足上述需求的开源工具. 1.PDF文档结构 要解析PDF文本,我们首先要了解PDF文件的结构. 关于PDF文档,最重要的几点: 一, ...

  8. Java 添加、提取PDF中的图片

    Spire.Cloud.SDK for Java提供了PdfImagesApi接口可用于添加图片到PDF文档addImage().提取PDF中的图片extractImages(),具体操作步骤和Jav ...

  9. spring boot:用itextpdf处理pdf表格文件(spring boot 2.3.2)

    一,什么是itextpdf? 1,itextpdf的用途 itextpdf是用来生成PDF文档的一个java类库, 通过iText可以生成PDF文档, 还可以把XML/Html文件转化为PDF文件 2 ...

随机推荐

  1. 基础系列(6)—— C#类和对象

    一.类介绍       类(class)是C#类型中最基础的类型.类是一个数据结构,将状态(字段)和行为(方法和其他函数成员)组合在一个单元中.类提供了用于动态创建类实例的定义,也就是对象(objec ...

  2. MySql 8 命令

    1-创建用户 create user 用户名@'%' identified by '密码'; create user 用户名@'localhost' identified by '密码';   2-授 ...

  3. Codeforces Round #335 (Div. 2) D. Lazy Student 贪心+构造

    题目链接: http://codeforces.com/contest/606/problem/D D. Lazy Student time limit per test2 secondsmemory ...

  4. nodepad++ 格式化xml插件

    1.用插件管理器安装xmltools插件 2.使用如下菜单格式化xml: 所有插件下载地址: http://sourceforge.net/projects/npp-plugins/files/

  5. jQuery之css

    设置css样式/读取css值 css() 1. 得到第一个p标签的颜色 2. 设置所有p标签的文本颜色为red 3. 设置第2个p的字体颜色(#ff0011),背景(blue),宽(300px), 高 ...

  6. PSP 进度条 柱状图 饼状图

    9号 类别 开始时间 结束时间 间隔 净时间 燃尽图 8::00 8:20 0 20分钟 站立会议 8:20 8:50 0 30分钟 读构建之法 9:20 13:20 120分钟 120分钟 四人小组 ...

  7. node.js入门(二) 模块 事件驱动

    模块化结构 node.js 使用了 CommonJS 定义的模块系统.不同的功能组件被划分成不同的模块.应用可以根据自己的需要来选择使用合适的模块.每个模块都会暴露一些公共的方法或属性.模块使用者直接 ...

  8. scss在ide的命令参数

    %FileName% ../css/%FileBaseName%.css --sourcemap=none –style expanded

  9. Java知识点整理(三)

    如何设计出高可用的分布式架构 分布式架构 CDN简介 分布式缓存和本地缓存区别 高并发场景常用技术解决方案 JVM优化示例 Docker和JVM区别 Java开发人员需要注意的五大Docker误区 D ...

  10. 采用FPGA实现UART转SPI

    应用笔记 V1.1 2015/2/10 采用FPGA实现UART转SPI   概述   本文提供了实现UART转SPI的Verilog代码的功能描述.这份笔记将介绍UART和SPI的基本知识,代码设计 ...