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. node.js简单搭建服务,访问本地站点文件

    1.安装nodejs服务(从官网下载安装),node相当于apache服务器 2.在自己定义的目录下新建服务器文件如 server.js 例如,我在D:\nodeJs下创建了server.js文件 v ...

  2. C. Vasya and String

    原题链接 C. Vasya and String High school student Vasya got a string of length n as a birthday present. T ...

  3. CodeForces-748B

    关键在于判断是否能够得到解决办法,我的思路就是用一个数组来记录每个小写字母对应的按键,如果它出现对应两个级以上不同的按键那么就说明不能得出解决办法,直接打印'-1'.如果能够得出解决办法,就扫描一下数 ...

  4. 使用line_profiler查看api接口函数每行代码执行时间

    项目情景描述: 在restful架构风格的项目交付测试的过程中,某接口出现 请求超时导致的http 502 Bad Gateway,于是开始排查具体是接口函数中的哪行代码或函数 响应时间过长导致的50 ...

  5. OpenStack Ironic 常见问题

    whole disk和partition 镜像 whole disk镜像部署可以支持windows,但是不能自定义分区(可以通过cloud-init实现),分区表是做镜像的人确定好的,partitio ...

  6. jVM笔记4-对象的结构

    1.对象的结构有: 1.Header(对象头),其组成主要有两部分: 1.自身运行时的数据(Mark Word),包括: 1.哈希值 2.GC分代年龄. 3.锁状态标志 4.线程所持有的锁 5.偏向线 ...

  7. 获得某个月的天数(java, mysql, oracle)

    java方式: Calendar   cal   =   Calendar.getInstance(); cal.set(Calendar.YEAR,year); cal.set(Calendar.M ...

  8. R︱Rstudio 1.0版本尝鲜(R notebook、下载链接、sparkR、代码时间测试profile)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 2016年11月1日,RStudio 1.0版 ...

  9. dedecms 使用自由列表实现首页列表分页

  10. R语言︱文件读入、读出一些方法罗列(批量xlsx文件、数据库、文本txt、文件夹)

    笔者寄语:小规模的读取数据的方法较为简单并且多样,但是,批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入. R语言中还有一些其他较为普遍的读入,比如代码包,R文件,工作 ...