pdfbox 解析 PDF转HTML、Text文件
来源:互联网 发布:知乎经典问答搞笑 编辑:程序博客网 时间:2024/06/05 08:49
pdfbox 解析 PDF转HTML、Text文件 刚刚入职新公司,连公司项目都没看,就被总监叫做PDF文件转HTML文件,百度找了一下,发现连提供思路的都很少。最开始用pdf2htmlEX.exe 开源工具写了一个java调用,效果非常棒,页面布局排版都跟原来的差不多。
具体参考http://www.cnblogs.com/goldenVip/p/6104051.html
但是被驳回了,因为只能在windows上面运行,需要的是服务器运行,结果只能用第三方pdfbox 来解析pdf了,测了两天,才把PDF内容解析出来,页面布局的问题还未完善,先给各位同学提供下思路,废话不多说,上代码
import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.Writer;import java.net.MalformedURLException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.List;import java.util.Map;import java.util.logging.Level;import java.util.logging.Logger;import java.io.OutputStreamWriter;import org.apache.pdfbox.pdfparser.PDFParser;import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.pdmodel.PDDocumentCatalog;import org.apache.pdfbox.pdmodel.PDDocumentInformation;import org.apache.pdfbox.pdmodel.PDPage;import org.apache.pdfbox.pdmodel.PDResources;import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;import org.apache.pdfbox.util.PDFTextStripper;public class PdfToHtml {private PdfToHtml() {}/** * 获取格式化后的时间信息 * @param calendar 时间信息 * @return */ public static String dateFormat( Calendar calendar ){ if( null == calendar ) return null; String date = null; String pattern = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat format = new SimpleDateFormat( pattern ); date = format.format( calendar.getTime() ); return date == null ? "" : date; } /**打印纲要**/ public static void getPDFOutline(String file){ try { //打开pdf文件流 FileInputStream fis = new FileInputStream(file); //加载 pdf 文档,获取PDDocument文档对象 PDDocument document=PDDocument.load(fis); //获取PDDocumentCatalog文档目录对象 PDDocumentCatalog catalog=document.getDocumentCatalog(); //获取PDDocumentOutline文档纲要对象 PDDocumentOutline outline=catalog.getDocumentOutline(); //获取第一个纲要条目(标题1) PDOutlineItem item=outline.getFirstChild(); if(outline!=null){ //遍历每一个标题1 while(item!=null){ //打印标题1的文本 System.out.println("Item:"+item.getTitle()); //获取标题1下的第一个子标题(标题2) PDOutlineItem child=item.getFirstChild(); //遍历每一个标题2 while(child!=null){ //打印标题2的文本 System.out.println(" Child:"+child.getTitle()); //指向下一个标题2 child=child.getNextSibling(); } //指向下一个标题1 item=item.getNextSibling(); } } //关闭输入流 document.close(); fis.close(); } catch (FileNotFoundException ex) { Logger.getLogger(PDFReader.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(PDFReader.class.getName()).log(Level.SEVERE, null, ex); } } /**打印一级目录**/ public static void getPDFCatalog(String file){ try { //打开pdf文件流 FileInputStream fis = new FileInputStream(file); //加载 pdf 文档,获取PDDocument文档对象 PDDocument document=PDDocument.load(fis); //获取PDDocumentCatalog文档目录对象 PDDocumentCatalog catalog=document.getDocumentCatalog(); //获取PDDocumentOutline文档纲要对象 PDDocumentOutline outline=catalog.getDocumentOutline(); //获取第一个纲要条目(标题1) if(outline!=null){ PDOutlineItem item=outline.getFirstChild(); //遍历每一个标题1 while(item!=null){ //打印标题1的文本 System.out.println("Item:"+item.getTitle()); //指向下一个标题1 item=item.getNextSibling(); } } //关闭输入流 document.close(); fis.close(); } catch (FileNotFoundException ex) { Logger.getLogger(PDFReader.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(PDFReader.class.getName()).log(Level.SEVERE, null, ex); } } /**获取PDF文档元数据**/ public static void getPDFInformation(String file){ try { //打开pdf文件流 FileInputStream fis = new FileInputStream(file); //加载 pdf 文档,获取PDDocument文档对象 PDDocument document=PDDocument.load(fis); /** 文档属性信息 **/ PDDocumentInformation info = document.getDocumentInformation(); System.out.println("页数:"+document.getNumberOfPages()); System.out.println( "标题:" + info.getTitle() ); System.out.println( "主题:" + info.getSubject() ); System.out.println( "作者:" + info.getAuthor() ); System.out.println( "关键字:" + info.getKeywords() ); System.out.println( "应用程序:" + info.getCreator() ); System.out.println( "pdf 制作程序:" + info.getProducer() ); System.out.println( "Trapped:" + info.getTrapped() ); System.out.println( "创建时间:" + dateFormat( info.getCreationDate() )); System.out.println( "修改时间:" + dateFormat( info.getModificationDate())); //关闭输入流 document.close(); fis.close(); } catch (FileNotFoundException ex) { Logger.getLogger(PDFReader.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(PDFReader.class.getName()).log(Level.SEVERE, null, ex); } }/** * 提取部分PDF文本转HTML * * @param file * pdf文档路径 * @param startPage * 开始页数 * @param endPage * 结束页数 * @param htmlFile * 保存文件路径 */public void getText(String pdfFile, int startPage, int endPage,String htmlFile) throws Exception {// 是否排序boolean sort = true;// hpd文件路径// String pdfFile = "D:\\PDF\\" + file;// 编码方式String encoding = "UTF-8";// 开始提取页数// int startPage = 1;// 结束提取页数,最大// int endPage = Integer.MAX_VALUE;// 文件输入流,生成文本文件Writer output = null;// 内存中存储的PDF DocumentPDDocument document = null;FileInputStream is = null;String result = null;try {try {is = new FileInputStream(pdfFile);PDFParser parser = new PDFParser(is);parser.parse();// 创建pdf对象document = parser.getPDDocument();PDFTextStripper stripper = new PDFTextStripper();// 设置是否排序stripper.setSortByPosition(sort);// 设置起始页stripper.setStartPage(startPage);// 设置结束页stripper.setEndPage(endPage);// 调用PDFTextStripper的getText提取文字String str = stripper.getText(document);result = new String(str.replace("\r\n", "</br> \r\n"));// 以原来pdf名称来命名转换的html文件// if (file.length() > 4) {// File outputFile = new File(file.substring(0,// file.length() - 4)// + ".html");// htmlName = outputFile.getName();// }} catch (MalformedURLException e) {e.printStackTrace();}// 文件输入流,写入HTML文件output = new OutputStreamWriter(new FileOutputStream(htmlFile),encoding);output.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"> \r\n");output.write("<html> \r\n");output.write("<head> \r\n");output.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> \r\n");output.write("</head> \r\n");output.write("<body> \r\n");output.write("<center>");output.write(result);// 调用PDFTextStripper的writeText提取并输出文本// stripper.writeText(document, output);output.write("</center>");output.write("</body> \r\n");output.write("</html> \r\n");} finally {if (output != null) {// 关闭输出流output.close();}if (document != null) {// 关闭PDF Documentdocument.close();}}}/** * 提取PDF图片并保存 * * @param file * PDF文档路径 * @param imgSavePath * 图片保存路径 */public void getImage(String pdfFile, String imgSavePath) {try {// 打开pdf文件流FileInputStream fis = new FileInputStream(pdfFile);// 加载 pdf 文档,获取PDDocument文档对象PDDocument document = PDDocument.load(fis);/** 文档页面信息 **/// 获取PDDocumentCatalog文档目录对象PDDocumentCatalog catalog = document.getDocumentCatalog();// 获取文档页面PDPage列表List pages = catalog.getAllPages();int count = 1;int pageNum = pages.size(); // 文档页数// 遍历每一页for (int i = 0; i < pageNum; i++) {// 取得第i页PDPage page = (PDPage) pages.get(i);if (null != page) {PDResources resource = page.findResources();// 获取页面图片信息Map<String, PDXObjectImage> imgs = resource.getImages();for (Map.Entry<String, PDXObjectImage> me : imgs.entrySet()) {// System.out.println(me.getKey());PDXObjectImage img = me.getValue();// 保存图片,命名 img.write2file(imgSavePath + "PDF-" + count);count++;}}}document.close();fis.close();} catch (FileNotFoundException ex) {Logger.getLogger(PDFReader.class.getName()).log(Level.SEVERE, null,ex);} catch (IOException ex) {Logger.getLogger(PDFReader.class.getName()).log(Level.SEVERE, null,ex);}}public static void main(String[] args) {PdfToHtml pth = new PdfToHtml();String pdfFile = "D:\\PDF\\2.pdf";//int startPage = 1;//int endPage = Integer.MAX_VALUE;//String htmlFile = "D:\\HTML\\2.html";long startTime = System.currentTimeMillis();try {pth.getText("D:\\PDF\\2.pdf", 1, Integer.MAX_VALUE,"D:\\HTML\\2.html");pth.getImage(pdfFile, "D:\\HTML\\");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}long endTime = System.currentTimeMillis();System.out.println("读写所用时间为:" + (endTime - startTime) + "ms " + pdfFile+ "转换完成");}}
阅读全文
0 0
- pdfbox 解析 PDF转HTML、Text文件
- 使用PDFBox解析pdf文件
- 使用pdfbox解析中英文pdf文件
- 使用Apache PDFBox转换PDF文件为Text文件
- PDFBox 解析PDF文档
- PDFBox解析PDF文档
- 【JAVA】PDFBOX解析PDF
- PDFBox创建PDF文件
- 使用PDFBox解析PDF文档
- 使用PDFBox解析PDF内容
- 使用PDFBOX提取PDF文件
- 使用PDFBox读取pdf文件
- pdfbox加密解密PDF文件
- 使用pdfbox编辑pdf文件
- Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印
- Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印
- java使用pdfbox把PDF转成html
- lucene入门-使用pdfbox解析中文PDF
- c++ const 关键字 const与#define区别
- C#设计模式(三)工厂方法模式
- 军事联合作战仿真系统
- RAID概述
- 通过原型继承创建新对象
- pdfbox 解析 PDF转HTML、Text文件
- Java的MD5加密和解密
- mapreduce基础知识
- Linux下查看/管理当前登录用户及用户操作历史记录
- Django外键关系描述
- banner
- ArrayList简介
- 够用的Vim常用指令
- 软件开发流程