開篇css
最近使用 Phantomjs 生成PDF,其中遇到一些問題,致使PDF生成失敗,如出現空白文件或一頁數據量太大,都是因爲沒有設置好格式致使。特別是分頁問題,感受資料不多,除了在 StackOverflow 上看到些許資料外,中文社區基本看不到,附上修改後的 rasterize.js 來作講解:html
1 var page = require('webpage').create(), 2 system = require('system'), 3 address, output, size; 4 5 if (system.args.length < 3 || system.args.length > 5) { 6 console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]'); 7 console.log(' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"'); 8 phantom.exit(1); 9 } else { 10 address = system.args[1]; 11 output = system.args[2]; 12 /*size of browser*/ 13 page.viewportSize = { width: 600, height: 600 }; 14 /* 15 if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") { 16 size = system.args[3].split('*'); 17 page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' } 18 : { format: 'A4', orientation: 'portrait', margin: '1cm' }; 19 } 20 */ 21 /* ie and chrome view diffrent format of pdf */ 22 page.settings.userAgent = 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36'; 23 page.paperSize = { format: 'A4', orientation: 'portrait', margin: '0.8cm' }; 24 page.zoomFactor = 1; 25 page.settings.loadImages = true; 26 //some question about the page language 27 page.open(address, function (status) { 28 if (status !== 'success') { 29 console.log('Unable to load the address!'); 30 } else { 31 //page.render(output); 32 //phantom.exit(); 33 34 window.setTimeout(function () { 35 page.render(output); 36 phantom.exit(); 37 }, 200); //setting the time is enough to loading the page. document.ready 38 39 } 40 }); 41 }
PDF 格式設置git
關於其中 page 的設置屬性,這裏能夠了解,更深刻能夠了解 WebPage Module。github
咱們須要的設置,基本上就是頁面格式、縮放、加載圖片等,但有些例外,下面一一講解。web
1 page.paperSize = { format: 'A4', orientation: 'portrait', margin: '0.8cm' };
註釋掉了官方例子的設置代碼,由於傳入的參數只有3個,到 .pdf 爲止,若是寫成通用模式,固然能夠做爲外部參數傳入。ajax
format :A4 紙,能夠設置 "5in*7.5in", "10cm*20cm", "Letter" 等chrome
orientation :紙方向是豎着的,或者 landscapeapi
margin :與紙四邊間距,可自定義,也可詳細設置 margin : { left: '0.8cm', top : '0.8cm', right : '0.8cm', bottom : '0.8cm' }ide
1 page.zoomFactor = 1; 2 page.settings.loadImages = true;
zoomFactor :頁面縮放比例ui
loadImages :頁面加載圖片
1 page.settings.userAgent = 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36';
這個設置比較不常見,通常的示例中都沒有說起,由於發現用 chrome 和 IE 打開生成的 pdf 時格式有點不同(表如今分頁方面),因爲偏向 Chrome 瀏覽格式,故設置此值,解決這個不一致問題。
page.open 裏面的 setTimeout 方法做用:等待頁面執行完 js ,再生成 pdf。固然對於 js 要執行多久(要等多久),這個就不知道怎麼預算了。其實我有試過 ajax 方式加載內容,但所以問題而做罷了。
更多的信息,關於頁眉和頁腳及頁碼標註問題,能夠參考這裏。
PDF 分頁
分頁來講,更好控制,不須要代碼(js)設置,頁面使用樣式便可:
style = 「page-break-after: always;」
控制每頁內容的大小,使用 <div style="page-break-after: always;">content</div> 就行。
更多選擇 style=「page-break-before: always;」 , style="page-break-inside: avoid;" 這個能夠避免內容散到兩頁中
總結
關於這個 phantomjs pdf render 就到此了,若有更多好的方式及問題解決方案,歡迎你們分享。