使用pdf2htmlEX實現將pdf轉html

jopen 10年前發布 | 199K 次閱讀 PDF工具包 pdf2htmlEX

首先要感謝pdf2htmlEX的作者Lu Wang,該軟件是一個pdf轉html的開源軟件,效果非常理想。下面兩張圖片是html和pdf視圖下的截圖:

20131230003028953.png

 

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代碼如下:

文件最后加上:
window.onload=function(){
    var eles = document.getElementsByClassName('pf w0 h0');
    var height = 0;
    for(var i=0,len=eles.length;i<len;i++){
        height +=eles[i].scrollHeight+20;
    }
    if(height>0)
    document.getElementById('page-container').style.height=height+'px';
}

/*注釋下面這段代碼,因為手機瀏覽器無法觸發滾動事件
        this.container.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處理類

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.getRuntime();
        try {
            Process p = rt.exec(command);
            StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");              
              // kick off stderr  
            errorGobbler.start();  
            StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "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\\pdf2htmlEX.exe D:\\v.pdf hello.html","v.pdf","v2.html");
    }
}
處理Runtime.exec()一直阻塞的類:如果沒有這個類,p.waitFor()將會一直等待,這是從這里找到的解決方法

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.getRuntime().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;
        this.type = 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天,終于在今天搞定,特此記錄一下。

pdf2html命令用法:

用法: pdf2htmlEX [options] <input.pdf> [<output.html>]
  -f,--first-page <int>         需要轉換的起始頁 (默認: 1)
  -l,--last-page <int>          需要轉換的最后一頁 (默認: 2147483647)
  --zoom <fp>                   縮放比例
  --fit-width <fp>              適合寬度 <fp> 像素
  --fit-height <fp>             適合高度 <fp> 像素
  --use-cropbox <int>           使用剪切框 (default: 1)
  --hdpi <fp>                   圖像水平分辨率 (default: 144)
  --vdpi <fp>                   圖像垂直分辨率 (default: 144)
  --embed <string>              指定哪些元素應該被嵌入到輸出
  --embed-css <int>             將CSS文件嵌入到輸出中 (default: 1)
  --embed-font <int>            將字體文件嵌入到輸出中 (default: 1)
  --embed-image <int>           將圖片文件嵌入到輸出中 (default: 1)
  --embed-javascript <int>      將javascript文件嵌入到輸出中 (default: 1)
  --embed-outline <int>         將鏈接嵌入到輸出中 (default: 1)
  --split-pages <int>           將頁面分割為單獨的文件 (default: 0)
  --dest-dir <string>           指定目標目錄 (default: ".")
  --css-filename <string>       生成的css文件的文件名 (default: "")
  --page-filename <string>      分割的網頁名稱  (default:"")
  --outline-filename <string>   生成的鏈接文件名稱 (default:"")
  --process-nontext <int>       渲染圖行,文字除外 (default: 1)
  --process-outline <int>       在html中顯示鏈接 (default: 1)
  --printing <int>              支持打印 (default: 1)
  --fallback <int>              在備用模式下輸出 (default: 0)
  --embed-external-font <int>   嵌入局部匹配的外部字體 (default: 1)
  --font-format <string>        嵌入的字體文件后綴 (ttf,otf,woff,svg) (default: "woff")
  --decompose-ligature <int>    分解連字-> fi (default:0)
  --auto-hint <int>             使用fontforge的autohint上的字體時不提示 (default: 0)
  --external-hint-tool <string> 字體外部提示工具 (overrides --auto-hint) (default: "")
  --stretch-narrow-glyph <int>  伸展狹窄的字形,而不是填充 (default: 0)
  --squeeze-wide-glyph <int>    收縮較寬的字形,而不是截斷 (default: 1)
  --override-fstype <int>       clear the fstype bits in TTF/OTF fonts (default:0)
  --process-type3 <int>         convert Type 3 fonts for web (experimental) (default: 0)
  --heps <fp>                   合并文本的水平臨界值,單位:像素(default: 1)
  --veps <fp>                   vertical threshold for merging text, in pixels (default: 1)
  --space-threshold <fp>        斷字臨界值 (臨界值 * em) (default:0.125)
  --font-size-multiplier <fp>   一個大于1的值增加渲染精度 (default: 4)
  --space-as-offset <int>       把空格字符作為偏移量 (default: 0)
  --tounicode <int>             如何處理ToUnicode的CMap (0=auto, 1=force,-1=ignore) (default: 0)
  --optimize-text <int>         盡量減少用于文本的HTML元素的數目 (default: 0)
  --bg-format <string>          指定背景圖像格式 (default: "png")
  -o,--owner-password <string>  所有者密碼 (為了加密文件)
  -u,--user-password <string>   用戶密碼 (為了加密文件)
  --no-drm <int>                覆蓋文檔的 DRM 設置 (default: 0)
  --clean-tmp <int>             轉換后刪除臨時文件 (default: 1)
  --data-dir <string>           指定的數據目錄 (default: ".\share\pdf2htmlEX")
  --debug <int>                 打印調試信息 (default: 0)
  -v,--version                  打印版權和版本信息
  -h,--help                     打印使用幫助信息


本人使用的版本時v0.11的和v1的版本有一些區別,主要是作者重新編寫了pdftohtmlEX.js所以需要對照上面的js做相應修改

window.onload=function(){
    var eles = document.getElementsByClassName('pd w0 h0');
    var height = 0;
    for(var i=0,len=eles.length;i<len;i++){
        height +=eles[i].scrollHeight+20;
    }
    if(height>0){
        document.getElementById('page-container').style.height=height+'px';
        document.getElementById('page-container').style.overflow='hidden';
    }
}

 //this.$container.scroll(function(){ _.schedule_render(); });
      $(document).scroll(function(){_.schedule_render();});
來自:http://blog.csdn.net/crazypandariy/article/details/17663731

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!