gpt4 book ai didi

c# - 使用 itextsharp 检索页面上所有单词的各自坐标

转载 作者:行者123 更新时间:2023-11-30 13:59:22 33 4
gpt4 key购买 nike

我的目标是检索页面上所有单词的各自坐标,我所做的是

PdfReader reader = new PdfReader("cde.pdf");
TextWithPositionExtractionStategy S = new TextWithPositionExtractionStategy();
PdfTextExtractor.GetTextFromPage(reader,1,S);

Vector curBaseline = renderInfo.GetDescentLine().GetStartPoint();
Vector topRight = renderInfo.GetAscentLine().GetEndPoint();

iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(curBaseline[Vector.I1], curBaseline[Vector.I2], topRight[Vector.I1], topRight[Vector.I2]);
string x1 = curBaseline[Vector.I1].ToString();
string x2 = curBaseline[Vector.I2].ToString();
string x3 = topRight[Vector.I1].ToString();
string x4 = topRight[Vector.I2].ToString();

但是,我得到的是一个字符串的坐标,它包含一行中的所有单词,而不是一个单词。例如pdf的内容是“我是女孩”,我得到的是“的坐标我是一个女孩”,但不是“我”"is"“一个”“女孩”的坐标。我如何修改代码以便获得单词坐标。谢谢。

最佳答案

(我主要使用 Java 库 iText,而不是 .Net 库 iTextSharp;因此,请忽略这里的一些 Java 主义,一切都应该很容易翻译。)

要使用 iText(Sharp) 提取页面内容,您可以使用解析器包中的类在经过一些预处理后将其提供给您选择的 RenderListener

在您只对文本感兴趣的上下文中,您最常使用 TextExtractionStrategy,它派生自 RenderListener 并添加一个方法 getResultantText 从页面中检索聚合文本。

由于 iText 中文本解析的最初目的是实现此用例,因此大多数现有的 RenderListener 示例都是 TextExtractionStrategy 实现并且仅使文本可用。

因此,您将必须实现您自己的 RenderListener,您似乎已经将其命名为 TextWithPositionExtractionStategy

就像同时存在一个SimpleTextExtractionStrategy(它是通过对页面内容操作符的结构的一些假设来实现的)和一个LocationTextExtractionStrategy(它没有相同的假设但稍微复杂一些),您可能希望从做出一些假设的实现开始。

因此,就像在 SimpleTextExtractionStrategy 的情况下一样,您在第一个简单的实现中期望转发给您的监听器的文本呈现事件逐行到达,并且在同一行上从左边开始向右。这样,一旦您发现水平间隙或标点符号,您就知道当前单词已完成并可以对其进行处理。

与文本提取策略相反,您不需要 StringBuffer 成员来收集您的结果,而是需要一些“带位置的单词”结构的列表。此外,您需要一些成员变量来保存您已经为此页面收集但最终无法处理的 TextRenderInfo 事件(您可能会在几个单独的事件中检索一个词)。

一旦为新的 TextRenderInfo 对象调用您(即您的 renderText 方法),您应该像这样操作(伪代码):

if (unprocessedTextRenderInfos not empty)
{
if (isNewLine // Check this like the simple text extraction strategy checks for hardReturn
|| isGapFromPrevious) // Check this like the simple text extraction strategy checks whether to insert a space
{
process(unprocessedTextRenderInfos);
unprocessedTextRenderInfos.clear();
}
}

split new TextRenderInfo using its getCharacterRenderInfos() method;
while (characterRenderInfos contain word end)
{
add characterRenderInfos up to excluding the white space/punctuation to unprocessedTextRenderInfos;
process(unprocessedTextRenderInfos);
unprocessedTextRenderInfos.clear();
remove used render infos from characterRenderInfos;
}
add remaining characterRenderInfos to unprocessedTextRenderInfos;

process(unprocessedTextRenderInfos) 中,您从 unprocessedTextRenderInfos 中提取所需的信息;您将各个文本内容连接到一个单词并获取您想要的坐标;如果您只需要起始坐标,则可以从那些未处理的 TextRenderInfo 中的第一个获取坐标。如果您需要更多数据,您还可以使用来自其他 TextRenderInfos 的数据。使用这些数据,您可以填充一个“带位置的词”结构并将其添加到您的结果列表中。

当页面处理完成后,你必须再次调用process(unprocessedTextRenderInfos)和unprocessedTextRenderInfos.clear();或者,您可以在 endTextBlock 方法中执行此操作。

完成此操作后,您可能会准备好实现稍微复杂一些的变体,该变体在页面内容结构方面没有相同的假设。 ;)

关于c# - 使用 itextsharp 检索页面上所有单词的各自坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13714605/

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