使用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代碼如下:
文件最后加上: 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!