gpt4 book ai didi

itext - 使用 iText 获取行位置

转载 作者:行者123 更新时间:2023-12-01 08:36:53 36 4
gpt4 key购买 nike

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

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

最佳答案

我认为您使用 iText 的唯一选择是手动解析 PDF 标记。在这样做之前,我会 have a copy of the PDF spec handy

(我是 .Net 人,所以我使用 iTextSharp,但除了一些大小写差异和属性声明之外,它们几乎 100% 相同。)

您可以使用 PRTokeniser 对象获取单个 token ,通过在 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 等效代码,可能是 ArrayList 。您还需要调整一些大小写,.Net 使用 Object.Method() 而 Java 使用 Object.method() 。最后,.Net 无需获取和设置即可访问属性,因此与 Java 的 Object.PropertyObject.getProperty 相比, Object.setProperty 既是 getter 又是 setter。

希望这至少能让你开始!
        //Source file to read from
string sourceFile = "c:\\Hello.pdf";

//Bind a reader to our PDF
PdfReader reader = new PdfReader(sourceFile);

//Create our buffer for previous token values. For Java users, List<string> is a generic list, probably most similar to an ArrayList
List<string> buf = new List<string>();

//Get the raw bytes for the page
byte[] pageBytes = reader.GetPageContent(1);
//Get the raw tokens from the bytes
PRTokeniser tokeniser = new PRTokeniser(pageBytes);

//Create some variables to set later
PRTokeniser.TokType tokenType;
string tokenValue;

//Loop through each token
while (tokeniser.NextToken()) {
//Get the types and value
tokenType = tokeniser.TokenType;
tokenValue = tokeniser.StringValue;
//If the type is a numeric type
if (tokenType == PRTokeniser.TokType.NUMBER) {
//Store it in our buffer for later user
buf.Add(tokenValue);
//Otherwise we only care about raw commands which are categorized as "OTHER"
} else if (tokenType == PRTokeniser.TokType.OTHER) {
//Look for a rectangle token
if (tokenValue == "re") {
//Sanity check, make sure we have enough items in the buffer
if (buf.Count < 4) throw new Exception("Not enough elements in buffer for a rectangle");
//Read and convert the values
float x = float.Parse(buf[buf.Count - 4]);
float y = float.Parse(buf[buf.Count - 3]);
float w = float.Parse(buf[buf.Count - 2]);
float h = float.Parse(buf[buf.Count - 1]);
//..do something with them here
}
}
}

关于itext - 使用 iText 获取行位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8728550/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com