这是我的代码:
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}}。
答案 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的评论进行更新:策略会记住它遇到的所有网页内容。因此,如果你想要一个没有缓冲的提取,你必须使用一个全新的策略。