PDF表格结构

时间:2017-11-20 04:39:32

标签: c# pdf itext hindi

我有一个带有表格结构的PDF文件,但我无法将其存储在数据库中,因为PDF文件是Mangal字体。

所以我遇到两个问题:

  1. 从PDF提取表格数据
  2. 文字是马拉地语
  3. 我已使用以下代码设法为英语执行此操作:

    ITextExtractionStrategy strategy = new LocationTextExtractionStrategy(); 
    string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, i+1, strategy); 
    text.Append(currentText); 
    string rawPdfContent = Encoding.UTF8.GetString(Encoding.Convert(Encoding.UTF8, Encoding.UTF8, pdfReader.GetPageContent(i + 1)));
    

    此编码提供表格结构,但仅适用于英文字体,想知道马拉地语。

2 个答案:

答案 0 :(得分:1)

有趣的是,要求没有。 1实际上是最难的。

为了理解原因,您需要了解一下PDF。 PDF不是WYSIWYG格式。如果您在记事本(或记事本++)中打开PDF文件,您将看到它似乎不包含任何人类可读的信息。

事实上,PDF包含告诉查看器程序(如Adobe)如何呈现PDF的说明。

因此,不存在实际的表格(就像您在HTML文档中所期望的那样),它将包含以下内容:

  • 从...到...
  • 画一条线
  • 去位置..
  • 绘制字符'123'
  • 将字体设置为Helvetica bold
  • 去位置..
  • 从...到...
  • 画一条线
  • 绘制字符'456'

另见How does TextRenderInfo work in iTextSharp?

为了从PDF中提取表格,您需要做几件事。

  • 实现IEventListener(这是一个可以附加到Parser实例的类,Parser将遍历整个页面,并通知所有侦听器,如TextRenderInfo,ImageRenderInfo和PathRenderInfo事​​件)
  • 注意PathRenderInfo事​​件
  • 构建一个跟踪正在绘制路径的数据结构
  • 一旦检测到大约90°角的线簇,就可以假设正在绘制一个表
  • 确定适合行集群的最大边界框(这被称为凸包问题,解决它的算法称为礼品包装算法)
  • 现在你有了一个矩形,告诉你桌子在哪里(在页面上)。
  • 您现在可以递归地在表中应用相同的逻辑来确定行和列
  • 您还可以跟踪TextRenderInfo事​​件,并根据适合表格中每个单元格的矩形将它们分类到容器中

这是很多工作。这些都不是微不足道的。事实上,这就是人们写博士论文的那种东西。

iText以pdf2Data tool的形式很好地实现了大多数算法。

答案 1 :(得分:-1)

代码:

ITextExtractionStrategy strategy = new LocationTextExtractionStrategy(); 
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, i+1, strategy); 
string rawPdfContent = Encoding.UTF8.GetString(Encoding.Convert(Encoding.UTF8, Encoding.UTF8, pdfReader.GetPageContent(i + 1)));

然后我从PDF中识别出线条(水平和垂直)。至于行,PDF有re或m和l关键字。

然后我为从iTextSharp获得的马拉地语文本工作。

然后我合并了两个所需的位置我使用代码提取文本 -

Int64 width = Convert.ToInt64(linesVertical[5].StartPoint.X) - Convert.ToInt64(linesVertical[2].StartPoint.X);
                Int64 height = Convert.ToInt64(linesVertical[2].EndPoint.Y) - (Convert.ToInt64(linesVertical[2].StartPoint.Y));
System.util.RectangleJ rect = new System.util.RectangleJ(Convert.ToInt64(linesVertical[2].StartPoint.X), (800 - Convert.ToInt64(linesVertical[2].EndPoint.Y) + 150), width, height);
                RenderFilter[] renderFilter = new RenderFilter[1];
                renderFilter[0] = new RegionTextRenderFilter(rect);
                ITextExtractionStrategy textExtractionStrategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), renderFilter);
                Owner_Name = PdfTextExtractor.GetTextFromPage(reader, 1, textExtractionStrategy);