从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技术,因为将来某些文件可能会成为图像(但此时不是必需的)。这个项目仅供我使用,因此没有商业用途。
谢谢!
答案 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表单字段,然后您可以直接访问表单字段来提取信息。