使用pdf2htmlEX实现将pdf转html
首先要感谢pdf2htmlEX的作者Lu Wang,该软件是一个pdf转html的开源软件,效果非常理想。下面两张图片是html和pdf视图下的截图:
windows下载地址pdf2htmlEX-v1.0-win32-static
本人开发的一个功能:文档在线阅读,要求能够支持移动终端浏览器在线阅读。考虑过将文档
先转pdf,然后在将pdf转swf,利用flexpaper在前端浏览器访问。但是由于safari浏览器不支持flash,所以这种方式不太适合。也测试过火狐的pdf.js,但是这个框架在safari中出现中文乱码,同样不行。最后,经过测试,只有使用pdf2htmlEX转的html在各个浏览器上展示效果均不错,所以选择该软件。
第一步:下载pdf2html。
第二步:修改pdf2html自带的js文件pdf2htmlEX.min.js。原因:移动终端浏览器对CSS定位absolute的支持有问题(不会出现滚动条),所以需要为所有页面的容器设置高度,这样,手机浏览器就可以出现滚动条了。修改和添加的js代码如下:
1 2 3 4 5 6 7 8 9 10 | 文件最后加上: load=function(){ var eles = ElementsByClassName('pf w0 h0'); var height = 0; for(var i=0,len=eles.length;i<len;i++){ height +=eles[i].scrollHeight+20; } if(height>0) ElementById('page-container').style.height=height+'px'; } |
1 2 3 4 5 6 7 8 9 10 | /*注释下面这段代码,因为手机浏览器无法触发滚动事件 ainer.addEventListener('scroll', function() { self.update_page_idx(); self.schedule_render(true); }, false); */ /*新增,使用document对象上滚动加载页面数据,这样可以兼容手机浏览器*/ document.addEventListener('scroll', function() { self.update_page_idx(); self.schedule_render(true); }, false); |
第三步:编写java处理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class Pdf2htmlEXUtil { /** * 调用pdf2htmlEX将pdf文件转换为html文件 * @param command 调用exe的字符串 * @param pdfName 需要转换的pdf文件名称 * @param htmlName 生成的html文件名称 * @return */ public static boolean pdf2html(String command,String pdfName,String htmlName){ Runtime rt = Runtime(); try { Process p = rt.exec(command); StreamGobbler errorGobbler = new ErrorStream(), "ERROR"); // kick off stderr errorGobbler.start(); StreamGobbler outGobbler = new InputStream(), "STDOUT"); // kick off stdout outGobbler.start(); int w = p.waitFor(); System.out.println(w); int v = p.exitValue(); System.out.println(v); return true; } catch (Exception e) { e.printStackTrace(); } return false; } public static void main(String[] args) { pdf2html("D:\\pdf2htmlEX-v1.0\\ D:\\v.pdf hello.html","v.pdf","v2.html"); } } |
处理()一直阻塞的类:如果没有这个类,p.waitFor()将会一直等待,这是从这里到的解决方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; /** * 用于处理Runtime().exec产生的错误流及输出流 * @author shaojing * */ public class StreamGobbler extends Thread { InputStream is; String type; OutputStream os; StreamGobbler(InputStream is, String type) { this(is, type, null); } StreamGobbler(InputStream is, String type, OutputStream redirect) { this.is = is; pe = type; this.os = redirect; } public void run() { InputStreamReader isr = null; BufferedReader br = null; PrintWriter pw = null; try { if (os != null) pw = new PrintWriter(os); isr = new InputStreamReader(is); br = new BufferedReader(isr); String line=null; while ( (line = br.readLine()) != null) { if (pw != null) pw.println(line); System.out.println(type + ">" + line); } if (pw != null) pw.flush(); } catch (IOException ioe) { ioe.printStackTrace(); } finally{ try { if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
一个完整的高保真pdf转html例子就完成了。使用pdf2html,本人摸索了2天,终于在今天搞定,特此记录一下。
发布评论