有什么方法可以优化pdfreader itextsharp吗?

时间:2020-07-31 01:19:09

标签: c# .net multithreading pdf itext

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

1 个答案:

答案 0 :(得分:0)

在评论中提到有

每页大约900个矩形区域

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

顺便说一句,更糟糕的是,我看不到您在Rectangle rect方法中使用GetTextFromRectangle参数,因此,您实际上甚至根本不关注各个矩形!

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

这是最纯粹的形式的资源浪费!

您应该做的是

  • 按照各自的页面对areas进行分类和分隔,并且
  • 每个页面
    • 一次(,并且仅一次)将该页面的内容解析为未经过滤的LocationTextExtractionStrategy
    • 对于该页面上的每个矩形,请使用策略实例的GetResultantText(TextChunkFilter)方法和TextChunkFilter并按位置过滤(所讨论的块是否在手边的矩形内)以检索区域文本。

顺便说一句,在使用iText 7而不是iText 5(对于.Net,以前称为iTextSharp)的情况下,缺少GetResultantTextTextChunkFilter的重载,但是您可以模拟它,请参见。 this answer