有一种方法可以多次使用矩形从pdf文档的不同页面读取文本。因此,文件越大,所有内容处理的速度就越慢,我尝试使用Parallel.Foreach,但是处理速度没有得到实质性的提高,所有内容似乎都受到PdfReader的阻碍。
方法是这样的:
var lst = new ConcurrentBag<Test3>();
using(var reader = new PdfReader(byteArr))
{
Parallel.Foreach(areas, t =>
{
var pageSize = reader.GetPageSize(t.PageNumber);
var rectangle = GetRectagle(t.AreaData, pageSize);
var text = GetTextFromRectangle(reader, rectagle, t.PageNumber);
lst.Add(text);
}
}
public string GetTextFromRectagle(PdfReader reader, Rectangle rect, int pageNum)
{
RenderFilter[] filter = {
new RegionTextRenderText()
};
ITextExtractionStrategy strategy =
new FilteredTextRenderListener(new
LocationTextExtractionStrategy(), filter);
return PdfTextExtractor.GetTextFromPage(reader, pageNumber, strategy);
}
答案 0 :(得分:0)
在评论中提到有
每页大约900个矩形区域
并添加您的GetTextFromRectangle
代码,问题的原因变得很清楚:对于每个预定义矩形,您都让iText解析整个内容矩形所在的页面中,您会选择一个过滤后的文本提取策略,您希望该策略将重点放在相应的矩形区域上。
顺便说一句,更糟糕的是,我看不到您在Rectangle rect
方法中使用GetTextFromRectangle
参数,因此,您实际上甚至根本不关注各个矩形!
因此,您对每个页面进行了大约900次解析,每次都扔掉了大部分已解析的信息,而不是一次,而是从每页900个矩形中的预解析数据中检索文本。
这是最纯粹的形式的资源浪费!
您应该做的是
areas
进行分类和分隔,并且LocationTextExtractionStrategy
和GetResultantText(TextChunkFilter)
方法和TextChunkFilter
并按位置过滤(所讨论的块是否在手边的矩形内)以检索区域文本。顺便说一句,在使用iText 7而不是iText 5(对于.Net,以前称为iTextSharp)的情况下,缺少GetResultantText
和TextChunkFilter
的重载,但是您可以模拟它,请参见。 this answer。