从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英寸.