iTextSharp从特定位置读取

时间:2014-06-12 12:59:54

标签: c# itextsharp ocr

从PDF文件中读取数据时,我遇到使用iTextSharp的问题。我想要实现的是只读取PDF页面的特定部分(我想只检索位于恒定位置的地址信息)。我在阅读以下所有页面时看到了iTextSharp的用法:

        StringBuilder text = new StringBuilder();

        if (File.Exists(fileName))
        {
            PdfReader pdfReader = new PdfReader(fileName);

            for (int page = 1; page <= pdfReader.NumberOfPages; page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

                currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
                text.Append(currentText);
            }
            pdfReader.Close();
        }
        return text.ToString();

但我怎样才能将其限制在特定位置?我愿意使用任何东西,甚至是OCR技术,因为将来某些文件可能会成为图像(但此时不是必需的)。这个项目仅供我使用,因此没有商业用途。

谢谢!

2 个答案:

答案 0 :(得分:8)

您使用的是SimpleTextExtractionStrategy而不是LocationTextExtractionStrategy。请阅读官方文档和随附的示例(Java / C#)。如果rect是基于地址坐标的矩形,则需要:

RenderFilter[] filter = {new RegionTextRenderFilter(rect)};
ITextExtractionStrategy strategy;
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= reader.NumberOfPages; i++) {
    strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter);
    sb.AppendLine(PdfTextExtractor.GetTextFromPage(reader, i, strategy));
}

现在,您将获得与rect相交的所有文字片段(因此部分文字可能位于rect之外,iText不会将文字片段分割成片段)

请注意,您可以使用以下方式获取页面的MediaBox:

Rectangle mediabox = reader.GetPageSize(pagenum);

左下角的坐标为x = mediabox.Left,y = mediabox.Bottom;右上角的坐标是x = mediabox.Right和y = mediabox.Top

x的值从左到右增加; y的值从下到上增加。 PDF中的测量系统的单位称为&#34;用户单元&#34;。默认情况下,一个用户单元与一个点重合(这可能会发生变化,但您不会发现许多具有不同UserUnit值的PDF)。在正常情况下,72个用户单位= 1英寸。

答案 1 :(得分:0)

您可以做的一件事是将地址字段设为PDF表单字段,然后您可以直接访问表单字段来提取信息。