PDF表格结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PDF表格结构相关的知识,希望对你有一定的参考价值。

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

所以我遇到两个问题:

  1. 从PDF中提取表格数据
  2. 文字是马拉地语

我已使用以下代码设法为英语执行此操作:

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)));

这种编码给出了表格结构,但只有英文字体,想知道马拉地语。

答案

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

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

实际上,PDF包含告诉查看器程序(如Adobe)如何呈现PDF的指令。

因此,不是在那里有一个实际的表(就像你在html文档中所期望的那样),它将包含如下内容:

  • 从..到...画一条线
  • 去位置..
  • 画出'123'字符
  • 将字体设置为Helvetica粗体
  • 去位置..
  • 从..到...画一条线
  • 画出'456'字符
  • 等等

另见How does TextRenderInfo work in iTextSharp?

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

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

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

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

另一答案

码:

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);

以上是关于PDF表格结构的主要内容,如果未能解决你的问题,请参考以下文章

ATP应用测试平台——关于网页表格的打印及PDF下载的实战案例

提取PDF表格?方法很简单!

android片段表格布局

如何在数千个 PDF 文件中抓取表格?

Python-Camelot:用三行代码提取PDF表格数据

python 简单的PDF表格刮刀的示例Python代码