目录
概述
Apache PDFBox 是遵循Apache License v2.0的Java开源类库。用于操作PDF文档,可以创建新PDF文档,维护现有的PDF文档,或者从PDF文档中提取内容,支持生成加密的PDF文件,以及对PDF文件进行数字签名。Apache PDFBox同时提供了一个命令行操作工具。
Apache PDFBox 由pdfbox, fontbox 和xmpbox三个组件,在Maven groupId中都是 org.apache.pdfbox
注意:
- Pdfbox的PDPage对象从0开始计数。
- PDFTextStripper. setStartPage()、PDFTextStripper .setEndPage()从1开始计数。
开发环境
最小的需求:
- Java 6
- commons-logging
支持在PDF文档中嵌入式图像文件,但是对某些格式的支持需要第三方库,这些库是根据与apache2.0许可证不兼容的条款分发的
pom.xml 依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.21</version>
</dependency>
实例
1.全文解析
当一个pdf中全是文字并且排列规整的时候,直接全文解析出来就好
1.1 一次获取整个文件的内容
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.text.PDFTextStripper;
public class preProcess {
public static void main(String[] args) throws IOException {
String rootDir=System.getProperty("user.dir")+File.separator;
String fileResources=rootDir+"resources"+File.separator;
String fileStr=fileResources+"123.pdf";
File file=new File(fileStr);
PDDocument doc=new PDDocument().load(file);
PDFTextStripper textStripper =new PDFTextStripper();
String s=textStripper.getText(doc);
System.out.println("总页数:"+doc.getNumberOfPages());
System.out.println("输出内容:");
System.out.println(s);
doc.close();
}
}
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.io.RandomAccessFile;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.text.PDFTextStripper;
public class preProcess2 {
public static void main(String[] args) throws IOException {
String rootDir=System.getProperty("user.dir")+File.separator;
String fileResources=rootDir+"resources"+File.separator;
String fileStr=fileResources+"123.pdf";
File file=new File(fileStr);
RandomAccessFile is = new RandomAccessFile(file, "r");
PDFParser parser = new PDFParser(is);
parser.parse();
PDDocument doc = parser.getPDDocument();
PDFTextStripper textStripper =new PDFTextStripper();
String s=textStripper.getText(doc);
System.out.println("总页数:"+doc.getNumberOfPages());
System.out.println("输出内容:");
System.out.println(s);
doc.close();
}
}
1.2 分页获取文字的内容
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.io.RandomAccessFile;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.text.PDFTextStripper;
public class preProcess3 {
public static void main(String[] args) throws IOException {
String rootDir=System.getProperty("user.dir")+File.separator;
String fileResources=rootDir+"resources"+File.separator;
String fileStr=fileResources+"fenye.pdf";
File file=new File(fileStr);
RandomAccessFile is = new RandomAccessFile(file, "r");
PDFParser parser = new PDFParser(is);
parser.parse();
PDDocument doc = parser.getPDDocument();
PDFTextStripper textStripper =new PDFTextStripper();
for(int i=1;i<=doc.getNumberOfPages();i++)
{
textStripper.setStartPage(i);
textStripper.setEndPage(i);
textStripper.setSortByPosition(true);//一次输出多个页时,按顺序输出
String s=textStripper.getText(doc);
System.out.println("当前页:"+i);
System.out.println("输出内容:");
System.out.println(s);
}
doc.close();
}
}
1.3 分页获取文字和图片
package com.zzj.nlp.PDFBox;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;
public class PDFBoxPreProcess2 {
public static void main(String[] args) throws IOException {
String rootDir=System.getProperty("user.dir")+File.separator;
String fileResources=rootDir+"resources"+File.separator;
String fileStr=fileResources+"fenye.pdf";
File file=new File(fileStr);
PDDocument doc = PDDocument.load(file);
PDFTextStripper textStripper =new PDFTextStripper();
for(int i=1;i<=doc.getNumberOfPages();i++){
textStripper.setStartPage(i);
textStripper.setEndPage(i);
String s=textStripper.getText(doc);
System.out.println("第 "+i+" 页 :"+s);
//读取图片
PDPage page=doc.getPage(i-1);
PDResources resources = page.getResources();
//获取页中的对象
Iterable<COSName> xobjects =resources.getXObjectNames();
if(xobjects!=null){
Iterator<COSName> imageIter = xobjects.iterator();
while(imageIter.hasNext()){
COSName cosName=imageIter.next();
boolean isImageXObject=resources.isImageXObject(cosName);
if(isImageXObject){
//获取每页资源的图片
PDImageXObject ixt=(PDImageXObject) resources.getXObject(cosName);
File outputfile = new File("第 "+(i)+" 页"+cosName.getName()+".jpg");
ImageIO.write(ixt.getImage(), "jpg", outputfile);
}
}
}
}
doc.close();
}
}
2.区域解析
当文字排列不规整或者是一些表格类型的pdf的时候,就需要分区域单独去解析pdf
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.text.PDFTextStripperByArea;
public class PDFBoxPreProcess1 {
public static void main(String[] args) throws IOException {
String rootDir=System.getProperty("user.dir")+File.separator;
String fileResources=rootDir+"resources"+File.separator;
String fileStr=fileResources+"fenye.pdf";
File file=new File(fileStr);
PDDocument doc = PDDocument.load(file);
这个四边形所在区域在 y轴向下为正,x轴向右为正。
int x =100;
int y =-200;
int width =1000;
int height =1000;
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition(true);
// 划定区域
Rectangle2D rect = new Rectangle(x, y, width, height);
stripper.addRegion("area", rect);
PDPage page = doc.getPage(1);
stripper.extractRegions(page);
// 获取区域的text
String data = stripper.getTextForRegion("area");
data = data.trim();
System.out.println(data);
doc.close();
}
}