【问题标题】:Extract entire text from PDF with iTextSharp使用 iTextSharp 从 PDF 中提取整个文本
【发布时间】:2014-06-06 01:47:16
【问题描述】:

我正在尝试解析PDF documents,以便将某些值添加到现有数据库中。问题在于解析 PDF。

第一次尝试

String[] AllPdf = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.pdf", SearchOption.TopDirectoryOnly);
        foreach (var pdfDoc in AllPdf)
        {
            using (PdfReader reader = new PdfReader(pdfDoc))
            {
                for (int page = 1; page <= reader.NumberOfPages; page++)
                {
                    ITextExtractionStrategy strategy = new LocationTextExtractionStrategy();
                    String text = PdfTextExtractor.GetTextFromPage(reader, page, strategy);
                }
                
            }
        }

但不幸的是,这只解析了标题之后的文本(雇主、网站、语言等)。我需要标题才能创建一个将映射到数据库中的关系的类。

第二次尝试

String[] AllPdf = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.pdf", SearchOption.TopDirectoryOnly);
        foreach (var pdfDoc in AllPdf)
        {
            using (PdfReader reader = new PdfReader(pdfDoc))
            {
                for (int page = 1; page <= reader.NumberOfPages; page++)
                {
                    byte[] streamBytes = reader.GetPageContent(page);
                    PRTokeniser tokenizer = new PRTokeniser(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource(streamBytes)));
                    while (tokenizer.NextToken())
                    {
                        if (tokenizer.TokenType == PRTokeniser.TokType.STRING)
                        {
                            String text = tokenizer.StringValue;
                        }
                    }
                }
                
            }
        }

幸运的是,它解析了丢失的标题,但它首先解析它们(新行中的单词而不是单行),然后解析值。

iTextSharp 文档?

iTextSharp 中必须有可以找到标题/值对的类。或者至少以可读格式解析标题。我很高兴编写自己的 ITextExtractionStrategy 实现。

【问题讨论】:

  • 你会在 SO 上找到许多类似的问题,但我会重复我们给每个人的答案。 PDF 没有“标题”或“表格”或“页眉”或“页脚”。他们甚至没有“段落”或“句子”或“单词”。它们只是有字符、线条和图像,这些字符、线条和图像恰好位于与您期望的模式相匹配的位置。此外,无法保证 PDF 中的文本是从左到右、从上到下书写的。 LocationTextExtractionStrategy 试图通过找出事物的逻辑顺序来为您解决这个问题。如果您提供示例 PDF,我们可以为您提供更多帮助。

标签: c# .net pdf itextsharp


【解决方案1】:

iTextSharp 没有官方文档页面,但您可以在 SO 上找到一些答案 here。不要从字符串中的 PDF 中获取数据,而是尝试将其解析为 XML,然后使用 XPath 来获取您需要的数据。或者您可以使用 Linq to XML。我猜PDF中的每一页都有相同的格式,所以XML结构也可以有相同的格式。

这是一个使用iTextSharp 的项目示例,here 是一个您可以使用的 SDK(付费),但如果您希望它免费,它是一个临时解决方案。

【讨论】:

  • iTextSharp 是 Java iText 的 .Net 端口。该端口几乎是一对一的,因此 Java 文档运行良好。您只需将“Java-isms”更改为“.Net-isms”,例如将get/set Java 方法更改为 .Net 属性并将方法名称的第一个字母大写。 itextpdf.com/api
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多