为啥 iTextSharp 阅读页面 1..N 而不是 N?
Posted
技术标签:
【中文标题】为啥 iTextSharp 阅读页面 1..N 而不是 N?【英文标题】:Why is iTextSharp reading pages 1..N instead of N?为什么 iTextSharp 阅读页面 1..N 而不是 N? 【发布时间】:2014-10-22 17:53:49 【问题描述】:这是我的代码:
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(以及同一站点上的其他类似 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】:把你的代码改成这样:
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 的评论更新:策略会记住它遇到的所有页面内容。因此,如果你想要一个没有缓冲的提取,你必须使用新的策略。
【讨论】:
@richardtallent 如果您想知道代码的主要问题是什么:策略会记住它遇到的所有页面内容。因此,如果你想要一个没有缓冲的提取,你必须使用新的策略。 谢谢!我没有预料到称为“策略”的对象会产生这种副作用,而且我确实记得现在在出于其他原因重构它时将策略实例移到循环之外。我将它移回循环内部,它又恢复了正常工作。以上是关于为啥 iTextSharp 阅读页面 1..N 而不是 N?的主要内容,如果未能解决你的问题,请参考以下文章