首页 文章

PDF到文本:iTextSharp:提取结果中的重复页面

提问于
浏览
1

提前致谢 .

The Background:

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

Description of content being converted to text:

我似乎遇到问题的页面在页面的一侧张贴了“ Headers ” . 带 Headers 的页面间歇性地分散在文档中 .

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

The Problem:

看来,当它完成查看页面上的列时,然后移动到该侧 Headers . 然后它将跳转到带有 Headers 的下一页,将其转换为文本,然后从遇到第一个 Headers 的页面顶部再次开始 .

我最终会看到如下文字:

第1页内容

第一个 Headers

第二个 Headers

第1页内容

内容

等等

这是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 回答

  • 1

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

    详情

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

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

    spread of pages 6 and 7

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

    page 6

    和第7页:

    page 7

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

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

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

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

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

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

  • 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;
        }
    

相关问题