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

时间:2017-09-25 02:44:47

标签: pdf itext text-extraction

以下是我用于从pdf中提取文本的代码(使用iText for .Net Version 7.0.4.0)。我在测试过程中观察到的是,只有在大多数pdf中提取矩形内容才能很好地工作。但是对于其中很少一部分,它给出了pdf中的整行。我知道

  

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

但我想了解在iText中使用pdf中的哪个参数来分割文本。

        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();

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题。

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对象拆分为其角色的相应事件。然后(如果它们在搜索区域中)我们将调用委托给另一个ITextExtractionStrategy。