【问题标题】:Is there any way to optimize pdfreader itextsharp?有没有办法优化pdfreader itextsharp?
【发布时间】:2020-07-31 01:19:09
【问题描述】:

有一种方法可以多次使用矩形从 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);
}

【问题讨论】:

  • 真的每页最多有一个矩形吗?
  • 每页大约 900 个矩形区域
  • 精氨酸。然后很清楚为什么您的代码需要一些时间来执行。您没有显示您的GetTextFromRectangle,我假设它在每次调用时都会使用区域过滤器解析页面。因此,对于 每页 900 个矩形区域,您解析每个页面 900 次。相反,您应该只解析每个页面一次并限制要提取的文本。
  • ItextSharp 完成所有工作,添加了 GetTextFromRectagle 方法的描述

标签: c# .net multithreading pdf itext


【解决方案1】:

你在评论中提到有

每页大约 900 个矩形区域

并添加了您的GetTextFromRectangle 代码,问题的原因就很清楚了:对于每个您的预定义矩形,您让 iText 解析 整个内容将矩形所在的页面放入过滤后的文本提取策略中,您希望将重点放在相应的矩形区域上。

顺便说一句,更糟糕的是,我没有看到您在您的 GetTextFromRectangle 方法中使用 Rectangle rect 参数,因此毕竟您实际上甚至没有关注相应的矩形!

因此,您对每一页进行大约 900 次解析,每次都会丢弃大部分已解析信息,而不是只从每页 900 个矩形中的每一个的预解析数据中检索文本。

强>

这是最纯粹的资源浪费!

你应该做的是

  • 将您的areas 按各自的页面排序和分隔,然后
  • 对于每个页面
    • 一次(且仅一次)将该页面的内容解析为未经过滤的LocationTextExtractionStrategy

顺便说一句,如果使用 iText 7 而不是 iText 5(对于 .Net,以前称为 iTextSharp),则缺少带有 TextChunkFilterGetResultantText 重载,但您可以模拟它,参见。 this answer.

【讨论】:

  • 这有帮助,现在处理是即时的,谢谢
猜你喜欢
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多