wkhtmltopdf 最好用Html轉pdf的工具
實習時公司需要把一些html頁面中的部分內容生成pdf文件,然后我就找一些用php把html頁面圍成pdf文件的類。方法是可謂是找了很多很多,什么html2pdf,pdflib,FPDF這些都試過了,但是都沒有達到我要的求(主要是不能解決中文亂碼的問題以及樣式排版的問題)。
pdflib,FPDF 這兩個方法是需要編寫程序去生成pdf的,就也是講不支持直接把html頁面轉換成pdf;html2pdf這個雖然可以把html頁面轉換成pdf文 件,但是它只能轉換一般簡單的html代碼,如果你的html內容要的是通過后臺新聞編輯器排版的那肯定不行的。
糾結了半天,什么百度,谷歌搜索都用了,搜索了半天,功夫不負有心人,終于找到一個非常好用的方法了,下面就隆重介紹。
它就 是:wkhtmltopdf,wkhtmltopdf可以直接把任何一個可以在瀏覽器中瀏覽的網頁直接轉換成一個pdf,首先說明一下它不是一個php 類,而是一個把html頁面轉換成pdf的一個軟件(需要安裝在服務器上),但是它并不是一個簡單的桌面軟件,而且它直接cmd批處理的,使用php中的 shell_exec()函數就可以調用它。下面就介紹如何用php+js+html來讓它生成pdf文件的方法(不過有個缺陷就是他需要在服務器端生成一個緩存文件,如果你使用thinkphp框架的話就可以將其緩存文件放在runtime 文件夾中暫存就行)。
一,下載并安裝wkhtmltopdf
1、下載地址:http://wkhtmltopdf.org/downloads.html 如圖:
2、上面有各種平臺下安裝的安裝包,英文不好的直接谷歌翻譯一下。下面以 windows7平臺上使用舉例,我的下載的是stable(穩(wěn)定版)的wkhtmltopdf-0.12.3.2-installer.exe這個版本,我在win7、win8 32位和64位以及win-sever上安裝測試都沒有問題的,系統(tǒng)時幾位就下載幾位的安裝包。下載好以后直接安裝就可以了,注意安裝路徑要知道,下面會用到的。
3、安裝好以后需要在系統(tǒng)環(huán)境變量變量名為”Path”的后添加:;D:\wkhtmltopdf\bin 也就是你安裝的目錄。安裝好以后重啟電腦。
下圖是如何設置環(huán)境變量:
打開我的電腦右鍵屬性
點擊高級系統(tǒng)設置
找到高級里面點擊環(huán)境變量
找到系統(tǒng)變量中的path,點擊編輯,將剛剛的安裝位置復制到最后,記得前面加一個分號哦!
二,測試使用效果
直接在cmd里輸入:wkhtmltopdf http://www.baidu.com/ D:website1.pdf(注意中間有空格哈)
第一個是:運行軟件名稱(這個是不變的) 第二個是網址 第三個是生成后的路徑及文件名?;剀嚭笫遣皇强瓷粋€生成進度條的提示呢,恭喜您已經成功了,到你的生成目錄里看看是不是有一個剛生成的pdf文件呢。
操作方法:1、windows鍵+r打開搜索框,輸入cmd,點擊確定
2、直接在cmd里輸入:wkhtmltopdf http://www.baidu.com/ D:website1.pdf(注意中間有空格哈)
3、點擊回車后,會看到一個進度條,然后就提示轉換成功!
4、之后在相應位置(即剛剛設置的D盤)中會發(fā)現(xiàn)多了一個Pdf文件,就說明成功了
三,php里調用
php里調用是很簡單的,用shell_exec這個函數就可以了,如果shell_exec函數不能用看看php.ini里是否補禁用了(找到php.ini中的shell_exec函數,取消注釋就可以了,一般都是可以直接用的)。簡單舉例:
<?php shell_exec("wkhtmltopdf http://www.dbjr.com.cn/ 1.pdf") ?>
你會發(fā)現(xiàn)在你php文件的同級目錄中會生成一個1.pdf的文件
下面代碼舉例介紹如何在網站開發(fā)中使用它:主要功能是截取網頁的部分傳遞到php中處理成pdf文檔
html頁面代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script src="js/jquery-2.1.4.min.js"></script> <link rel="stylesheet" href="css/common.css" rel="external nofollow" rel="external nofollow" > <link rel="stylesheet" href="css/myCenter.css" rel="external nofollow" rel="external nofollow" > <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>霍蘭德職業(yè)測試</title> </head> <body> <!--startprint--> <div class="right5"> <div class="right_top" style="background-image:url(images/right-di.png);"> <h3>霍蘭德測試報告</h3> </div> <div class="print"> <input type="button" value="下載報告" id="down" class="print_btn"> </div> <div class="Hollander"> <h6>MBTI測試結果:ESTJ</h6> <div id="chart"></div> <p>約翰·霍蘭德(John Holland)是美國約翰·霍普金斯大學心理學教授,美國著名的職業(yè)指導專家?;籼m德以職業(yè)興趣理論為基礎,先后編制了職業(yè)偏好量表(VocatIonaI Preference lnventory)和自我導向搜尋表(Self-directed Search)兩種職業(yè)興趣量表,霍蘭德力求為每種職業(yè)興趣找出兩種相匹配的職業(yè)能力。興趣測試和能力測試的結合在職業(yè)指導和職業(yè)咨詢的實際操作中起到了促進作用。</p> </div> <table class="tbl1"> <tbody> <tr node-type="toolBar"> <td class="tbl11">領導模式:</td> <td class="tbl12"> <p>①直接領導,快速管理 ②運用過去經驗解決問題 ③直接、明確地識別問題的核心 ④決策和執(zhí)行決策非常迅速 ⑤傳統(tǒng)型領導,尊重組織內部的等級和組織獲得的成就</p> </td> </td> </tr> <tr node-type="toolBar"> <td class="tbl11">領導模式:</td> <td class="tbl12"> <p>①直接領導,快速管理 ②運用過去經驗解決問題 ③直接、明確地識別問題的核心 ④決策和執(zhí)行決策非常迅速 ⑤傳統(tǒng)型領導,尊重組織內部的等級和組織獲得的成就</p> </td> </td> </tr> <tr node-type="toolBar"> <td class="tbl11">領導模式:</td> <td class="tbl12"> <p>①直接領導,快速管理 ②運用過去經驗解決問題 ③直接、明確地識別問題的核心 ④決策和執(zhí)行決策非常迅速 ⑤傳統(tǒng)型領導,尊重組織內部的等級和組織獲得的成就</p> </td> </td> </tr> <tr node-type="toolBar"> <td class="tbl11">領導模式:</td> <td class="tbl12"> <p>①直接領導,快速管理 ②運用過去經驗解決問題 ③直接、明確地識別問題的核心 ④決策和執(zhí)行決策非常迅速 ⑤傳統(tǒng)型領導,尊重組織內部的等級和組織獲得的成就</p> </td> </td> </tr> <tr node-type="toolBar"> <td class="tbl11">適合報考專業(yè):</td> <td class="tbl12"> <a><span>專業(yè)定位卡介紹>></span></a> </td> </td> </tr> </tbody> </table> </div> <!--endprint--> <form action="pdf.php" method="post" name="hld_res" id="hideform"> <input type="hidden" id="hide_content" name="html"/> </form> </body> <script> $(function () { //獲取需要傳遞的Html代碼 通過<!--startprint--><!--endprint-->截取 bdhtml=window.document.body.innerHTML; sprnstr="<!--startprint-->"; eprnstr="<!--endprint-->"; prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17); prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr)); //將獲取的html代碼添加到隱藏域中傳給php文件處理 $("#hide_content").val(""+prnhtml+""); } ); $("#down").click(function(){ $("#hideform").submit(); }); </script> </html>
php頁面:
<?php //轉成pdf $html=$_POST['html']; //Turn on output buffering ob_start(); $html=' <link rel="stylesheet" href="css/common.css" rel="external nofollow" rel="external nofollow" > <link rel="stylesheet" href="css/myCenter.css" rel="external nofollow" rel="external nofollow" > <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'.$html; //這兒可以引入生成的Html的樣式表 路徑可以是絕對路徑也可以是相對路徑,也可以把樣式表文件復制到臨時html文件的目錄下 即這兒的demo文件目錄下(默認) 也可以直接把樣式寫在html頁面中直接傳遞過來 //$html = ob_get_contents(); //$html=$html1.$html; $filename = "hld"; //save the html page in tmp folder 保存的html臨時文件位置 可以是相對路徑也是可以是絕對路徑 下面用相對路徑 file_put_contents("{$filename}.html", $html); //Clean the output buffer and turn off output buffering ob_end_clean(); //convert HTML to PDF shell_exec("wkhtmltopdf -q {$filename}.html {$filename}.pdf"); if(file_exists("{$filename}.pdf")){ header("Content-type:application/pdf"); header("Content-Disposition:attachment;filename={$filename}.pdf"); echo file_get_contents("{$filename}.pdf"); //echo "{$filename}.pdf"; }else{ exit; } ?>
點擊頁面中的下載按鈕,
是不是彈出一個下載提示,打開下載的pdf,是不是和網頁上的樣式一模一樣呢,
再打開Php文件中的文件保存位置,看看是不是多了兩個臨時文件呢?
這兩個臨時文件在哪兒,你的css就得在哪兒,或者你直接使用相對路徑,引用其他文件中的css樣式也可以的,最簡單的就是把css樣式直接寫在要轉成pdf的html頁面中。
如果存在樣式沒有,那就是你的樣式路徑沒有寫對,在檢查一下就可以了!
四,解決分頁問題
wkhtmltopdf 很好用,但也有些不盡人意。就是當一個html頁面很長我需要在指定的地方分頁那怎么辦呢? wkhtmltopdf 開發(fā)者在開發(fā)的時候并不是沒有考慮到這一點,wkhtmltopdf 有個很好的方法,就是在那個div的樣式后添加一個:page-break-inside:avoid;就ok了。
例如
div{ width:800px; min-height:1362px;margin:auto;page-break-inside:avoid;}
以上就是個人總結的轉pdf的方法,很多地方還可以擴展,小伙伴們開動腦筋動起來吧,不過目前一直沒有解決就是沒法用中文名稱命名文件,如果有能解決的伙伴,麻煩在下面留言告知,謝謝么么噠了!
相關文章
IntelliJ IDEA 2020如何設置背景圖片的方法步驟
這篇文章主要介紹了IntelliJ IDEA 2020如何設置背景圖片的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04HTML轉義字符&npsp;表示non-breaking space \xa0
HTML轉義字符&npsp;表示non-breaking space,unicode編碼為u'\xa0',超出gbk編碼范圍,這里就為大家分享一下2020-02-02git流水線(Pipeline)導致分支(Branch)無法合并問題及解決
這篇文章主要介紹了git流水線(Pipeline)導致分支(Branch)無法合并問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11基于IntelliJ IDEA/Android Studio插件開發(fā)指南(推薦)
Android Studio是基于Intellij IDEA開發(fā)的,所以開發(fā)Android Studio的插件,其實就是開發(fā)IDEA的插件。根據官方推薦,使用IDEA IDE來開發(fā)IDEA插件,本文給大家介紹插件開發(fā)的基本流程,感興趣的朋友一起看看吧2021-10-10