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 文档

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

使用itextsharp.dll生成PDF [关闭]

HTML 到 PDF - iTextSharp 中的 CSS

csharp 使用iTextSharp库根据文本框中的信息创建一个简单的PDF文件。