使用iTextSharp查找PDF格式的最后一行

时间:2016-06-06 04:04:25

标签: asp.net vb.net pdf itextsharp

我使用下面的代码在PDF中使用iTextSharp查找最后一行y坐标

Dim pdfReader As New PdfReader("D:/sample.pdf")
Dim y_cordinate as integer
Dim parser As New PdfReaderContentParser(pdfReader)
Dim finder As TextMarginFinder
finder = parser.ProcessContent(pagen0, New TextMarginFinder())
y_cordinate = finder.GetLly()

如果是直接PDF,我可以得到正确的协调 但在其他情况下,我将MS Word文档转换为PDF并在该PDF上尝试上面的代码 然后它获得PDF文档位置的边距(纵坐标) 请帮助找到文本以PDF格式结束的正确y坐标。(Word更早)。 请找到从Word转换的PDF链接。 https://www.dropbox.com/s/ha1vrk58umuv3h7/PACACH0123.pdf?dl=0

1 个答案:

答案 0 :(得分:0)

示例文档的每个页面都包含文本绘图说明,这些说明使用 y 坐标39的基线绘制空格字符:

BT
/F2 14.04 Tf
1 0 0 1 72.024 39.024 Tm
[( )] TJ
ET
BT
1 0 0 1 306.05 39.024 Tm
[( )] TJ
ET
BT
1 0 0 1 397.63 39.024 Tm
[( )] TJ
ET

并且没有

因此,您的代码将正确地返回 39 + descent 作为最后一行的底部。

要解决此问题,您可以使用this answer to "TextMarginFinder to verify printability"中Java / iText中解释和概述的方法,即在计算文本边界框时忽略所有空格字符:

using (PdfReader pdfReader = new PdfReader(source))
{
    System.Console.Write("\n*\n*\n* Filtered last lines per page of {0}\n*\n*\n", source);
    for (int page = 1; page <= pdfReader.NumberOfPages; page++)
    {
        PdfReaderContentParser parser = new PdfReaderContentParser(pdfReader);
        TextMarginFinder finder = new TextMarginFinder();
        FilteredRenderListener filtered = new FilteredRenderListener(finder, new SpaceFilter());
        parser.ProcessContent(page, new TextRenderInfoSplitter(filtered));
        System.Console.Write("Page {0}, Bottom y {1}\n", page, finder.GetLly());
    }
}

使用这两个辅助类

class TextRenderInfoSplitter : IRenderListener
{
    public TextRenderInfoSplitter(IRenderListener strategy) {
        this.strategy = strategy;
    }

    public void RenderText(TextRenderInfo renderInfo) {
        foreach (TextRenderInfo info in renderInfo.GetCharacterRenderInfos()) {
            strategy.RenderText(info);
        }
    }

    public void BeginTextBlock() {
        strategy.BeginTextBlock();
    }

    public void EndTextBlock() {
        strategy.EndTextBlock();
    }

    public void RenderImage(ImageRenderInfo renderInfo) {
        strategy.RenderImage(renderInfo);
    }

    IRenderListener strategy;
}

class SpaceFilter : RenderFilter
{
    public override bool AllowText(TextRenderInfo renderInfo)
    {
        return renderInfo != null && renderInfo.GetText().Trim().Length > 0;
    }
}

示例文档的输出是:

*
*
* Filtered last lines per page of PACACH0123.pdf
*
*
Page 1, Bottom y 81,92254
Page 2, Bottom y 413,1685
Page 3, Bottom y 688,4785

这看起来更像是你追求的数字。