PDF to Text:iTextSharp:提取结果中的重复页面

时间:2015-07-27 20:26:00

标签: c# .net pdf itextsharp pdftotext

提前致谢。

背景:

我正在开发一个控制台应用程序,它从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;
     }

2 个答案:

答案 0 :(得分:1)

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

详细

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

E.g。考虑两个第6页和第7页。它们的内容是相同的:

spread of pages 6 and 7

填写相同 MediaBox 的区域。只需将 CropBox (以及 ArtBox BleedBox TrimBox )分别设置为左侧或右侧,仅显示第6页的预期内容:

page 6

和第7页:

page 7

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

防止提取结果中的重复文本

了解文本复制的原因,有多种方法可以防止它:

  1. 您可以尝试仅提取每个其他PDF页面的内容。不幸的是,上述说法并非适用于所有页面,至少初始页面(标题页,内容......)不是使用上面解释的方案创建的,而且在书中还有一些不遵循该方案的艺术页面。 。因此,此选项需要对特殊页面进行大量管理。

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

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

答案 1 :(得分: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;
    }