1

提前致谢。

的背景:

我正在开发一个控制台应用程序,该应用程序从 pdf 文档的特定部分中提取数据。为此,我首先需要将该 pdf 转换为要使用的字符串。为此,我求助于 iTextSharp。pdf 布局为每页两列,因此我使用 SimpleTextExtractionStratgey()(我尝试了 iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();但发现它对页面布局无效)。

转换为文本的内容说明:

我似乎遇到问题的页面有一个“标题”张贴在页面的一侧。带有页眉的页面间歇性地分散在文档中。

页面布局图片:http: //postimg.org/image/b7i25v0g1/

问题:

似乎当它完成浏览页面上的列然后移动到该侧标题时。然后它会跳转到带有侧页眉的下一页,将其转换为文本,然后从遇到第一个页眉的页面顶部重新开始。

我最终会得到如下所示的文本:

第 1 页内容

第一个标题

第二个标题

第 1 页内容

第 2 页内容

等等

这是pdf:http ://www.filedropper.com/dd35-completeadventurer

我没有嫁给 iTextSharp 我只需要一种可靠的方法来将这种格式的文档转换为文本。解决方法或替代方法将不胜感激。

    static public string ToTxt(string @filePath)
    {
        string strText = string.Empty;
        try
        {
            PdfReader reader = new PdfReader(filePath);

            for (int page = 1; page <= reader.NumberOfPages; page++)
            {

                Widgets.ProgressBar(page);

                //Convert PDF to Text
                ITextExtractionStrategy its = new SimpleTextExtractionStrategy(); //iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
                String s = PdfTextExtractor.GetTextFromPage(reader, page, its);
                strText = strText + s;
            }
            reader.Close();
            Console.WriteLine("File Extracted");
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception: " + e.Message);
        }
        finally
        {
            Console.Clear();
        }
        return strText;
     }
4

2 回答 2

1

正如评论中已经推测的那样,重复的文本已经存在于 PDF 内容中!

细节

文档中相对的成对页面的页面内容通常是相同的,每次都是整个展开的内容,而各个页面仅分别仅显示 左半部分或右半部分。

例如,考虑第 6 和 7 页两页。它们的内容是相同的:

第 6 页和第 7 页的展开

填充它们相同MediaBox的区域。仅通过将CropBox(以及ArtBoxBleedBoxTrimBox)分别设置到左半部分或右半部分,第 6 页只显示预期的内容:

第 6 页

第 7 页:

第 7 页

iText(Sharp) 解析器框架和SimpleTextExtractionStrategy自动限制这些框都不是,它们提取内容中任何位置绘制的所有文本。因此,重复的文本。

防止提取结果中出现重复文本

知道文本重复的原因,有多种方法可以防止它:

  1. 您可以尝试仅提取每个其他 PDF 页面的内容。不幸的是,上述内容并非适用于所有页面,至少初始页面(标题页,内容,...)不是使用上述方案创建的,并且在书中还有一些艺术品页面也没有遵循该方案. 因此,此选项将需要对异常页面进行相当多的管理。

  2. 您可以提取每个页面的内容,但将先前处理的页面的内容保留在某个变量中。现在仅将新提取的内容添加到结果中,如果它不等于前一页的内容。

  3. 您可以使用 iText(Sharp) 解析器过滤器。如果您将策略处理的文本块限制为仅在当前页面的裁剪框内绘制的文本块,则可以防止由页外内容引起的重复文本。您可以在此处找到按区域过滤的示例:ExtractPageContentArea.java / ExtractPageContentArea.cs

于 2015-07-28T08:55:20.327 回答
1

使用 mkl 的第二种方法(检查每一页是否重复)我想出了以下方法,它工作得很好;一个简单的修复:

    string strText = string.Empty;
        try
        {
            PdfReader reader = new PdfReader(filePath);
            string prevPage = "";
            for (int page = 1; page <= reader.NumberOfPages; page++)
            {
                Widgets.ProgressBar(page);
                //Convert PDF to Text
                ITextExtractionStrategy its = new SimpleTextExtractionStrategy();
                String s = PdfTextExtractor.GetTextFromPage(reader, page, its);
                if (prevPage != s)
                    strText += s;
                prevPage = s;
            }
            reader.Close();
            Console.WriteLine("File Extracted");
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception: " + e.Message);
        }
        finally
        {
            Console.Clear();
        }
        return strText;
    }
于 2015-07-28T17:42:15.347 回答