iTextSharp解析表

使用iTextSharp v5.5.13

我需要解析大量的PDF文件。其中约有5%的表包含我也需要的数据。

该表如下所示:

iTextSharp解析表

大多数情况下,我需要的行被解析为
2 januari 15 januari € 49,49 € 21,57 € 15,09 € 34,39

我可以解决这个问题。我按空间分割,就可以了。
但是有时月份名称会有多余的空格:janu ari

我知道我可以重写策略以消除这些多余的空格。我已经在pdf的其余部分(ITextExtractionStrategy)中使用了它,但是对于此表,我使用的是矩形策略:

var rect = new System.util.RectangleJ(70,425,460,200);
RenderFilter[] filter = { new RegionTextRenderFilter(rect) };
ITextExtractionStrategy strategy =
    new FilteredTextRenderListener(new MyLocationTextExtractionStrategy(),filter);
var lines = PdfTextExtractor.GetTextFromPage(reader,pageNumber,strategy).Split('\n');

我的替代看起来像这样:

public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy
{
    protected override bool IsChunkAtWordBoundary(TextChunk chunk,TextChunk previousChunk)
    {
        var dist = chunk.DistanceFromEndOf(previousChunk);
        return dist < -chunk.CharSpaceWidth || dist > chunk.CharSpaceWidth / 2.0f;
    }
}

我发现了这个谷歌搜索。但这不能解决我的问题。
对于janu ari dist大于-chunk.CharSpaceWidth的情况,我不确定下一步该怎么做。

请告诉我何时不应该对此表使用矩形策略,而应采用其他方法。

liufei2233 回答:iTextSharp解析表

如果这种类型的表中的数据总是采用相同的格式,那么您可以采用另一种方法:只接受MyLocationTextExtractionStrategy向您发送的任何数据,然后将这些数据整理成您可以使用的格式。

在这种情况下,您的数据始终为:

  • 2组:
    • 1或2位数字(每月的某天)
    • 一些字符(月份名称)
  • 4组:
    • 欧元符号
    • 一些数字(至少一个数字)
    • 逗号
    • 2位数字

2 januari 15 januari € 49,49 € 21,57 € 15,09 € 34,39中,空格是分隔符,但对于结构良好的数据,您甚至不需要空格。因此,只需删除它们,然后您的数据将变为2januari15januari€49,49€21,57€15,09€34,39

现在,您可以将正则表达式与某些捕获组一起使用,以将数据压缩为可口的内容。

  • 2组:
    • [0-9]{1,2}
    • [a-z]*
  • 4组:
    • [0-9]{1,}
    • ,
    • [0-9]{2}

当您在评论中写下自己时,可能出现的一种正则表达式可能是:

new Regex(@"([0-9]{1,2})([a-z]*)([0-9]{1,2})([a-z]*)(€[0-9]{1,},[0-9]{2})(€[0-9]{1,[0-9]{2})")
本文链接:https://www.f2er.com/3124611.html

大家都在问