PDF表格结构
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PDF表格结构相关的知识,希望对你有一定的参考价值。
我有一个带有表格结构的PDF文件,但我无法将其存储在数据库中,因为PDF文件是Mangal字体。
所以我遇到两个问题:
- 从PDF中提取表格数据
- 文字是马拉地语
我已使用以下代码设法为英语执行此操作:
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表格结构的主要内容,如果未能解决你的问题,请参考以下文章