iTextSharp 在 pdf 文件中的单词中插入空格
Posted
技术标签:
【中文标题】iTextSharp 在 pdf 文件中的单词中插入空格【英文标题】:iTextSharp inserting spaces within words from a pdf file 【发布时间】:2017-02-06 17:25:31 【问题描述】:使用 iTextSharp,我正在尝试从以下 pdf 文件中提取文本:
https://www.treasury.gov/ofac/downloads/sdnlist.pdf
这是代码:
var currentText = PdfTextExtractor.GetTextFromPage(pdfReader, 2, new SimpleTextExtractionStrategy());
if (currentText.Length > 0)
var capture = new Capture();
capture.Text = currentText;
// write the results to the DB, if any data was found
_dataService.AddCapture(capture);
使用 SimpleTextExtractionStrategy,将结果写入数据库,单词中包含无数不需要的空格。第2页的前几行写成:
外国资产控制办公室特别指定的国民和受阻人员 2017 年 2 月 3 日 - 2 - A.A.树莓派;一个.k。 一种。 AL MAZ -AN TEY MSDB;又名AL MAZ -ANTEY PV O 'AI R DEFENSE' CO NCERN LEAD SYSTEM M S DESIGN BUREAU OAO ' OPEN JO INT -STOCK COMPANY' IMNI ACADEMIC IAN A.A .拉斯普林;又名去爱吧 SISTEMN OYE KONS TRUKT ORSKOY E BYURO OPEN J OIN T-S TOCK C OMP ANY ALMAZ -AN TEY PVO 关注 I Men I ACADEMICIAN A .A.锉锡; 又名一种。 JO INT STOCK COMPANY A LMA Z-AN TEY AI R DEFENSE CON CERN 由 ACADE MICIAN A.A. 命名的系统设计局硕士
例如,请参见第 4 行和第 6 行中的单词“JO INT”,以及倒数第二行中的单词“CON CERN”。这些类型的空间出现在整个结果中。不幸的是,这将使查询文本变得不可能。
有谁知道为什么会这样以及如何解决这个问题?
【问题讨论】:
【参考方案1】:为什么这样做
原因实际上是文本提取策略的一个特征,在您的情况下它不能按预期工作。
一点背景知识:您认为 PDF 文件中单词之间的空格不一定是由于指令绘制空格字符而产生的,它也可能是由于指令将文本插入位置向右移动一点。因此,文本提取策略通常会在找到足够大的右移时添加空格字符。对于更多关于这个(特别是“足够大”的部分)赋予例如this answer.
但是,对于您的文档,文本正文字体的字体宽度信息太小(如果按原样使用,则字符看起来粘在一起,中间没有任何空格);因此,每对连续字符之间存在小的右移,其中一些移宽到足以被上述机制错误地识别为单词分离。
如何解决这个问题
由于 PDF 中的分词是通过绘制空格字符的说明创建的,因此您不需要上述功能。因此,解决问题的最简单方法是使用没有该功能的文本提取策略。
您可以通过复制SimpleTextExtractionStrategy
的源代码(例如来自here)来创建这样的策略,并在方法RenderText
中注释掉一些行,如下所示:
public virtual void RenderText(TextRenderInfo renderInfo)
[...]
if (hardReturn)
//System.out.Println("<< Hard Return >>");
AppendTextChunk('\n');
else if (!firstRender)
// if (result[result.Length - 1] != ' ' && renderInfo.GetText().Length > 0 && renderInfo.GetText()[0] != ' ')
// // we only insert a blank space if the trailing character of the previous string wasn't a space, and the leading character of the current string isn't a space
// float spacing = lastEnd.Subtract(start).Length;
// if (spacing > renderInfo.GetSingleSpaceWidth() / 2f)
//
// AppendTextChunk(' ');
// //System.out.Println("Inserting implied space before '" + renderInfo.GetText() + "'");
//
//
else
//System.out.Println("Displaying first string of content '" + text + "' :: x1 = " + x1);
[...]
使用这种简化的提取策略,可以正确提取您的文本。
【讨论】:
我在这些地方见过你,你肯定是这个主题的王者。感谢您的大智慧和帮助!以上是关于iTextSharp 在 pdf 文件中的单词中插入空格的主要内容,如果未能解决你的问题,请参考以下文章
使用文本框中的值通过 iTextSharp 保存 PDF 文件
使用 iTextSharp 将文本添加到内存流中的现有多页 PDF 文档