java解析pdf获取pdf中内容信息
java解析pdf获取pdf中内容信息
今⽇项⽬中需要将pdf中的数据获取到进⾏校验数据,于是前往百度翻来覆去找到以下⼏种办法,做个笔记,⽅便⽇后查询。
废话不多说,我要直接上代码装逼了
第⼀种使⽤开源组织提供的开源框架 pdfbox
api ; pdfbox.apache/
特点:免费,功能强⼤,解析中⽂或许会存在乱码,默认格式有点乱,没有国产解析的那么美化。
想要按⾏读取:
PDFTextStripper stripper = new PDFTextStripper();
stripper .tSortByPosition(sort); //sort设置为true 则按照⾏进⾏读取,默认是fal
送灵澈上人古诗可以按照指定的模板,对pdf进⾏修改添加删除等操作,总之操作很骚,很强⼤。
1 pdfbox 需要带⼊依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.15</version>
</dependency>
<!-- /artifact/org.apache.pdfbox/fontbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.15</version>
</dependency>
<!-- /artifact/org.apache.pdfbox/jempbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>jempbox</artifactId>
<version>1.8.16</version>
</dependency>
2 代码
/**
* 功能 PDF读写类
* @CreateTime 2011-4-14 下午02:44:11
*/
public class PDFUtil {
// public static final String CHARACTOR_FONT_CH_FILE = "SIMFANG.TTF"; //仿宋常规
public static final String CHARACTOR_FONT_CH_FILE ="SIMHEI.TTF";//⿊体常规
public static final Rectangle PAGE_SIZE = PageSize.A4;我的学校作文
public static final float MARGIN_LEFT =50;
public static final float MARGIN_RIGHT =50;
public static final float MARGIN_TOP =50;
public static final float MARGIN_BOTTOM =50;
满池娇public static final float MARGIN_BOTTOM =50;
public static final float SPACING =20;
private Document document = null;
/**
* 功能:创建导出数据的⽬标⽂档
* @param fileName 存储⽂件的临时路径
* @return
*/
public void createDocument(String fileName){
File file =new File(fileName);
FileOutputStream out = null;
document =new Document(PAGE_SIZE, MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM);
try{欢乐的海洋
out =new FileOutputStream(file);
// PdfWriter writer =
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(DocumentException e){
e.printStackTrace();
}
// 打开⽂档准备写⼊内容
document.open();
}
/
**
* 将章节写⼊到指定的PDF⽂档中
* @param chapter
* @return
*/
public void writeChapterToDoc(Chapter chapter){
try{
if(document != null){
if(!document.isOpen()) document.open();
document.add(chapter);
}
}catch(DocumentException e){
e.printStackTrace();
}
}
/**
* 功能创建PDF⽂档中的章节
* @param title 章节标题
* @param chapterNum 章节序列号
* @param alignment 0表⽰align=left,1表⽰align=center
* @param numberDepth 章节是否带序号设值=1 表⽰带序号 1.章节⼀;1.1⼩节⼀...,设值=0表⽰不带序号
* @param font 字体格式
* @return Chapter章节
*/
public static Chapter createChapter(String title,int chapterNum,int alignment,int numberDepth, Font font){
Paragraph chapterTitle =new Paragraph(title, font);
chapterTitle.tAlignment(alignment);
Chapter chapter =new Chapter(chapterTitle, chapterNum);
chapter.tNumberDepth(numberDepth);
return chapter;
}
/**
* 功能:创建某指定章节下的⼩节
* @param chapter 指定章节
* @param title ⼩节标题
* @param font 字体格式
* @param numberDepth ⼩节是否带序号设值=1 表⽰带序号 1.章节⼀;1.1⼩节⼀...,设值=0表⽰不带序号
* @return ction在指定章节后追加⼩节
*/
*/
public static Section createSection(Chapter chapter, String title, Font font,int numberDepth){
Section ction = null;
if(chapter != null){
Paragraph ctionTitle =new Paragraph(title, font);
ctionTitle.tSpacingBefore(SPACING);
ction = chapter.addSection(ctionTitle);
ction.tNumberDepth(numberDepth);
}
return ction;
}
/**
* 功能:向PDF⽂档中添加的内容
* @param text 内容
* @param font 内容对应的字体
* @return phra 指定字体格式的内容
*/
public static Phra createPhra(String text,Font font){
Phra phra =new Paragraph(text,font);
return phra;
}
/**
* 功能:创建列表
* @param numbered 设置为 true 表明想创建⼀个进⾏编号的列表
* @param lettered 设置为true表⽰列表采⽤字母进⾏编号,为fal则⽤数字进⾏编号
* @param symbolIndent
* @return list
*/
public static List createList(boolean numbered,boolean lettered,float symbolIndent){
List list =new List(numbered, lettered, symbolIndent);
return list;
}
/**
* 功能:创建列表中的项
* @param content 列表项中的内容
* @param font 字体格式
* @return listItem
*/
public static ListItem createListItem(String content, Font font){
ListItem listItem =new ListItem(content, font);
return listItem;
}
/**
* 功能:创造字体格式
* @param fontname
* @param size 字体⼤⼩
* @param style 字体风格
* @param color 字体颜⾊
* @return Font
*/
public static Font createFont(String fontname,float size,int style, BaColor color){
Font font = Font(fontname, size, style, color);
return font;
}
/**windows无法连接到打印机
* 功能:返回⽀持中⽂的字体---仿宋
* @param size 字体⼤⼩
* @param style 字体风格
* @param color 字体颜⾊
* @return 字体格式
*/
public static Font createCHineFont(float size,int style, BaColor color){
BaFont bfChine = null;
try{
bfChine = ateFont(CHARACTOR_FONT_CH_FILE,BaFont.IDENTITY_H, BaFont.EMBEDDED);
}catch(DocumentException e){
}catch(DocumentException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
return new Font(bfChine, size, style, color);
}
/**
学习网址
* 最后关闭PDF⽂档
*/
public void cloDocument(){
if(document != null){
document.clo();
}
}沉默的瞬间
/**
* 读PDF⽂件,使⽤了pdfbox开源项⽬
* @param fileName
*/
public static void readPDF(String fileName){
File file =new File(fileName);
FileInputStream in = null;
try{
in =new FileInputStream(fileName);
// 新建⼀个PDF解析器对象
PDFParr parr =new PDFParr(new RandomAccessFile(file,"rw"));
// 对PDF⽂件进⾏解析
parr.par();
// 获取解析后得到的PDF⽂档对象
PDDocument pdfdocument = PDDocument();
// 新建⼀个PDF⽂本剥离器
PDFTextStripper stripper =new PDFTextStripper();
stripper .tSortByPosition(sort);//sort设置为true 则按照⾏进⾏读取,默认是fal // 从PDF⽂档对象中剥离⽂本
String result = Text(pdfdocument);
FileWriter fileWriter =new FileWriter(new File(""));
fileWriter.write(result);
fileWriter.flush();
fileWriter.clo();
System.out.println("PDF⽂件的⽂本内容如下:");
System.out.println(result);
}catch(Exception e){
System.out.println("读取PDF⽂件"+ AbsolutePath()+"⽣失败!"+ e);
e.printStackTrace();
}finally{
if(in != null){
try{
in.clo();
}catch(IOException e1){
}
}
}
}
/**
* 测试pdf⽂件的创建
* @param args
*/
public static void main(String[] args){
String fileName ="C:\Urs\tizzy\Desktop\测试.pdf";//这⾥先⼿动把绝对路径的⽂件夹给补上。 PDFUtil pdfUtil =new PDFUtil();
PDFUtil pdfUtil =new PDFUtil();
pdfUtil.writeChapterToDoc(chapter);
pdfUtil.cloDocument();
}
}
解析后的内容格式
合计
备
注
xxxxxxxxxxx普通发票
价税合计(⼤写)(⼩写)
货物或应税劳务、服务名称规格型号单位数 量单 价⾦ 额税率税 额
购
买
⽅
销
售
⽅
收款⼈: 复核: 开票⼈: 销售⽅:(章)
密
码
区
机器编号:
名 称:
纳税⼈识别号:
地址、
开户⾏及账号:
名 称:
纳税⼈识别号:
地址、
开户⾏及账号:
发票代码:
发票号码:
开票⽇期:
校验码:
电话:
电话:
¥1.00 ¥0.06
*xxxxxxxxxxx 1 1 1.00 6% 0.06
499111xxx80
壹圆零陆分
收款⼈复核⼈开票⼈
0 3 < < 7 9 2 9 > 5 8 4 3 > 2 3 1xxxx / 3 5 0 > 3 5 8 1
> 7 6 3 8 > 1 - x + 1x 5 4 6 * 1 + 7xxx 8 < / 0 3 + 9
7 > < < 7 9 2 9 > 5 xxxx 4 3 > 2 3 1 2 > * + * - + 1 / 9 9
2 2 xx + 4 - < 4 2 9 0 1 - + 0 - 1 9xxxx5 / + 0 0 < 8 > 7
test
xxxx
9150000xxxxA
重庆市xxxxxxxx号、7号xxxxx-xxxxx
招商银⾏1xxxxxxxxxx0
15xxxxxx1666
544xxxxx880
有口2019年04⽉10⽇
151xxx1 89xx13 56xx5 85xx80
¥1.06
第⼆种使⽤国产的框架 Spire.PDF
>包含两种版本1 免费版
www.e-iceblue/Downloads/Free-Spire-PDF-JAVA.html