pdf2htmlEX实现pdf转html

首先要感谢pdf2htmlEX的做者Lu Wang,该软件是一个pdf转html的开源软件,效果很是理想。下面两张图片是html和pdf视图下的截图:javascript




windows下载地址pdf2htmlEX-v1.0-win32-staticcss


本人开发的一个功能:文档在线阅读,要求可以支持移动终端浏览器在线阅读。考虑过将文档先转pdf,而后在将pdf转swf,利用flexpaper在前端浏览器访问。可是因为safari浏览器不支持flash,因此这种方式不太适合。也测试过火狐的pdf.js,可是这个框架在safari中出现中文乱码,一样不行。最后,通过测试,只有使用pdf2htmlEX转的html在各个浏览器上展现效果均不错,因此选择该软件。html

第一步:下载pdf2html。前端

第二步:修改pdf2html自带的js文件pdf2htmlEX.min.js。缘由:移动终端浏览器对CSS定位absolute的支持有问题(不会出现滚动条),因此须要为全部页面的容器设置高度,这样,手机浏览器就能够出现滚动条了。修改和添加的js代码以下:java

[html] view plaincopy在CODE上查看代码片派生到个人代码片web

  1. 文件最后加上:  windows

  2. window.onload=function(){  浏览器

  3.     var eles = document.getElementsByClassName('pf w0 h0');  ruby

  4.     var height = 0;  框架

  5.     for(var i=0,len=eles.length;i<len;i++){  

  6.         height +=eles[i].scrollHeight+20;  

  7.     }  

  8.     if(height>0)  

  9.     document.getElementById('page-container').style.height=height+'px';  

  10. }  

[javascript] view plaincopy在CODE上查看代码片派生到个人代码片

  1. /*注释下面这段代码,由于手机浏览器没法触发滚动事件 

  2.     <span style="white-space:pre">  </span>this.container.addEventListener('scroll', function() { 

  3.       <span style="white-space:pre">        </span>self.update_page_idx(); 

  4.       <span style="white-space:pre">        </span>self.schedule_render(true); 

  5.    <span style="white-space:pre">   </span>}, false); 

  6. */  

  7. /*新增,使用document对象上滚动加载页面数据,这样能够兼容手机浏览器*/  

  8. <span style="white-space:pre">  </span>document.addEventListener('scroll'function() {  

  9.         <span style="white-space:pre">  </span>self.update_page_idx();  

  10.         <span style="white-space:pre">  </span>self.schedule_render(true);  

  11.       <span style="white-space:pre">    </span>}, false);  


第三步:编写java处理类

[java] view plaincopy在CODE上查看代码片派生到个人代码片

  1. public class Pdf2htmlEXUtil {  

  2.   

  3.     /** 

  4.      * 调用pdf2htmlEX将pdf文件转换为html文件 

  5.      * @param command 调用exe的字符串 

  6.      * @param pdfName 须要转换的pdf文件名称 

  7.      * @param htmlName 生成的html文件名称 

  8.      * @return  

  9.      */  

  10.     public static boolean pdf2html(String command,String pdfName,String htmlName){  

  11.         Runtime rt = Runtime.getRuntime();  

  12.         try {  

  13.             Process p = rt.exec(command);  

  14.             StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");                

  15.               // kick off stderr    

  16.             errorGobbler.start();    

  17.             StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT");    

  18.               // kick off stdout    

  19.             outGobbler.start();   

  20.             int w = p.waitFor();  

  21.             System.out.println(w);  

  22.             int v = p.exitValue();  

  23.             System.out.println(v);  

  24.             return true;  

  25.         } catch (Exception e) {  

  26.             e.printStackTrace();  

  27.         }  

  28.         return false;  

  29.     }  

  30.       

  31.     public static void main(String[] args) {  

  32.         pdf2html("D:\\pdf2htmlEX-v1.0\\pdf2htmlEX.exe D:\\v.pdf hello.html","v.pdf","v2.html");  

  33.     }  

  34. }  

处理Runtime.exec()一直阻塞的类:若是没有这个类,p.waitFor()将会一直等待,这是从这里找到的解决方法

[java] view plaincopy在CODE上查看代码片派生到个人代码片

  1. import java.io.BufferedReader;  

  2. import java.io.IOException;  

  3. import java.io.InputStream;  

  4. import java.io.InputStreamReader;  

  5. import java.io.OutputStream;  

  6. import java.io.PrintWriter;  

  7.   

  8. /** 

  9.  * 用于处理Runtime.getRuntime().exec产生的错误流及输出流 

  10.  * @author shaojing 

  11.  * 

  12.  */  

  13. public class StreamGobbler extends Thread {  

  14.     InputStream is;  

  15.     String type;  

  16.     OutputStream os;  

  17.           

  18.     StreamGobbler(InputStream is, String type) {  

  19.         this(is, type, null);  

  20.     }  

  21.   

  22.     StreamGobbler(InputStream is, String type, OutputStream redirect) {  

  23.         this.is = is;  

  24.         this.type = type;  

  25.         this.os = redirect;  

  26.     }  

  27.       

  28.     public void run() {  

  29.         InputStreamReader isr = null;  

  30.         BufferedReader br = null;  

  31.         PrintWriter pw = null;  

  32.         try {  

  33.             if (os != null)  

  34.                 pw = new PrintWriter(os);  

  35.             isr = new InputStreamReader(is);  

  36.             br = new BufferedReader(isr);  

  37.             String line=null;  

  38.             while ( (line = br.readLine()) != null) {  

  39.                 if (pw != null)  

  40.                     pw.println(line);  

  41.                 System.out.println(type + ">" + line);      

  42.             }  

  43.             if (pw != null)  

  44.                 pw.flush();  

  45.         } catch (IOException ioe) {  

  46.             ioe.printStackTrace();    

  47.         } finally{  

  48.             try {  

  49.                 if(pw!=null)  

  50.                     pw.close();  

  51.                 if(br!=null)  

  52.                     br.close();  

  53.                 if(isr!=null)  

  54.                     isr.close();  

  55.             } catch (IOException e) {  

  56.                 e.printStackTrace();  

  57.             }  

  58.         }  

  59.     }  

  60. }   

