有什么方法可以优化 pdfreader itextsharp 吗?
Is there any way to optimize pdfreader itextsharp?
有一种方法可以多次使用矩形从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);
}
你在评论中提到后有
Approximately 900 rectangle areas per page
并添加了您的 GetTextFromRectangle
代码,问题的原因变得很清楚:对于每个 pre-defined 矩形,您使 iText 解析 矩形所在页面的全部内容 进入过滤文本提取策略,您希望将重点放在相应的矩形区域上。
顺便说一下,更糟糕的是,我没有看到你在你的 GetTextFromRectangle
方法中使用 Rectangle rect
参数,所以毕竟你实际上甚至不要关注各自的矩形!
因此,您对每个页面进行了大约 900 次解析,每次都丢弃了大部分已解析的信息,而不是仅一次,然后从这 900 次中的每一次的 pre-parsed 数据中检索文本每页矩形。
这是最纯粹的资源浪费!
你应该做的是
- 按各自的页面对
areas
进行排序和分隔,
- 对于每个页面
- 一次(且仅一次)将该页面的内容解析为未过滤的
LocationTextExtractionStrategy
和
- 对于该页面上的每个矩形,使用策略实例的
GetResultantText(TextChunkFilter)
方法和按位置过滤的 TextChunkFilter
(所讨论的块是否在手边的矩形内)来检索区域文本。
顺便说一句,如果是 iText 7 而不是 iText 5(对于 .Net,以前称为 iTextSharp),缺少 GetResultantText
重载 TextChunkFilter
但您可以模拟它,cf . .
有一种方法可以多次使用矩形从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);
}
你在评论中提到后有
Approximately 900 rectangle areas per page
并添加了您的 GetTextFromRectangle
代码,问题的原因变得很清楚:对于每个 pre-defined 矩形,您使 iText 解析 矩形所在页面的全部内容 进入过滤文本提取策略,您希望将重点放在相应的矩形区域上。
顺便说一下,更糟糕的是,我没有看到你在你的 GetTextFromRectangle
方法中使用 Rectangle rect
参数,所以毕竟你实际上甚至不要关注各自的矩形!
因此,您对每个页面进行了大约 900 次解析,每次都丢弃了大部分已解析的信息,而不是仅一次,然后从这 900 次中的每一次的 pre-parsed 数据中检索文本每页矩形。
这是最纯粹的资源浪费!
你应该做的是
- 按各自的页面对
areas
进行排序和分隔, - 对于每个页面
- 一次(且仅一次)将该页面的内容解析为未过滤的
LocationTextExtractionStrategy
和 - 对于该页面上的每个矩形,使用策略实例的
GetResultantText(TextChunkFilter)
方法和按位置过滤的TextChunkFilter
(所讨论的块是否在手边的矩形内)来检索区域文本。
- 一次(且仅一次)将该页面的内容解析为未过滤的
顺便说一句,如果是 iText 7 而不是 iText 5(对于 .Net,以前称为 iTextSharp),缺少 GetResultantText
重载 TextChunkFilter
但您可以模拟它,cf .