Java 从表格';这是不同高度的一排

Java 从表格';这是不同高度的一排,java,pdfbox,rectangles,Java,Pdfbox,Rectangles,黑色形状是需要提取的文本: 到目前为止,我已经从列中提取了文本,但是是手动提取的,因为只有5个(使用矩形类表示区域)。我的问题是:由于矩形的大小(高度)不同,有没有办法对行执行此操作,并且手动对50多行执行此操作将是一种暴行?更具体地说,我可以使用函数根据每行的高度更改矩形吗?或者任何可能有帮助的建议?如注释中所建议的,您可以通过解析页面的矢量图形指令自动识别示例PDF的表格单元格区域 对于此类任务,您可以扩展PDFBoxPDFGraphicsStreamEngine,它提供了用于路径构建和绘

黑色形状是需要提取的文本:


到目前为止,我已经从列中提取了文本,但是是手动提取的,因为只有5个(使用矩形类表示区域)。我的问题是:由于矩形的大小(高度)不同,有没有办法对行执行此操作,并且手动对50多行执行此操作将是一种暴行?更具体地说,我可以使用函数根据每行的高度更改矩形吗?或者任何可能有帮助的建议?

如注释中所建议的,您可以通过解析页面的矢量图形指令自动识别示例PDF的表格单元格区域

对于此类任务,您可以扩展PDFBox
PDFGraphicsStreamEngine
,它提供了用于路径构建和绘图指令的抽象方法

注意:我在这里展示的流引擎类专门用于识别在示例文档中使用的用黑色填充的长、小矩形绘制的表格单元格框架线。对于一般解决方案,您至少还应该识别作为矢量图形线段或笔划矩形绘制的帧线

流引擎类
PdfBoxFinder
此流引擎类收集水平线的y坐标范围和垂直线的x坐标范围,然后提供由这些坐标范围定义的网格框。特别是,这意味着不支持行跨距或列跨距;在目前的情况下,这是可以的,因为没有这样的跨度

公共类PdfBoxFinder扩展了PDFGraphicsStreamEngine{
/**
*在此处提供要分析的页面;要分析多个页面
*创建多个{@link PdfBoxFinder}实例。
*/
公共PdfBoxFinder(PDPage){
超级(第页);
}
/**
*框({@link Rectangle2D}实例的坐标根据
*PDF坐标系,例如用于装饰表格单元格的坐标系)
*{@link PdfBoxFinder}已在当前页上识别。
*/
公共地图获取框(){
整合主义者();
映射结果=新的HashMap();
如果(!horizontalLines.isEmpty()&&!verticalLines.isEmpty())
{
Interval top=horizontalLines.get(horizontalLines.size()-1);
char rowLetter='A';
对于(int i=horizontalLines.size()-2;i>=0;i--,rowLetter++){
区间底部=水平线。获取(i);
间隔左=垂直线。获取(0);
int列=1;
对于(int j=1;j
*
*目前只考虑以下要素:
*

*
    *
  • 是{@link Rectangle}实例; *
  • 填充的颜色相当黑; *
  • 形状细长;以及 *
  • 具有与坐标轴相当平行的边。 *
*/ void processPath()引发IOException{ pColor=getGraphicsState().GetNonSrokingColor(); 如果(!isBlack(颜色)){ debug(“由于非黑色填充颜色而丢弃路径”); 返回; } 用于(路径元素路径元素:路径){ if(矩形的路径元素实例){ 矩形矩形=(矩形)路径元素; 双p0p1=矩形.p0.距离(矩形.p1); 双p1p2=矩形.p1.距离(矩形.p2); 布尔值p0p1small=p0p1<3; 布尔值p1p2small=p1p2<3; 如果(p0p1小){ 如果(p1p2小){ debug(“两侧的矩形都太小了。”); }否则{ processThinRectangle(矩形.p0,矩形.p1,矩形.p2,矩形.p3); } }否则如果(p1p2小){ processThinRectangle(rectangle.p1、rectangle.p2、rectangle.p3、rectangle.p0); }否则{ debug(“删除的矩形两边都太大。”); } } } path.clear(); } /** *应将参数点排序为(p0,p1)和(p2,p3)较小 *边和(p1,p2)和(p3,p0)长边。 */ void processThinRectangle(点2D p0、点2D p1、点2D p2、点2D p3){ float longXDiff=(float)Math.abs(p2.getX()