有时候会有这样的需求,需要将pdf中的字解析出来,存入库中,查看了一下pdfbox的文档,大概有两种方案。
当一个pdf中全是文字并且排列规整的时候,直接全文解析出来就好,以下是全文解析代码:
public String getTextFromPdf() throws Exception {
String pdfPath = “pdf文件路径”;
// 开始提取页数
int startPage = 1;
// 结束提取页数
int endPage = Integer.MAX_VALUE;
String content = null;
File pdfFile = new File(pdfPath);
PDDocument document = null;
try {
// 加载 pdf文档
document = PDDocument.load(pdfFile);
// 获取内容信息
PDFTextStripper pts = new PDFTextStripper();
pts.setSortByPosition(true);
endPage = document.getNumberOfPages();
System.out.println("Total Page: " + endPage);
pts.setStartPage(startPage);
pts.setEndPage(endPage);
try {
content = pts.getText(document);
} catch (Exception e) {
throw e;
}
System.out.println("Get PDF Content ...");
} catch (Exception e) {
throw e;
} finally {
document.close();
}
return content;
}
但是当文字排列不规整或者是一些表格类型的pdf的时候,就需要分区域单独去解析pdf,以下是代码:
public String extractFromArea() {
String pdfPath=”pdf文件路径”;
//这个四边形所在区域在第四象限, y轴向下为正,x轴向右为正。
int x = “横坐标”;
int y = “纵坐标”;
int width = “宽,也就是横坐标相减”;
int height = “高,也就是纵坐标相减”;
String data = "";
try {
PDDocument document = PDDocument.load(new File(pdfPath));
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition(true);
// 划定区域
Rectangle2D rect = new Rectangle(x, y, width, height);
stripper.addRegion("area", rect);
PDPage page = document.getPage(1);
stripper.extractRegions(page);
// 获取区域的text
data = stripper.getTextForRegion("area");
data = data.trim();
document.close();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
public void toTextFile(String pdfContent, String filePath) {
try {
File f = new File(filePath);
if (!f.exists()) {
f.createNewFile();
}
System.out.println("Write PDF Content to txt file ...");
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(pdfContent);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
如上解析pdf的代码是pdfbox2.X版本的,之前pdfbox1.X版本区域解析的代码网上很多, 2.X之后版本的我没有搜到,而且1.X和2.X实现相同功能的方法名以及包名改动较大。所以写了这篇博客。和之前老版本也做了对比,旧版本解析的pdf文字位置改变较大,有重叠、错位等现象,新版本这些情况有了很大的改善,建议使用新版本。