如何使用iText查找文档中的行位置?
假设我说PDF文档中有一个表,并想要阅读其内容;我想找到细胞所在的位置。为了做到这一点,我想我可能会找到线的交叉点。
答案 0 :(得分:9)
我认为使用iText的唯一选择是手动解析PDF令牌。在此之前我会have a copy of the PDF spec handy。
(我是.Net的家伙,所以我使用iTextSharp,但除了一些大写差异和属性声明之外,它们差不多100%相同。)
您可以使用PRTokeniser
对象获取单个令牌,该对象是您在getPageContent(pageNum)
上调用PdfReader
时输入字节的数据。
//Get bytes for page 1
byte[] pageBytes = reader.getPageContent(1);
//Get the tokens for page 1
PRTokeniser tokeniser = new PRTokeniser(pageBytes);
然后循环浏览PRTokeniser
:
PRTokeniser.TokType tokenType;
string tokenValue;
while (tokeniser.nextToken()) {
tokenType = tokeniser.tokenType;
tokenValue = tokeniser.stringValue;
//...check tokenValue, do something with it
}
到tokenValue
为止,您可能希望查找矩形和线条的re
和l
值。如果您看到re
,那么您想要查看 之前的 4值,如果看到l
,那么 之前的 2个值。这也意味着您需要将每个tokenValue
存储在一个数组中,以便稍后再回顾。
根据您用于创建PDF的内容,您可能会得到一些有趣的结果。例如,我使用Microsoft Word创建了一个4单元格表并保存为PDF。由于某种原因,有两组10个矩形,有许多重复,但总体思路仍然有效。
以下是针对iTextSharp 5.1.1.0的C#代码。您应该能够非常轻松地将其转换为Java和iText,我注意到一行具有特定于.Net的代码,需要从通用列表(List<string>
)调整为Java等价物,可能是{ {1}}。您还需要调整一些大小写,.Net使用ArrayList
而Java使用Object.Method()
。最后,.Net访问没有gets和sets的属性,因此与Java的Object.method()
和Object.Property
相比,Object.getProperty
既是getter又是setter。
希望这至少让你开始了!
Object.setProperty