赞
踩
Apache Tika是一个多功能的文档内容提取工具,可以提取多种类型的文档内容,常用的如pdf、office等格式。网上的例子基本上都是提取整篇文档内容,实际上用Tika提取pdf等文档的内容主要场景多半是给搜索引擎提供更精细化的搜索推荐,需要按页面或段落方式进行内容提取。
仔细研究了Tika的开发文档,实际上还是可以有一些办法实现pdf文档的分页内容提取的。
ToXMLContentHandler
,将pdf转换为xml文档,解析分页符从ToXMLContentHandler派生一个分页内容解析器,实现startElement、endElement和character方法。
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 parser PDFParser 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 document System.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======= 李白 白,字太白。母梦长庚星而生。通诗书,喜纵横术,击剑为任侠。天宝 初,贺知章言于玄宗,有诏供奉翰林,因失意于贵妃,赐金放还。禄山反, 永王璘节度东南,迫致之。及璘败,白坐系浔阳狱,流夜郎,以赦得释。代 宗以左抬遗召,而自已卒,年六十四。 下终南山过斛斯山人宿置酒① 暮从碧山下, 山月随人归。 却顾所来径, 苍苍横翠微②。 相携及田家, 童推开荆扉③。 绿竹入幽径, 青萝拂行衣。 欢言得所慈④,美酒聊共挥⑤。 长歌吟松风⑥,曲尽河星稀。 我醉君复乐, 陶然共忘机⑦。 ①[终南山]《元和郡县志》,终南山在雍州万年县南五十里。《太平寰 字记》:终南山在郿县南三十里,《雍录》:终南山横亘关南面,西起秦陇, 东彻蓝田,凡雍;岐、郿、鄂、长安、万年,相去且八百里,而连峙据其南 看,皆此一山也。《一统志》:终南山在西安府南五十里。[料斯]《通志·氏 族略》:代北复姓有斜斯氏,其先居广牧,世袭勿莫大人号,斛斯部因氏焉。 ②[翠微]《尔雅》:山未及上翠微。疏谓: 未及顶上,在旁陂陀之处名翠微。 一说山气青缥色,故曰翠微也。③[ 荆扉] 沈约诗:荆扉且新故。李周翰注: 荆扉,以荆为扉也。④[ 所慈]《诗·召南》:召伯所憩。注:憩,音器,息 也。⑤[共挥]《曲礼》:饮玉爵者弗挥,注:振去余酒曰挥。③[松凤]《风 俗通》:河间杂歌二十一章,内有《风入松》曲。⑦[陶然] 陶潜诗:挥兹一 觞,陶然自乐。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。