Apache Tika 实现pdf文档分页提取内容

Apache Tika是一个多功能的文档内容提取工具,可以提取多种类型的文档内容,常用的如pdf、office等格式。网上的例子基本上都是提取整篇文档内容,实际上用Tika提取pdf等文档的内容主要场景多半是给搜索引擎提供更精细化的搜索推荐,需要按页面或段落方式进行内容提取。
仔细研究了Tika的开发文档,实际上还是可以有一些办法实现pdf文档的分页内容提取的。

基本思路是利用ToXMLContentHandler,将pdf转换为xml文档,解析分页符

从ToXMLContentHandler派生一个分页内容解析器,实现startElement、endElement和character方法。

  • 利用startElement解析xml内容,检测分页符,按页面将内容分组放到map中记录下来;
  • 检测分页结束符,覆盖endElement方法,实际上xml是成对的,实际上没有用;
  • 覆盖character方法,将页面内容写入到对应的map中,这里有关换行符的处理可以根据需要调整;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.ToXMLContentHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;public class PageContentHandler extends ToXMLContentHandler {private String pageTag = "div";private String pageClass = "page";private int pageNumber = 0;private Map<Integer,StringBuilder> pageMap;public PageContentHandler(){super();pageMap = new HashMap<>();}private void startPage() {pageNumber++;pageMap.put(pageNumber,new StringBuilder());}private void endPage() {}public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {if(pageTag.equals(qName) && pageClass.equals(atts.getValue("class"))){startPage();}}public void endElement(String uri, String localName, String qName) throws SAXException {if(pageTag.equals(qName)){endPage();}}public void characters(char[] ch, int start, int length) throws SAXException {if(length > 0 && pageNumber > 0){if(ch.length == 1 && ch[0] == '\n'){return;}pageMap.get(pageNumber).append(ch);
//            pageMap.get(pageNumber).append('\n');}}public static void main(String[] args) throws Exception{PageContentHandler handler = new PageContentHandler();Metadata metadata = new Metadata();FileInputStream inputstream = new FileInputStream(new File("d:/唐诗三百首.pdf"));ParseContext pcontext = new ParseContext();//parsing the document using PDF parserPDFParser pdfparser = new PDFParser();pdfparser.parse(inputstream, handler, metadata,pcontext);//getting the content of the document by pages.for(Map.Entry<Integer,StringBuilder> entry:handler.pageMap.entrySet()){System.out.println("======Page " + entry.getKey() + "=======");System.out.println(entry.getValue().toString());}//getting metadata of the documentSystem.out.println("Metadata of the PDF:");String[] metadataNames = metadata.names();for(String name : metadataNames) {System.out.println(name+ " : " + metadata.get(name));}}
}

测试效果

解析如下的《唐诗三百首》pdf文件:

输出效果:

唐诗三百首======Page 2=======
唐诗三百首补注卷一五言古诗张九龄九龄,字子寿,韶州曲江人。七岁如属文,擢进士,始调校书郎。玄宗
即位,迁右补阙,进中书侍郎。母丧夺哀,拜同平章事。卒,谥文献。感  遇《唐音》注:感遇云者,
谓有感于心而寓于言,以摅其意也。
兰叶春葳蕤①,桂华秋皎洁。
欣欣此生意②,白尔为佳节③。
谁知林栖者④,闻风坐相悦。
草木有本心⑤,何求美人拆。①[葳蕤]《字典》:蕤,儒佳切,音甤,《说文》:草木华垂貌。王
粲诗:吴天降丰泽,百卉挺葳蕤。②[欣欣]陶潜《归去来辞》,木欣欣以
向荣,泉涓涓而始流。[生意]《世说》:桓玄败后,殷仲文还为大司马咨
议,意似二三,非复往日。大司马厅前有一老槐,甚扶疏。殷因月朔与众在
厅,视槐良久,叹曰:“槐树婆姿,无复生意。”③[佳节]曹植表:一阳
佳节。④[林栖]曹毗对:儒不追林栖之迹,不希抱鳞之尤。⑤[本心]《魏
志·管宁传》:岂自遭之而违本心哉?
江南有丹橘,经冬犹绿材①。
岂伊地气暖,  白有岁寒心②。
可以荐嘉客③,奈何阻重深④。
运命唯所遇⑤,循环不可寻⑥。
徒言树桃李,此木岂无阴⑦。
①[江南丹橘]《楚辞》,后皇嘉树,橘徕服兮。受命不迁,生南国兮。
王逸注:橘受天命生于南国。《吴都赋》:其果则丹橘余甘,荔枝之林。[经
冬绿]李尤《七叹》:梁土清生,卢橘是生。白华绿叶。扶疏冬荣。②[地
气暖]《周礼·冬官》:橘逾淮而北为枳,此地气然也。曹植《橘赋》:背
江洲之暖气。[岁寒]《论语》:岁寒,然后知松柏之后凋也。李元操《咏
橘》诗:能守岁寒心。③[嘉客]《诗经》:所谓伊人,于焉嘉客。刘帧诗:
�藻生其涯,华叶纷优溺。采之荐宗庙,可以羞嘉客,④[重深]《鲁灵光
殿赋》:东序重深而奥秘。⑤[运命]李康论:夫洽乱,运也;穷达,命也。
⑥[循环]《史记·高祖纪·赞》:三王之道若循环,终而复始。谢灵运诗:
四时循环转,寒暑自相承。⑦[无阴]《吴都赋》:椰叶无阴。《韩诗外传》:
春树桃李,夏得阴其下,秋得食其实。======Page 3=======
李白白,字太白。母梦长庚星而生。通诗书,喜纵横术,击剑为任侠。天宝
初,贺知章言于玄宗,有诏供奉翰林,因失意于贵妃,赐金放还。禄山反,
永王璘节度东南,迫致之。及璘败,白坐系浔阳狱,流夜郎,以赦得释。代
宗以左抬遗召,而自已卒,年六十四。下终南山过斛斯山人宿置酒①暮从碧山下,  山月随人归。
却顾所来径,  苍苍横翠微②。
相携及田家,  童推开荆扉③。
绿竹入幽径,  青萝拂行衣。
欢言得所慈④,美酒聊共挥⑤。
长歌吟松风⑥,曲尽河星稀。
我醉君复乐,  陶然共忘机⑦。
①[终南山]《元和郡县志》,终南山在雍州万年县南五十里。《太平寰
字记》:终南山在郿县南三十里,《雍录》:终南山横亘关南面,西起秦陇,
东彻蓝田,凡雍;岐、郿、鄂、长安、万年,相去且八百里,而连峙据其南
看,皆此一山也。《一统志》:终南山在西安府南五十里。[料斯]《通志·氏
族略》:代北复姓有斜斯氏,其先居广牧,世袭勿莫大人号,斛斯部因氏焉。
②[翠微]《尔雅》:山未及上翠微。疏谓: 未及顶上,在旁陂陀之处名翠微。
一说山气青缥色,故曰翠微也。③[ 荆扉] 沈约诗:荆扉且新故。李周翰注:
荆扉,以荆为扉也。④[ 所慈]《诗·召南》:召伯所憩。注:憩,音器,息
也。⑤[共挥]《曲礼》:饮玉爵者弗挥,注:振去余酒曰挥。③[松凤]《风
俗通》:河间杂歌二十一章,内有《风入松》曲。⑦[陶然] 陶潜诗:挥兹一
觞,陶然自乐。

利用Apache Tika分页解析pdf文件内容相关推荐

  1. java利用apache pdfbox工具裁剪PDF文件

    java利用apache pdfbox工具裁剪PDF文件 一.导入apache pdfbox工具jar包 maven仓库导入工具包 <dependency><groupId>o ...

  2. python 读取文件读出来是什么格式-深入学习python解析并读取PDF文件内容的方法...

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  3. python中读取文件内容-深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  4. python读取pdf文件_深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  5. java 实现在线编辑本地pdf文件内容

    功能描述:将pdf文件上传到服务器,然后服务器读取上传的pdf文件内容,然后渲染到在线富文本中,再然后在富文本中修改完毕点击保存,再将上传的pdf文件内容修改为在线富文本中的内容 1.实现将PDF文件 ...

  6. python怎么读取pdf文件_Python解析并读取PDF文件内容的方法

    本文实例讲述了Python解析并读取PDF文件内容的方法.分享给大家供大家参考,具体如下: 一.问题描述 利用python,去读取pdf文本内容. 二.效果 三.运行环境 python2.7 四.需要 ...

  7. 【python PDF解析】python 读取PDF文件内容

    一.问题描述 利用python,去读取pdf文本内容. 二.效果 三.运行环境 python2.7 四.需要安装的库 pip install pdfminer 五.实现源代码 代码1(win64) # ...

  8. [299]python实现批量解析PDF文件提取内容并写入到Excel中

    摘要:最近需要将一批PDF文件中的某些数据整理到Excel中,因为文件数量接近20w+,手动更新几乎不现实,于是就提取关键词和内容动手写了个Python小工具,以实现自动完成上述目标. 要求: 读取P ...

  9. Java实现读取pdf文件内容(how to read pdf in java)

    本文将利用pdfbox实现pdf文件内容的读取. 环境: 1. eclipse oxygen 2. maven 3.3 3. jdk 1.8 1.通过eclipse创建maven项目,最终项目目录如下 ...

  10. PyPDF2读取PDF文件内容保存到本地TXT

    利用PyPDF2读取PDF文件内容保存到本地TXT from PyPDF2.pdf import PdfFileReader import pandas as pddef Pdf_to_txt(pdf ...

最新文章

  1. Linux学习 Unit 4
  2. ASP.NET跨页面传值(二)
  3. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
  4. Feature Flag 功能发布控制
  5. Python笔记-假设检验之双样本T检验(两样本是否相似)
  6. 【车间调度】基于matlab多层编码遗传算法求解车间调度问题【含Matlab源码 035期】
  7. java文件转码工具-native2ascii.exe命令简介
  8. 计算机学院实习报告3000字(Java开发实习)--持续更新中,多个专业,以及版本
  9. 墓碑上的字符C语言,墓碑上的故显考、故显妣、先考、先妣都是什么意思
  10. [渝粤教育] 四川大学 土木工程概论 参考 资料
  11. 2021,我的海内外博士申请总结!
  12. docker的使用方法
  13. 双击xmind文件没反应
  14. 判断字符串是否相等StringUtils.equals和String.equals
  15. 文本安装everest linux
  16. 没有市场份额,Linux又如何赢得了天下?
  17. ADAS系统传感器应该如何布置?
  18. Docker部署Sonarqube
  19. Excel IF 多层条件判断函数语句
  20. 【IoT】RC522 读取 NFC 卡 SN 号

热门文章

  1. 如何解决移动端 Retina 屏 1px 像素问题 ?
  2. 【PS技巧】如何拼图
  3. 怎么定位前后端问题之-图片显示不出来显示空白等
  4. JDBC获取数据库(mysql)四种连接方式(connection)
  5. Vue中@click.stop与@click.prevent、@click.native
  6. c++实验3——个人税收计算器
  7. Kernel那些事儿之内存管理(6) --- 衣带渐宽终不悔(下)
  8. 迟到的Meltdown/Spectre分析
  9. ansys linux卸载干净,怎么把ansys删除干净
  10. 漫话:如何给女朋友解释灭霸的指响并不是真随机消灭半数宇宙人口的?