使用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()将会一直等待,这是从这里到的解决方法
pdf转html
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天,终于在今天搞定,特此记录一下。