iTextRenderer 在依賴 iText 的基礎上,單獨實現了HTML渲染PDF,基本上能實現 CSS 2.1的總體性,而且徹底符合 W3C 規範。css
使用html和css定義樣式和呈現的內容。以下流程圖:html
首先須要添加中文字庫,也就是你的頁面中用到的全部字體:java
ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
注意:頁面中字體不能使用中文,須要使用英文名稱,並且是大小寫敏感的!例如宋體的英文名稱是 SimSun(注意不是simsun!,首字母都是大寫的)ide
錯誤寫法:font-family:宋體 或者 font-family:simsun
字體
正確寫法:font-family:SimSun 或者 font-family:SimHeiui
若是生成的pdf中文不顯示或者亂碼,請確認以下信息:加密
確保頁面中全部內容都指定了字體,最好能指定 body {font-family:....},以防止漏網之魚。spa
確保上述全部字體均經過addFont加入,字體名稱錯誤或者字體不存在會拋出異常,很方便,可是沒導入的字體不會有任何提示。rest
確保字體名稱正確,不使用中文,大小寫正確。xml
確保html標籤都正確,簡單的方法是全部內容都去掉,隨便寫幾個中文看看可否正常生成,若是能夠,在認真檢查html標籤,不然再次檢查上述幾條。
還有就是中文換行的問題了,帶有中文並且文字較多存在換行狀況時,須要給table加入樣式:
table-layout:fixed,而後表格中的td使用%還指定td的寬度。
加密方法較爲簡單:
ITextRenderer renderer = new ITextRenderer(); renderer.setPDFEncryption(getEncryption()); private PDFEncryption getEncryption() { PDFEncryption encrypt = new PDFEncryption(new String("a").getBytes(), new String("b").getBytes(), PdfWriter.ALLOW_SCREENREADERS); return encrypt; }
須要引入jar包!bcprov-jdk16-145.jar,百度一下不少的。
兩個參數:兩個都是密碼,不一樣的是第一個密碼是瀏覽密碼,輸入該密碼打開pdf後根據設置的權限進行控制,第二個密碼屬於全部者密碼,使用該密碼打開pdf權限不受控制。
其實很簡單,第一個頁面不變,從第二個起:
for(int i = 1; i < inputFile.length; i++) { renderer.setDocument(new File(root, inputFile[i])); renderer.layout(); renderer.writeNextDocument(); } renderer.finishPDF();
<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link href="****.css" rel="stylesheet" type="text/css" /> <bookmarks> <bookmark name="a" href="#a" /> <bookmark name="b" href="#b" /> </bookmarks> </head>
注意,若是你是將多個頁面生成到一個pdf中,那麼只要在最後一個頁面中加入bookmark就能夠了!不然會重複。
頁面生成橫向的pdf
在html的style裏面加入pdf能識別的樣式,@page{}這個就是與其餘樣式區別開來的標誌,例如這裏面寫@page{size:297mm 210mm;}這個就表示紙張的寬是297毫米,高是210毫米,這樣打印出來的效果就跟橫着的A4紙同樣了,通常放在style第一行。
頁面其餘特性
全部style存放在css文件中(若是隻是某個特性能夠直接寫在html),使用link元素關聯,media="print"必須被設置。header和footer兩個div也是重要的,footer有兩個特殊的元素:pagenumber 、 pagecount,設置pdf頁數時被使用。
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Alice's Adventures in Wonderland -- Chapter I</title> <link rel="stylesheet" type="text/css" href="alice.css" media="print"/> </head> <body> <div id="header" style="">Alice's Adventures in Wonderland</div> <div id="footer" style=""> Page <span id="pagenumber"/> of <span id="pagecount"/> </div> <h1>CHAPTER I</h1> <h2>Down the Rabbit-Hole</h2> <p class="dropcap-holder"> <div class="dropcap">A</div> lice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, `and what is the use of a book,' thought Alice `without pictures or conversation?' </p> <p>So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid), whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly a White Rabbit with pink eyes ran close by her. </p> <p class="figure"> <img src="alice2.gif" width="200px" height="300px"/> <br/> <b>White Rabbit checking watch</b> </p> ... the rest of the chapter
@page { size: 4.18in 6.88in; margin: 0.25in; -fs-flow-top: "header"; -fs-flow-bottom: "footer"; -fs-flow-left: "left"; -fs-flow-right: "right"; border: thin solid black; padding: 1em; } #header { font: bold serif; position: absolute; top: 0; left: 0; -fs-move-to-flow: "header"; } #footer { font-size: 90%; font-style: italic; position: absolute; top: 0; left: 0; -fs-move-to-flow: "footer"; } #pagenumber:before { content: counter(page); } #pagecount:before {content: counter(pages); }