尝试了解ITextSharp

时间:2018-01-26 08:09:54

标签: c# pdf itext

我尝试构建一个可以使用C#将PDF转换为excel的应用程序。 我已经搜索了一些库来帮助我,但是大多数都是商业许可的,所以我最终选择了iTextSharp.dll

这是免费的,但我很少找到任何好的开源文档。 这些是我读过的一些链接:

  1. https://yoda.entelect.co.za/view/9902/extracting-data-from-pdf-files

  2. https://www.mikesdotnetting.com/article/80/create-pdfs-in-asp-net-getting-started-with-itextsharp

  3. http://www.thedevelopertips.com/DotNet/ASPDotNet/Read-PDF-and-Convert-to-Stream.aspx?id=34
  4. 还有更多。但是,他们中的大多数并没有真正解释代码的用途。 所以这是IText中最常见的C#代码:

    StringBuilder text = new StringBuilder(); // my new file that will have pdf content?
            PdfReader pdfReader = new PdfReader(myPath); // This maybe how IText read the pdf?
            for (int page = 1; page <= pdfReader.NumberOfPages; page++) // looping for read all content in pdf?
            {
                ITextExtractionStrategy strategy = new LocationTextExtractionStrategy(); // ?
                string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy); // ?
                currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText))); // maybe how IText convert the data to text?
                text.Append(currentText); // maybe the full content?
            }
            pdfReader.Close(); // to close the PdfReader?
    

    如您所见,我仍然不清楚我所拥有的IText代码。告诉我,如果我的知识是正确的,并给我一个我仍然不理解的代码的答案。

    谢谢。

1 个答案:

答案 0 :(得分:4)

首先让我解释一下PDF PDF不是“您所看到的就是您所获得的”格式。

在内部,PDF更像是包含渲染软件说明的文件。除非您使用带标记的PDF文件,否则PDF文档自然不具有“段落”或“表格”的概念。

例如,如果您在记事本中打开PDF,则可能会看到类似

的内容
7 0 obj
<</BaseFont/Helvetica-Oblique/Encoding/WinAnsiEncoding/Subtype/Type1/Type/Font>>
endobj

文档中的说明聚集到“对象”中,对象编号,可以交叉引用。

正如布鲁诺已经在评论中指出的那样,这意味着找出一张桌子是什么,或者一张桌子的内容是什么,真的很难。

PDF文档本身只能告诉您:

  • 对象8是从[50,100]到[150,100]
  • 的行
  • 对象125是一段文本,字体为Helvetica,位置为[50,110]

使用iText核心库,您可以

  • 获取所有这些对象(iText调用PathRenderInfo,TextRenderInfo和ImageRenderInfo对象)
  • 在渲染对象时获取图形状态(字体,字体大小,颜色等)

这可以让您编写自己的解析逻辑。 例如:

  • 收集所有PathRenderInfo对象
  • 删除所有不完美的水平或垂直线
  • 制作以90度角相交的所有物品的簇
  • 如果群集包含超过给定阈值的行,请将其视为表格

幸运的是,pdf2Data解决方案(iText插件)已经为您做了那样的事情。

有关更多信息,请转到http://pdf2data.online/