使用iText获取行位置

时间:2012-01-04 14:34:18

标签: itext

如何使用iText查找文档中的行位置?

假设我说PDF文档中有一个表,并想要阅读其内容;我想找到细胞所在的位置。为了做到这一点,我想我可能会找到线的交叉点。

1 个答案:

答案 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为止,您可能希望查找矩形和线条的rel值。如果您看到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