c#抽取pdf文档标题(2)
public class IETitle
{
public static List<WordInfo> WordsInfo = new List<WordInfo>(); private static string pdfcontent;
public static HandleResult GetTitle(string path, string realtitle)
{
WordsInfo.Clear(); string content = string.Empty;
try
{
content = ITextSharpLib.ExtractTextFromPdf(path);
}
catch
{
try
{
content = PDFBoxLib.Pdf2txt(path);
}
catch (Exception ex)
{ }
} pdfcontent = content; PDFBoxLib.HandleContent(path); //处理字符 Word w = new Word();
w.MakeWord(WordsInfo); Line line = new Line();
line.MakeLine(w); //处理行
Block block = new Block();
block.MakeBlock(line); //获取全部的文本
string text = string.Empty; try
{
text = ITextSharpLib.ExtractTextFromPdf(path, );
}
catch (Exception ex)
{
text = content;
} HandleResult title = new HandleResult() { Title = "" }; try
{
var sentences = text.Split('\n'); InfoExtract ie = new InfoExtract(sentences, text); title = ie.ExtractTitle(block, realtitle); }
catch (Exception ex)
{
Logger.Debug(ex.Message);
} return title;
}
}
上面就是获取标题的整体逻辑代码。29行,是调用pdfboxLib,读取pdf第一页内容:
public static string HandleContent(string fileName, int pageIndex = )
{
try
{
PDDocument document = null;
try
{
document = PDDocument.load(fileName);
List allPages = document.getDocumentCatalog().getAllPages(); int size = pageIndex == ? allPages.size() : ; for (int i = ; i < size; i++)
{
var page = (PDPage)allPages.get(i); var contents = page.getContents(); PrintTextLocatins2 printer = new PrintTextLocatins2(); if (contents != null)
{
printer.processStream(page, page.findResources(), page.getContents().getStream());
}
}
}
catch (Exception ex)
{
}
finally
{
if (document != null)
{
document.close();
}
}
}
catch (Exception ex)
{ }
return "";
}
第23行 printer.processStream方法,会触发自定义类PrintTextLocation2类中的字符处理方法 processTextPosition:
public class PrintTextLocatins2 : PDFTextStripper
{
private static int BOLD_F_NUM = ;
private static String[] BOLD_FLAGS = { "Bold", "CAJ FNT04" };
private static int ITALIC_F_NUM = ;
private static String[] ITALIC_FLAGS = { "Italic", "CAJ FNT03" }; private static bool IsBold(String font)
{
int i;
for (i = ; i < BOLD_F_NUM; i++)
if (font.Contains(BOLD_FLAGS[i]))
return true;
return false;
} private static bool IsItalic(String font)
{
int i;
for (i = ; i < ITALIC_F_NUM; i++)
if (font.Contains(ITALIC_FLAGS[i]))
return true;
return false;
} public PrintTextLocatins2()
{
base.setSortByPosition(false);
}
protected override void processTextPosition(TextPosition text)
{ WordInfo info = new WordInfo()
{
X = text.getX(),
Y = text.getY(),
XDirAdj = text.getXDirAdj(),
YDirAdj = text.getYDirAdj(),
FontSize = text.getFontSize(),
Xscale = text.getXScale(),
Yscale = text.getYScale(),
Height = text.getHeight(),
Space = text.getWidthOfSpace(),
Width = text.getWidth(), Subfont = text.getFont().getSubType(),
Basefont = text.getFont().getBaseFont(),
IsBold = IsBold(text.getFont().getBaseFont()),
IsItalic = IsItalic(text.getFont().getBaseFont()), XSize = (int)(text.getFontSize() * text.getXScale()), YSize = (int)(text.getFontSize() * text.getYScale()), Word = text.getCharacter()
}; if (info.Space.ToString() == "非数字")
{
info.Space = ;
} IETitle.WordsInfo.Add(info);
}
}
这样我们就利用pdfbox收集了pdf文档的字符信息。
c#抽取pdf文档标题(2)的更多相关文章
- c#抽取pdf文档标题——前言
由于工作的需要,研究c#抽取pdf文档标题有3个月了.这项工作是一项"伟大而艰巨"的任务.应该是我目前研究工作中最长的一次.我觉得在长时间忙碌后,应该找些时间,把自己的心路历程归纳 ...
- c#抽取pdf文档标题(1)
首先看看我的项目结构: 从上面的结果图中,我们可以看出,主要用了两个库:itextsharp.dll 和 pdfbox-1.8.9.dll,dll文件夹存放引用的库,handles文件夹存放抽取的处理 ...
- c#抽取pdf文档标题(3)
上一篇介绍了整体流程以及利用库读取pdf内容形成字符集合.这篇着重介绍下,过滤规则,毕竟我们是使用规则过滤,最后得到标题的. 首先看归一化处理,什么是归一化呢?就是使结果始终处于0-1之间(包括0,1 ...
- c#抽取pdf文档标题(4)——机器学习以及决策树
我的一位同事告诉我,pdf抽取标题,用机器学习可以完美解决问题,抽取的准确率比较高.于是,我看了一些资料,就动起手来,实践了下. 我主要是根据以往历史块的特征生成一个决策树,然后利用这棵决策树,去判断 ...
- Python处理Excel和PDF文档
一.使用Python操作Excel Python来操作Excel文档以及如何利用Python语言的函数和表达式操纵Excel文档中的数据. 虽然微软公司本身提供了一些函数,我们可以使用这些函数操作Ex ...
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- 将w3cplus网站中的文章页面提取并导出为pdf文档
最近在看一些关于CSS3方面的知识,主要是平时看到网页中有很多用CSS3实现的很炫的效果,所以就打算系统的学习一下.在网上找到很多的文章,但都没有一个好的整理性,比较凌乱.昨天看到w3cplus网站中 ...
- PDF2SWF转换只有一页的PDF文档,在FlexPaper不显示解决方法
问题:PDF2SWF转换只有一页的PDF文档,在FlexPaper不显示! FlexPaper 与 PDF2SWF 结合是解决在线阅读PDF格式文件的问题的,多页的PDF文件转换可以正常显示,只有一页 ...
- 【PDF】java使用Itext生成pdf文档--详解
[API接口] 一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/ ...
随机推荐
- Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包
1,问题详情:Spring使用4.3.5.Release版本后 在SpringMvc配置文件中配置json 解析器后出现报错信息 [org.springframework.web.context.Co ...
- mac清除某个端口的占用
lsof -i:8080查找某个应用的pid kill pid就可以了
- Spring boot 整合mybatis
第一步:创建maven项目并添加spring boot依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...
- 2018年最完整5大网页设计图标解决方案:Font Awesome奥森图Unicode、CSS 和、Font以及国产zfont图标集
网上有很多高质量的图标,基于icon的关键词能在Google上搜索到不少内容,不考虑版权外还要修改大小.颜色等等,现在介绍一些替代方案:Unicode.CSS 和 Font,它具有更高的灵活性. 方案 ...
- 剑指offer第四天
25.复杂链表的复制 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的 ...
- qt 使用msvc编译器出现乱码如何解决?字符串中存在空格?
开发环境: 1.win7 64位 2.qt版本 windows-x86-msvc2015-5.9.0 如何解决? 1.设置qt文件编码 设置 默认UTF-8 如果编码是 UTF-8 则添加. 2.使用 ...
- hihoCoder 1033 : 交错和 数位dp
思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0.注意,前缀是否为0是这道题的一 ...
- scrapy学习总结
1.为了配合XPath,Scrapy除了提供了 Selector 之外,还提供了方法来避免每次从response中提取数据时生成selector的麻烦 Selector有四个基本的方法(点击相应的方法 ...
- CEPH RGW 设置 user default_placement为ssd-placement,优化100KB-200KB小文件性能,使用户创建的bucket对象放置到 SSD设备的Pool上。
sudo radosgw-admin metadata get user:tuanzi > user.md.json vi user.md.json #to add ssd-placement ...
- mysql数据库 调优
mysql调优硬件配置网络带宽mysql运行参数慢查询日志网络架构多实例(一台服务器上运行多个数据库服务)分库分表 当一台数据库服务器处理客户端的请求慢时,可能是哪些原因造成? 硬件配置低:(内存 c ...