为什么iTextSharp读取页面1..N而不是N?

时间:2014-10-22 17:53:49

标签: pdf itextsharp pdf-reader

这是我的代码:

var sb = new StringBuilder();
var st = new SimpleTextExtractionStrategy();
string raw;
using(var r = new iTextSharp.text.pdf.PdfReader(path)) {
    for(int pn = 1; pn <= r.NumberOfPages; pn++) {
        raw = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(r, pn, st);
        sb.Append(raw);
    }
}

这适用于我所遇到的几乎所有PDF ...直到今天:

http://www7.dleg.state.mi.us/orr/Files/AdminCode/356_10334_AdminCode.pdf

对于此PDF(以及在同一站点上的其他类似内容),第1页的提取文本是正确的,但第2页的文本包含第1页 2,第3页包含第1页-3等等所以我的StringBuilder最终得到了第1,1,2,1,2,3,1,2,3,4等的文字。

使用默认的基于位置的策略具有相同的问题(并且无论如何都不会对这些特定的PDF工作)。

我最近从较旧版本的iTextSharp(5.1-ish?)升级过,之前没有遇到过这个问题(我相信我之前没有问题就解析了其中的一些文件)。我浏览了消息来源,并没有看到任何明显的事情。

我以为我可以通过只询问最后一页来解决这个问题,但这不起作用 - 我只得到最后一页。如果我硬编码循环来获取页面2..4,我得到2,2,3,2,3,4。所以问题可能是PdfReader在调用{GetTextFromPage之间保持的某种数据{1}}。

1 个答案:

答案 0 :(得分:2)

将您的代码更改为以下内容:

var sb = new StringBuilder();
string raw;
using(var r = new iTextSharp.text.pdf.PdfReader(path)) {
    for(int pn = 1; pn <= r.NumberOfPages; pn++) {
        var st = new SimpleTextExtractionStrategy();
        raw = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(r, pn, st);
        sb.Append(raw);
    }
}

根据mkl的评论进行更新:策略会记住它遇到的所有网页内容。因此,如果你想要一个没有缓冲的提取,你必须使用一个全新的策略。