一个完整的高保真pdf转html例子就完成了。使用pdf2html,本人摸索了2天,终于在今天搞定,特此记录一下。

pdf2html命令用法:

[html] view plaincopy在CODE上查看代码片派生到个人代码片

  1. 用法: pdf2htmlEX [options] <input.pdf> [<output.html>]  

  2.   -f,--first-page <int>         须要转换的起始页 (默认: 1)  

  3.   -l,--last-page <int>          须要转换的最后一页 (默认: 2147483647)  

  4.   --zoom <fp>                   缩放比例  

  5.   --fit-width <fp>              适合宽度 <fp> 像素  

  6.   --fit-height <fp>             适合高度 <fp> 像素  

  7.   --use-cropbox <int>           使用剪切框 (default: 1)  

  8.   --hdpi <fp>                   图像水平分辨率 (default: 144)  

  9.   --vdpi <fp>                   图像垂直分辨率 (default: 144)  

  10.   --embed <string>              指定哪些元素应该被嵌入到输出  

  11.   --embed-css <int>             将CSS文件嵌入到输出中 (default: 1)  

  12.   --embed-font <int>            将字体文件嵌入到输出中 (default: 1)  

  13.   --embed-image <int>           将图片文件嵌入到输出中 (default: 1)  

  14.   --embed-javascript <int>      将javascript文件嵌入到输出中 (default: 1)  

  15.   --embed-outline <int>         将连接嵌入到输出中 (default: 1)  

  16.   --split-pages <int>           将页面分割为单独的文件 (default: 0)  

  17.   --dest-dir <string>           指定目标目录 (default: ".")  

  18.   --css-filename <string>       生成的css文件的文件名 (default: "")  

  19.   --page-filename <string>      分割的网页名称  (default:"")  

  20.   --outline-filename <string>   生成的连接文件名称 (default:"")  

  21.   --process-nontext <int>       渲染图行,文字除外 (default: 1)  

  22.   --process-outline <int>       在html中显示连接 (default: 1)  

  23.   --printing <int>              支持打印 (default: 1)  

  24.   --fallback <int>              在备用模式下输出 (default: 0)  

  25.   --embed-external-font <int>   嵌入局部匹配的外部字体 (default: 1)  

  26.   --font-format <string>        嵌入的字体文件后缀 (ttf,otf,woff,svg) (default: "woff")  

  27.   --decompose-ligature <int>    分解连字-> fi (default:0)  

  28.   --auto-hint <int>             使用fontforge的autohint上的字体时不提示 (default: 0)  

  29.   --external-hint-tool <string> 字体外部提示工具 (overrides --auto-hint) (default: "")  

  30.   --stretch-narrow-glyph <int>  伸展狭窄的字形,而不是填充 (default: 0)  

  31.   --squeeze-wide-glyph <int>    收缩较宽的字形,而不是截断 (default: 1)  

  32.   --override-fstype <int>       clear the fstype bits in TTF/OTF fonts (default:0)  

  33.   --process-type3 <int>         convert Type 3 fonts for web (experimental) (default: 0)  

  34.   --heps <fp>                   合并文本的水平临界值,单位:像素(default: 1)  

  35.   --veps <fp>                   vertical threshold for merging text, in pixels (default: 1)  

  36.   --space-threshold <fp>        断字临界值 (临界值 * em) (default:0.125)  

  37.   --font-size-multiplier <fp>   一个大于1的值增长渲染精度 (default: 4)  

  38.   --space-as-offset <int>       把空格字符做为偏移量 (default: 0)  

  39.   --tounicode <int>             如何处理ToUnicode的CMap (0=auto1=force,-1=ignore) (default: 0)  

  40.   --optimize-text <int>         尽可能减小用于文本的HTML元素的数目 (default: 0)  

  41.   --bg-format <string>          指定背景图像格式 (default: "png")  

  42.   -o,--owner-password <string>  全部者密码 (为了加密文件)  

  43.   -u,--user-password <string>   用户密码 (为了加密文件)  

  44.   --no-drm <int>                覆盖文档的 DRM 设置 (default: 0)  

  45.   --clean-tmp <int>             转换后删除临时文件 (default: 1)  

  46.   --data-dir <string>           指定的数据目录 (default: ".\share\pdf2htmlEX")  

  47.   --debug <int>                 打印调试信息 (default: 0)  

  48.   -v,--version                  打印版权和版本信息  

  49.   -h,--help                     打印使用帮助信息  



本人使用的版本时v0.11的和v1的版本有一些区别,主要是做者从新编写了pdftohtmlEX.js因此须要对照上面的js作相应修改

[javascript] view plaincopy在CODE上查看代码片派生到个人代码片

  1. window.onload=function(){  

  2.     var eles = document.getElementsByClassName('pd w0 h0');  

  3.     var height = 0;  

  4.     for(var i=0,len=eles.length;i<len;i++){  

  5.         height +=eles[i].scrollHeight+20;  

  6.     }  

  7.     if(height>0){  

  8.         document.getElementById('page-container').style.height=height+'px';  

  9.         document.getElementById('page-container').style.overflow='hidden';  

  10.     }  

  11. }  


[javascript] view plaincopy在CODE上查看代码片派生到个人代码片

  1. //this.$container.scroll(function(){ _.schedule_render(); });  

  2.   $(document).scroll(function(){_.schedule_render();});