使用itext(.net)从矩形中提取文本确实给了我整个行



以下是我使用的代码(使用itext for.net版本7.0.4.0),用于从PDF中提取文本。我在测试中观察到的是,仅在大多数PDF的矩形内提取内容,它可以很好地工作。但是对于其中的几个,它从PDF提供了整行。我知道

与RECT相交的文本片段(因此文本的一部分可能在rect之外,Itext不会将文本片段切成部分)。

,但我想了解PDF中的哪些参数将在ITEXT中使用以拆分文本。

        var reader = new PdfReader( filePath );
        PdfDocument pdfDoc = new PdfDocument( reader );
        var addressRect = new Rectangle( 33, 190, 70, 42 ); // 
        var addressRegionFilter = new TextRegionEventFilter( addressRect );
        var filterListener = new FilteredTextEventListener( new LocationTextExtractionStrategy(), addressRegionFilter );
        var addressText = PdfTextExtractor.GetTextFromPage( pdfDoc.GetPage( 1 ), filterListener );
        pdfDoc.Close();

这应该可以解决问题。

class RectangleTextExtractionStrategy implements ITextExtractionStrategy
{
    private ITextExtractionStrategy innerStrategy = null;
    private Rectangle rectangle;
    public RectangleTextExtractionStrategy(ITextExtractionStrategy strategy, Rectangle rectangle)
    {
        this.innerStrategy = strategy;
        this.rectangle = rectangle;
    }
    @Override
    public String getResultantText() {
        return innerStrategy.getResultantText();
    }
    @Override
    public void eventOccurred(IEventData iEventData, EventType eventType) {
        if(eventType != EventType.RENDER_TEXT)
            return;
        TextRenderInfo tri = (TextRenderInfo) iEventData;
        for(TextRenderInfo subTri : tri.getCharacterRenderInfos())
        {
            Rectangle r2 = new CharacterRenderInfo(subTri).getBoundingBox();
            if(intersects(r2))
               innerStrategy.eventOccurred(subTri, EventType.RENDER_TEXT);
        }
    }
    private boolean intersects(Rectangle rectangle)
    {
        // # TODO
        return true;
    }
    @Override
    public Set<EventType> getSupportedEvents() {
        return innerStrategy.getSupportedEvents();
    }
}

这里的想法是将所有传入的TextrenderInfo对象分为其角色的相应事件。然后(如果他们在搜索区域中)我们将呼叫委派给另一个ItextextrateTrategy。

相关内容

  • 没有找到相关文章

最新更新