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)的更多相关文章

  1. c#抽取pdf文档标题——前言

    由于工作的需要,研究c#抽取pdf文档标题有3个月了.这项工作是一项"伟大而艰巨"的任务.应该是我目前研究工作中最长的一次.我觉得在长时间忙碌后,应该找些时间,把自己的心路历程归纳 ...

  2. c#抽取pdf文档标题(1)

    首先看看我的项目结构: 从上面的结果图中,我们可以看出,主要用了两个库:itextsharp.dll 和 pdfbox-1.8.9.dll,dll文件夹存放引用的库,handles文件夹存放抽取的处理 ...

  3. c#抽取pdf文档标题(3)

    上一篇介绍了整体流程以及利用库读取pdf内容形成字符集合.这篇着重介绍下,过滤规则,毕竟我们是使用规则过滤,最后得到标题的. 首先看归一化处理,什么是归一化呢?就是使结果始终处于0-1之间(包括0,1 ...

  4. c#抽取pdf文档标题(4)——机器学习以及决策树

    我的一位同事告诉我,pdf抽取标题,用机器学习可以完美解决问题,抽取的准确率比较高.于是,我看了一些资料,就动起手来,实践了下. 我主要是根据以往历史块的特征生成一个决策树,然后利用这棵决策树,去判断 ...

  5. Python处理Excel和PDF文档

    一.使用Python操作Excel Python来操作Excel文档以及如何利用Python语言的函数和表达式操纵Excel文档中的数据. 虽然微软公司本身提供了一些函数,我们可以使用这些函数操作Ex ...

  6. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  7. 将w3cplus网站中的文章页面提取并导出为pdf文档

    最近在看一些关于CSS3方面的知识,主要是平时看到网页中有很多用CSS3实现的很炫的效果,所以就打算系统的学习一下.在网上找到很多的文章,但都没有一个好的整理性,比较凌乱.昨天看到w3cplus网站中 ...

  8. PDF2SWF转换只有一页的PDF文档,在FlexPaper不显示解决方法

    问题:PDF2SWF转换只有一页的PDF文档,在FlexPaper不显示! FlexPaper 与 PDF2SWF 结合是解决在线阅读PDF格式文件的问题的,多页的PDF文件转换可以正常显示,只有一页 ...

  9. 【PDF】java使用Itext生成pdf文档--详解

    [API接口]  一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/ ...

随机推荐

  1. [bzoj2286][Sdoi 2011]消耗战

    [bzoj2286]消耗战 标签: 虚树 DP 题目链接 题解 很容易找出\(O(mn)\)的做法. 只需要每次都dp一遍. 但是m和n是同阶的,所以这样肯定会T的. 注意到dp的时候有很多节点是不需 ...

  2. img alt与title的区别

    前端 alt是图片加载不出来时候,对图片的文本替代 title 是鼠标放在图片上时,对图片的进一步说明 seo 搜索引擎对图片意思的理解主要靠 alt

  3. [转载]LVS+Keepalived之三大模式

    LVS + Keepalived之三大模式 ============================================================================== ...

  4. 通过核心概念了解webpack工作机制

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gr ...

  5. the c programing language 学习过程5

    lumped 集成总结 mandating托管 consecutively连续地 contiguous临近的 mnemonic记忆力的 mimics 酷似 魔方 bind捆绑 synonym同义词 s ...

  6. Codeforces475D - CGCDSSQ

    Portal Description 给出长度为\(n(n\leq10^5)\)的序列\(\{a_n\}\),给出\(q(q\leq3\times10^5)\)个\(x\),对于每个\(x\),求满足 ...

  7. typeahead + JDK 8 并行流 + redis 高速即时查询.

    感谢JDK8,让我们JAVA 程序员暂时不用担心失业. 有些情况,需要根据用户输入值,即时查询数据库,MYSQL显然不再适合这种业务. mongoDB看似最适合,但是为了这么一个破功能,也不值得特意去 ...

  8. 运行web项目端口占用问题

    ---恢复内容开始--- 有时候运行web项目会提示8080端口已经被占用这一类问题(Error running Tomcat8: Address localhost:1099 is already ...

  9. Oracle 11g数据库安装和卸载教程

    Oracle11g的安装教程 同时解压缩两个zip文件,生成一个database文件夹,进入到database文件夹,点击setup 去掉安全更新的选项,直接下一步 选择创建和配置数据库,点击下一步 ...

  10. linux 分布式文件系统

    分布式文件系统(DFS) 指文件系统管理的物理存储资源不一定直接连接在本地节点上 而是通过计算机网络与节点相连 分布式文件系统的设计基于客户机/服务器模式 一个典型的网络可能包括多个多个用户访问的服务 ...