PDF数据提取------2.相关类介绍
1.简介
构造数据类型PdfString封装Rect类,PdfAnalyzer类中定义一些PDF解析方法。
2.PdfString类与Rect类
public class PdfString : IComparable<PdfString>
{
public string Words { get; set; }
public Rect Position { get; set; }
public int PageNumber { get; set; } public PdfString(string str, Rect pos, int pageNum)
{
this.Words = str;
this.Position = pos;
this.PageNumber = pageNum;
} public override string ToString()
{
return this.Words;
} public static PdfStringComparer GetComparer()
{
return new PdfString.PdfStringComparer();
} public int CompareTo(PdfString rhs)
{
return this.Position.x2.CompareTo(rhs.Position.x2);
} /// <summary>
///comparer by Horizontal or vertical
/// </summary>
/// <param name="rhs"></param>
/// <param name="which">comparer type</param>
/// <returns></returns>
public int CompareTo(PdfString rhs, PdfString.PdfStringComparer.ComparisonType which)
{
switch (which)
{
case PdfStringComparer.ComparisonType.Horizontal:
return this.Position.x2.CompareTo(rhs.Position.x2);
case PdfStringComparer.ComparisonType.Vertical:
return this.Position.y2.CompareTo(rhs.Position.y2);
} return ;
} /// <summary>
/// for comparer custom comparer type
/// </summary>
public class PdfStringComparer : IComparer<PdfString>
{
private PdfString.PdfStringComparer.ComparisonType whichComparison; public enum ComparisonType { Horizontal, Vertical }; public int Compare(PdfString lhs, PdfString rhs)
{
return lhs.CompareTo(rhs, whichComparison);
} public PdfString.PdfStringComparer.ComparisonType WhichComparison
{
get { return whichComparison; }
set { whichComparison = value; }
}
}
}
public class Rect
{
public Rect();
public Rect(Obj rect);
public Rect(double x1, double y1, double x2, double y2); public double x1 { get; set; }
public double x2 { get; set; }
public double y1 { get; set; }
public double y2 { get; set; } public void __dtor();
public void Attach(Obj obj);
public bool Contains(double x, double y);
public void Get(ref double out_x1, ref double out_y1, ref double out_x2, ref double out_y2);
public double Height();
public void Inflate(double amount);
public void Inflate(double x, double y);
public bool IntersectRect(Rect rect1, Rect rect2);
public void Normalize();
public static Rect op_Assign(Rect lr, Rect rr);
public void Set(Rect p);
public void Set(double x1, double y1, double x2, double y2);
public bool Update();
public bool Update(Obj obj);
public double Width();
}
3.关于PdfString类
1.封装Rect原因
a.Rect这个类粒度太小,必须有个类能够保存搜索到关键信息的数据结构,为了根据语义二次识别出准备关键信息。
b. Words属性保存每个搜索结果值
c.Rect:保存结果左上角坐标(x1,y1)右下角坐标(x2,y2)信息
d.PageNumber:数据所在页码,由于PDF中坐标相对于每一页来说的,所以需要页码定位数据为止。
2.实现IComparable<PdfString>接口和加入一个嵌入类PdfStringComparer
a.因为在根据坐标解析PDF中获取数据信息并不是有序,就是说抓取数据并不是按照一定规律保存的,而是杂乱无章的。
b.如果单纯实现IComparable<T>接口可以根据Position属性选择一种方式来讲得到结果集排序,注意实现IComparable<T>
只能选择一种固定排序方式,无法根据情况自定义排序方式,于是PdfString类中引入一个嵌入类PdfStringComparer当使用
x1或x2坐标作为基准则按Horizontal位置坐标排序结果集,反之按照Vertical。
4.关于PdfAnalyzer类
public enum PositionRect { X1, Y1, X2, Y2 }
public class PdfAnalyzer
{
public List<PdfString> RegexSearchAllPages(PDFDoc doc, string pattern)
{
return RegexSearch(doc, pattern, false, -, -, true);
}
public List<PdfString> RegexSearchByPageRange(PDFDoc doc, string pattern, int startPage, int endPage)
{
if (endPage > doc.GetPageCount())
throw new Exception("endPage out of MaxRange of pdf.");
if (startPage < )
throw new Exception("startPage out of MixRange of pdf.");
if (startPage > endPage)
throw new Exception("pageRange is invalid.");
return RegexSearch(doc, pattern, false, startPage, endPage, true);
}
public List<PdfString> RegexSearchByPage(PDFDoc doc, string pattern, int pageIndex)
{
if (pageIndex > doc.GetPageCount())
throw new Exception("pageIndex out of MaxRange of pdf.");
if (pageIndex < )
throw new Exception("pageIndex out of MixRange of pdf.");
return RegexSearch(doc, pattern, false, pageIndex, pageIndex, true);
}
public List<PdfString> RegexSearch(PDFDoc doc, string pattern, bool ifWholeWord, int startPage, int endPage, bool ignoreCase)
{
List<PdfString> result = new List<PdfString>();
Int32 page_num = ;
string result_str = "";
string ambient_string = "";
Highlights hlts = new Highlights();
Int32 mode = (Int32)(TextSearch.SearchMode.e_reg_expression | TextSearch.SearchMode.e_highlight);
if (ifWholeWord) mode |= (Int32)TextSearch.SearchMode.e_whole_word;
if (ignoreCase) mode |= (Int32)TextSearch.SearchMode.e_case_sensitive;
int pageCount = doc.GetPageCount();
if (endPage > pageCount) endPage = pageCount;
TextSearch txt_search = new TextSearch();
txt_search.Begin(doc, pattern, mode, startPage, endPage);
while (true)
{
TextSearch.ResultCode code = txt_search.Run(ref page_num, ref result_str, ref ambient_string, hlts);
if (code == TextSearch.ResultCode.e_found)
{
hlts.Begin(doc);
double[] box = null;
string temp = result_str;
while (hlts.HasNext())
{
box = hlts.GetCurrentQuads();
if (box.Length != )
{
hlts.Next();
continue;
}
result.Add(new PdfString(result_str, new Rect(box[], box[], box[], box[]), page_num));
hlts.Next();
}
}
else if (code == TextSearch.ResultCode.e_done)
{
break;
}
}
return result;
}
public List<PdfString> RegexExtractByPositionWithPage(PDFDoc doc, string pattern, int pageIndex, Rect rect, PositionRect positionRect = PositionRect.Y2, double range = 2.0)
{
return GetNearbyPdfString(RegexSearchByPage(doc, pattern, pageIndex), rect, positionRect, range);
}
public List<PdfString> GetNearbyPdfString(List<PdfString> pdfStringAll, Rect rect, PositionRect positionRect, double range)
{
List<PdfString> pdfStringFilter = new List<PdfString>();
foreach (var pdf in pdfStringAll)
{
if (pdf == null)
continue;
if (GetRange(pdf.Position, rect, positionRect) > range)
continue;
pdfStringFilter.Add(pdf);
}
PdfString.PdfStringComparer comparerType = PdfString.GetComparer();
if (positionRect.Equals(PositionRect.Y2) || positionRect.Equals(PositionRect.Y1))
comparerType.WhichComparison = PdfString.PdfStringComparer.ComparisonType.Horizontal;
else if (positionRect.Equals(PositionRect.X1) || positionRect.Equals(PositionRect.X2))
comparerType.WhichComparison = PdfString.PdfStringComparer.ComparisonType.Vertical;
pdfStringFilter.Sort(comparerType);
return pdfStringFilter;
}
private double GetRange(Rect pdf, Rect title, PositionRect positionRect)
{
switch (positionRect)
{
case PositionRect.X1:
return Math.Abs(pdf.x1 - title.x1);
case PositionRect.X2:
return Math.Abs(pdf.x2 - title.x2);
case PositionRect.Y1:
return Math.Abs(pdf.y1 - title.y1);
case PositionRect.Y2:
return Math.Abs(pdf.y2 - title.y2);
default:
throw new Exception("calculation range of pdfstring with title error.");
}
}
public List<PdfString> RegexExtractByPositionWithAllPage(PDFDoc doc, string pattern, Rect rect, PositionRect positionRect = PositionRect.Y2, double range = 2.0)
{
return GetNearbyPdfString(RegexSearchAllPages(doc, pattern), rect, positionRect, range);
}
public List<PdfString> RegexExtractByPositionWithRangePage(PDFDoc doc, string pattern, int startPage, int endPage, Rect rect, PositionRect positionRect = PositionRect.Y2, double range = 2.0)
{
return GetNearbyPdfString(RegexSearchByPageRange(doc, pattern, startPage, endPage), rect, positionRect, range);
}
}
注释:
1.RegexSearchAllPages、RegexSearchByPageRange、RegexSearchByPage由方法名可知通过正则表达式得到搜索的 PdfString结果集合。
2.RegexExtractByPositionWithPage、RegexExtractByPositionWithAllPage、RegexExtractByPositionWithRangePage由方法名只知根据传入坐标和误差范围或者每一行或者每列的排序后数据集合。
PDF数据提取------2.相关类介绍的更多相关文章
- PDF数据提取------3.解析Demo
1.PDF中文本字符串格式中关键值信息抓取(已完成) 简介:这种解析比较传统最简单主要熟练使用Regular Expression做语义识别和验证.例如抓取下面红色圈内关键信息 string mett ...
- 大数据及hadoop相关知识介绍
一.大数据的基本概念 1.1什么是大数据 互联网企业是最早收集大数据的行业,最典型的代表就是Google和百度,这两个公司是做搜索引擎的,数量都非常庞大,每天都要去把互联网上的各种各样的网页信息抓取下 ...
- I/O---BufferedInputStream及相关类介绍
关于BufferedInputStream 是java提供的具有缓存作用的字节输入流.与之对应的还有BufferedOutStream 和 BufferedRead 和BufferedWriter 这 ...
- scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium
今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...
- Util应用程序框架公共操作类(一):数据类型转换公共操作类(介绍篇)
本系列文章将介绍一些对初学者有帮助的辅助类,这些辅助类本身并没有什么稀奇之处,如何能发现需要封装它们可能更加重要,所谓授之以鱼不如授之以渔,掌握封装公共操作类的技巧才是关键,我会详细说明创建这些类的动 ...
- VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)
前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将& ...
- VS2010-MFC(对话框:属性页对话框及相关类的介绍)
转自:http://www.jizhuomi.com/software/164.html 一 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过 ...
- MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)
前面讲了模态对话框和非模态对话框,本节来将一种特殊的对话框--属性页对话框. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面 ...
- SQL Server数据库读取数据的DateReader类及其相关类
之前学了几天的SQL Server,现在用C#代码连接数据库了. 需要使用C#代码连接数据库,读取数据. 涉及的类有: ConfigurationManage SqlConnection SqlCom ...
随机推荐
- CentOS 7 中firewall-cmd命令
在 CentOS 7 暂时开放 ftp 服务# firewall-cmd --add-service=ftp 永久开放 ftp 服务# firewall-cmd --add-service=ftp - ...
- Android 怎么使用Bitmap+Canvas 自适应屏幕
我们可以使用Matrix 来放缩我们得到的Bitmap 从而使我们的BItmap适应我们的手机屏幕 首先我们得先获取我们的手机屏幕的大小 WindowManager wm = (WindowManag ...
- JBOSS内存溢出处理
JBOSS内存溢出处理 前几天公司一个项目的服务器坏了,就换了一个备份服务器顶替一下,但是没有跑一会就宕机了,一直报java.lang.OutOfMemoryError....一看到这里,就知道是内存 ...
- JavaScript获取DOM元素位置和尺寸大小
在一些复杂的页面中经常会用JavaScript处理一些DOM元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽略的一部分,要想写出预想效果的JavaScri ...
- MYSQL数据库错误代码提示汇总
Mysql出错代码表 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1 ...
- Activity 跳转动画 全局定义
定义application 的 theme <application android:allowBackup="true" android:icon="@drawa ...
- linux系统执行多条命令,linux系统执行复合命令
在操作linux系统的时候,你是否遇到过打开一个目录,然后查看一个文件里面的内容. 我们可以使用命令 cd + 目录 cat + 文件名,我们需要输入两次,点击两次 enter 有没有 ...
- Android 用户界面---拖放(Drag and Drop)(三)
设计拖放操作 本节主要内容如下: 1. 如何开始拖拽: 2. 在拖拽期间如何响应事件: 3. 如何响应落下事件: 4. 如何结束拖放操作. 开始拖拽 用户使用一个拖拽手势开始拖拽,通常是在 ...
- HDU 4513 吉哥系列故事——完美队形II
变形的Manacher算法,在扩展的时候要加入限制条件,满足题目中说的从左到中间身高不减. 其他地方倒是没有什么改动.. //#define LOCAL #include <iostream&g ...
- hdu 4647 Another Graph Game
题意: 有N个点,M条边. 点有权值, 边有权值. Alice, Bob 分别选点. 如果一条边的两个顶点被同一个人选了, 那么能获得该权值.问 Alice - Bob? 链接:http://acm. ...