c# – iTextSharp从特定位置读取

从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技术,因为将来某些文件可能会成为图像(但此时不是必需的).这个项目仅适合我,所以没有商业用途.

谢谢!

解决方法:

您正在使用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中的测量系统的单位称为“用户单位”.默认情况下,一个用户单元与一个点重合(这可能会更改,但您找不到许多具有不同UserUnit值的PDF).在正常情况下,72个用户单位= 1英寸.

上一篇:html转pdf问题解决(C#)


下一篇:c# – 使用Windows 10 Universal App的iTextSharp