java pdfbox读取pdf中的表格

java pdfbox读取pdf中的表格

目前遇到了需要解析pdf中表格的需求,遇到无法解析表格中的空格,求助大神帮助!!!

<dependency>
	<groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>1.8.10</version>
</dependency>
package com.lc.pdfModule.service;

import java.awt.Rectangle;
import java.io.File;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.util.PDFTextStripperByArea;

import com.lc.common.utils.JsonUtils;

public class PdfText {
	public static void main(String[] args) {
		fillTemplete();
	}
	//pdf模板处理
	private static void fillTemplete(){
	   String templetePath = "D:\\201902yb_from_5_to_5_.pdf";
	   String data = "";
	   try {
	      PDDocument document = PDDocument.load(new File(templetePath));
	      if(document.isEncrypted()){
	         try{
	            document.decrypt("");
	         } catch (Exception e){
	         }
	      }
	      PDFTextStripperByArea stripper = new PDFTextStripperByArea();
	      stripper.setSortByPosition(true);
	      stripper.setWordSeparator("|");
//	      stripper.setLineSeparator("#");
	      //划定区域
	      Rectangle rect= new Rectangle(0, 0, 10000, 10000);
	      stripper.addRegion("area", rect);
	      List<PDPage> allPages = document.getDocumentCatalog().getAllPages();
	      int i = 0;
	      for(PDPage page : allPages){
	         stripper.extractRegions(page);
	         i++;
	         //获取区域的text
	         data = stripper.getTextForRegion("area");
//	         data = data.trim();
	         String[] datas = data.split("\r\n");
	         //对文本进行分行处理         
	         for( i = 0; i<datas.length; ++i){
	        	 String[] str = datas[i].split(" ");
	        	 System.out.println(JsonUtils.objToString(str));
	         }
	      }
	      document.close();
	   } catch (Exception e){
	      e.printStackTrace();
	   }
	}
}

下图是需要解析的pdf文件中的表格
在这里插入图片描述
这是解析后的结果,表格中空格无法识别
在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
PDFBox 可以提取 PDF 文件的文本内容,因此可以使用 PDFBox 识别 PDF 标题。以下是使用 PDFBox 提取 PDF 标题的示例代码: ```java import java.io.File; import java.io.IOException; import java.util.List; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.apache.pdfbox.text.TextPosition; public class PdfTitleRecognizer { public static void main(String[] args) throws IOException { PDDocument document = PDDocument.load(new File("example.pdf")); PDFTextStripper stripper = new PDFTextStripper() { @Override protected void writeString(String str, List<TextPosition> textPositions) throws IOException { // 检测标题 if (isTitle(textPositions)) { System.out.println(str.trim()); } super.writeString(str, textPositions); } }; stripper.setSortByPosition(true); stripper.setStartPage(1); stripper.setEndPage(document.getNumberOfPages()); stripper.getText(document); document.close(); } private static boolean isTitle(List<TextPosition> textPositions) { // 检测标题的规则 // 例如:第一行文本,字号大于等于18,加粗字体,居对齐 if (textPositions.size() < 1) { return false; } TextPosition first = textPositions.get(0); if (first.getFontSizeInPt() < 18 || !first.getFont().getName().endsWith("Bold")) { return false; } float xMax = Float.MIN_VALUE, xMin = Float.MAX_VALUE, yMax = Float.MIN_VALUE; for (TextPosition pos : textPositions) { xMax = Math.max(xMax, pos.getXDirAdj() + pos.getWidthDirAdj()); xMin = Math.min(xMin, pos.getXDirAdj()); yMax = Math.max(yMax, pos.getYDirAdj() + pos.getHeightDir()); } float xMid = (xMax + xMin) / 2; if (Math.abs(first.getXDirAdj() + first.getWidthDirAdj() / 2 - xMid) > 5) { return false; } float yMid = yMax - first.getFontSizeInPt() / 2 - 5; for (TextPosition pos : textPositions) { if (Math.abs(pos.getYDirAdj() + pos.getHeightDir() / 2 - yMid) > 5) { return false; } } return true; } } ``` 这段代码首先加载 PDF 文档,然后使用 `PDFTextStripper` 类提取文本内容。在 `writeString` 方法,检测文本是否符合标题的规则,然后输出符合规则的文本。检测标题的规则可以根据具体的 PDF 文件格式和布局进行设置。在本例,检测规则为:第一行文本,字号大于等于 18,加粗字体,居对齐。 注意,PDF 文件的标题可能分为多行,因此需要在 `writeString` 方法检测多行文本。也可以将检测规则修改为检测第一行和第二行文本的格式,以适应多行标题的情况。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值