




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用PDFBox处理PDF文档 在本书的前面所介绍的内容中,所处理的都是纯文本文件。但是事实上,人们用于保存信息的文件并不是纯文本格式。现在比较流行的文件存储格式有Adobe公司的PDF和Microsoft的Word、Excel等。在处理这些文件的时候,不能简单的从文件读取字符,需要根据他们特殊的格式提取内容。本章就将对比较流行的PDF、Word和Excel格式的处理工具逐一进行介绍。7.1 使用PDFBox处理PDF文档PDF全称Portable Document Format,是Adobe公司开发的电子文件格式。这种文件格式与操作系统平台无关,可以在Windows、Unix或Mac OS等操作系统上通用。PDF文件格式将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。如果要抽取其中的文本信息,需要根据它的文件格式来进行解析。幸好目前已经有不少工具能帮助我们做这些事情。7.1.1 PDFBox的下载最常见的一种PDF文本抽取工具就是PDFBox了,访问网址/projects/pdfbox/,进入如图7-1所示的下载界面。图7-1 PDFBox的下载页面读者可以在该网页下载其最新的版本。本书采用的是PDFBox-0.7.3版本。PDFBox是一个开源的Java PDF库,这个库允许你访问PDF文件的各项信息。在接下来的例子中,将演示如何使用PDFBox提供的API,从一个PDF文件中提取出文本信息。7.1.2 在Eclipse中配置以下是在Eclipse中创建工程,并建立解析PDF文件的工具类的过程。(1)在Eclipse的workspace中创建一个普通的Java工程:ch7。(2)把下载的PDFBox-0.7.3.zip解压,解压后的目录结构如图7-2所示。图7-2 解压后的PDFBox包(3)进入external目录下,可以看到,这里包括了PDFBox所有用到的外部包。复制下面的Jar包到工程ch7的lib目录下(如还未建立lib目录,则先创建一个)。l bcmail-jdk14-132.jarl bcprov-jdk14-132.jarl checkstyle-all-4.2.jarl FontBox-0.1.0-dev.jarl lucene-core-2.0.0.jar然后再从PDFBox的lib目录下,复制PDFBox-0.7.3.jar到工程的lib目录下。(4)在工程上单击右键,在弹出的快捷菜单中选择“Build Path-Config Build Path-Add Jars”命令,把工程lib目录下面的包都加入工程的Build Path。笔者机器上完整的工程目录如图7-3所示:图7-3 工程截图7.1.3 使用PDFBox解析PDF内容在刚刚创建的Eclipse工程中,创建一个ch7.pdfbox包,并创建一个PdfboxTest类。该类包含一个getText方法,用于从一个PDF中获取文本信息,其代码如下。代码7.1public void geText(String file) throws Exception / 是否排序 boolean sort = false;/ pdf文件名 String pdfFile = file;/ 输入文本文件名称 String textFile = null;/ 编码方式 String encoding = UTF-8;/ 开始提取页数 int startPage = 1;/ 结束提取页数 int endPage = Integer.MAX_VALUE;/ 文件输入流,生成文本文件 Writer output = null;/ 内存中存储的PDF Document PDDocument document = null;try try / 首先当作一个URL来装载文件,如果得到异常再从本地文件系统/去装载文件 URL url = new URL(pdfFile); document = PDDocument.load(url); / 获取PDF的文件名 String fileName = url.getFile(); / 以原来PDF的名称来命名新产生的txt文件 if (fileName.length() 4) File outputFile = new File(fileName.substring(0, fileName.length() - 4) + .txt); textFile = outputFile.getName(); catch (MalformedURLException e) / 如果作为URL装载得到异常则从文件系统装载 document = PDDocument.load(pdfFile); if (pdfFile.length() 4) textFile = pdfFile.substring(0, pdfFile.length() - 4) + .txt; / 文件输入流,写入文件倒textFile output = new OutputStreamWriter(new FileOutputStream(textFile), encoding); / PDFTextStripper来提取文本 PDFTextStripper stripper = null; stripper = new PDFTextStripper();/ 设置是否排序 stripper.setSortByPosition(sort);/ 设置起始页 stripper.setStartPage(startPage);/ 设置结束页 stripper.setEndPage(endPage);/ 调用PDFTextStripper的writeText提取并输出文本 stripper.writeText(document, output); finally if (output != null) / 关闭输出流 output.close(); if (document != null) / 关闭PDF Document document.close(); 在上面的代码中,getText方法接收一个String类型的参数,指定要提取的PDF文件路径。这个位置可以是一个URL或本地文件。然后函数调用PDFBox提供的PDFTextStripper类,设置提取过程中的一些属性(如起始页、是否排序等)。最后将文本提取并写入文件。7.1.4 运行效果下面看一下这个函数的运行效果,在PdfboxTest加入一个main函数,其代码如下。public static void main(String args) PdfboxTest test = new PdfboxTest(); try / 取得C盘下的index.pdf的内容 test.geText(C:index.pdf); catch (Exception e) e.printStackTrace(); 这里要处理一个index.pdf文件,该PDF文件的内容如图7-4所示。图7-4 要解析的PDF文档内容通过PdfboxTest处理后的文本文件如图7-5所示。图7-5 处理的结果可以看到,PDF中的文本已经被提取出来,保存于文本文件中了。其中第4行的超链接部分“POI News WebBlog”,在文本文件中已经被替换成了普通的纯文本。读者可以根据PDFBox所提供的API文档进一步查询其他功能。7.1.5 与Lucene的集成PDFBox还提供和Lucene的集成,它提供了一套简单的方法把PDF Documents加入到Lucene的索引中去,请看以下代码:Document lucenedocument = LucenePDFDocument.getDocument();其中,LucenePDFDocument是PDFBox中提供的一个类,它的getDocument被重载为3个方法,分别接收一个File对象、InputStream对象或者URL对象作为参数,然后从该参数传递进来的PDF文件中,提取并生成Lucene的Document对象。当通过PDFBox从一个PDF文档中得到一个Lucene Document后,可以直接使用IndexWriter把它加到Lucene的index中。LucenePDFDocument自动从PDF文件中提取各种元数据Field,并把它们加入到Document中。它提取的信息如表7-1所示。表7-1 PDFBox生成的Lucene Document格式Lucene Field名称说明path文件系统路径(如果文档是从文件装载)urlURL地址(如果文档是从网络装载)contents整个Document的内容,索引但不存储summaryDocument的内容前500个字符modified最后修改时间uidDocument的惟一IDCreationDate从PDF的meta-data获取Creator从PDF的meta-data获取Keywords从PDF的meta-data获取ModificationDate从PDF的meta-data获取Producer从PDF的meta-data获取Subject从PDF的meta-data获取Trapped从PDF的meta-data获取下面通过LucenePDFDocument,直接对PDF建立索引,在ch7.pdfbox包下面新建一个PdfLuceneTest类,该类的代码如下。代码7.2public class PdfLuceneTest public static void main(String args) try / IndexWriter存放索引到d:index下 IndexWriter writer = new IndexWriter(d:index, new StandardAnalyzer(), true); / LucenePDFDocument返回由PDF产生的Lucene Docuement Document d = LucenePDFDocument .getDocument(new File(C:index.pdf); / 写入索引 writer.addDocument(d); / 关闭索引文件流 writer.close(); / 读取d:index下的索引文件建立IndexSearcher IndexSearcher searcher = new IndexSearcher(d:index); / 对索引的contents Field进行查找关键词poi Term t = new Term(contents, poi); / 根据Term生成Query Query q = new TermQuery(t); / 搜索返回结果集 Hits hits = searcher.search(q); / 打印结果集 for (int i = 0; i hits.length(); i+) System.out.println(hits.do
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甲状腺癌CT课件
- 田径裁判基础知识培训
- 人生与哲学教学课件
- 8减几课件教学
- 河南省南阳市九师联盟2024-2025学年高二下学期6月期末考试化学试题(含答案)
- 新解读《GB-T 35019-2018全断面隧道掘进机 泥水平衡盾构机》
- 用气安全知识培训课件记录
- 用心陪伴-静待花开课件
- 生物安全知识培训目的课件
- 急性酒精中毒胃黏膜保护护理查房
- 平面设计表现技法(手绘·数字化)全套完整教学课件
- 2023年基层卫生岗位练兵和技能竞赛试题及答案全科医疗组
- 心肺复苏及AED的使用
- 中国石油大学工程流体力学教案
- 真空带式干燥机3Q验证文件模板
- 职工医疗互助保障计划、女职工安康互助保障计划互助金申请表
- 宾馆饭店消防安全排查整治标准
- YC/T 507-2014烟草测土配方施肥工作规程
- NB-T 10935-2022 除氧器技术条件
- GB/T 13331-2014土方机械液压挖掘机起重量
- 淹溺急救与护理ppt
评论
0/150
提交评论