ITextSharp:提取没有小空格的文本

Posted

技术标签:

【中文标题】ITextSharp:提取没有小空格的文本【英文标题】:ITextSharp: Extract text without small spaces 【发布时间】:2015-03-22 20:51:51 【问题描述】:

我正在尝试提取一些 pdf 文件的标题以对其进行排序。不幸的是,每个字母之间都有一个空格,单词之间的空格比同一个单词的字母之间的空格大。 这是我的提取方法:

PdfReader reader = new PdfReader(filename);
Rectangle rect = new Rectangle(0, 0, 1000, 1000);
RenderFilter regionFilter = new RegionTextRenderFilter(rect);
FontRenderFilter fontFilter = new FontRenderFilter();
FilteredTextRenderListener strategy = new FilteredTextRenderListener(
    new LocationTextExtractionStrategy(), regionFilter, fontFilter);
string result = PdfTextExtractor.GetTextFromPage(reader, 1, strategy);
reader.Close();

有没有办法过滤掉较小的空间?

【问题讨论】:

这些空格是对应于实际绘制的空间字形还是由插入点移动产生的?如果您不知道,请提供一个示例 PDF 来说明您的问题。 很遗憾,我无法向您展示示例 pdf,因为我无权这样做。你能告诉我如何确定它们是哪种空间吗? 你能告诉我如何确定它们是哪种类型的空间 - 使用 PDF 浏览器(例如 RUPS)并检查相应的页面或 xobject 流。需要对PDF specification 有一些透彻的了解。 This answer 和 this one 处理一个可能相关的问题:在他们的情况下,字符之间的间隙太小而无法识别为空格。如果您的空间来自插入点移动,那么这些答案可能会启发您。 据我所知,有实际绘制的空间。 【参考方案1】:

iText 使用渲染字形的距离作为基础来确定是否存在空格。应用的一般规则是,如果距离大于正常空格的宽度除以 2,则识别空格字符。虽然这在大多数情况下工作得很好,但如果空格字符的宽度无法确定所用字体的宽度,它就根本不起作用。在我的例子中,空格的宽度被识别为 0,因此字形之间的最小距离被识别为空格。我的解决方案基于 mkl 对与您的问题非常相似的另一个答案。

简而言之:您需要从例如SimpleTextExtractionStrategy 或 LocationTextExtractionStrategy 并覆盖将字形之间的距离转换为空格的方法(分别为 renderText 或 isChunkAtWordBoundary)

您也可以参考the answer I gave here 或original solution by mkl。

【讨论】:

OP表示字母之间实际上可能有空格字符。在这种情况下,更改您引用的参数将无济于事。 (不过,可能 OP 是错误的,实际上只需要一些单词边界检测微调......)

以上是关于ITextSharp:提取没有小空格的文本的主要内容,如果未能解决你的问题,请参考以下文章

iTextSharp 在 pdf 文件中的单词中插入空格

如何使用 iTextSharp 4.1.6 提取文本?

从矩形中提取文本时的 ItextSharp anagram 输出

使用itextsharp从pdf中提取文本返回空字符串

C#如何利用itextSharp修改现有PDF文件内容,比如插入

iTextSharp PDF 使用 C# 读取突出显示的文本(突出显示注释)