iTextRenderer(Flying Saucer) HTML转PDF
iTextRenderer(Flying Saucer) HTML轉(zhuǎn)PDF
?iTextRenderer 在依賴 iText 的基礎(chǔ)上,單獨(dú)實(shí)現(xiàn)了HTML渲染PDF,基本上能實(shí)現(xiàn) CSS 2.1的整體性,并且完全符合 W3C 規(guī)范。
使用html和css定義樣式和呈現(xiàn)的內(nèi)容。如下流程圖:
?
?
中文支持
首先需要添加中文字庫,也就是你的頁面中用到的所有字體:
| 1 2 3 4 | 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!,首字母都是大寫的)
???? ?錯(cuò)誤寫法:font-family:宋體 或者 ?font-family:simsun
??????正確寫法:font-family:SimSun 或者?font-family:SimHei
如果生成的pdf中文不顯示或者亂碼,請確認(rèn)如下信息:
-
確保頁面中所有內(nèi)容都指定了字體,最好能指定 body {font-family:....},以防止漏網(wǎng)之魚。
-
確保上述所有字體均通過addFont加入,字體名稱錯(cuò)誤或者字體不存在會拋出異常,很方便,但是沒導(dǎo)入的字體不會有任何提示。
-
確保字體名稱正確,不使用中文,大小寫正確。
-
確保html標(biāo)簽都正確,簡單的方法是所有內(nèi)容都去掉,隨便寫幾個(gè)中文看看能否正常生成,如果可以,在認(rèn)真檢查html標(biāo)簽,否則再次檢查上述幾條。
還有就是中文換行的問題了,帶有中文而且文字較多存在換行情況時(shí),需要給table加入樣式:
table-layout:fixed,然后表格中的td使用%還指定td的寬度。
?
加密及權(quán)限
加密方法較為簡單:
| 1 2 3 4 5 6 7 8 | 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,百度一下很多的。
兩個(gè)參數(shù):兩個(gè)都是密碼,不同的是第一個(gè)密碼是瀏覽密碼,輸入該密碼打開pdf后根據(jù)設(shè)置的權(quán)限進(jìn)行控制,第二個(gè)密碼屬于所有者密碼,使用該密碼打開pdf權(quán)限不受控制。
多頁面生成pdf
其實(shí)很簡單,第一個(gè)頁面不變,從第二個(gè)起:
| 1 2 3 4 5 6 7 | for(int?i =?1; i < inputFile.length; i++) ????{ ????????renderer.setDocument(new?File(root, inputFile[i])); ????????renderer.layout(); ????????renderer.writeNextDocument(); ????} ????renderer.finishPDF(); |
標(biāo)簽
| 1 2 3 4 5 6 7 8 | <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> |
注意,如果你是將多個(gè)頁面生成到一個(gè)pdf中,那么只要在最后一個(gè)頁面中加入bookmark就可以了!否則會重復(fù)。
?
頁面生成橫向的pdf
在html的style里面加入pdf能識別的樣式,@page{}這個(gè)就是與其他樣式區(qū)別開來的標(biāo)志,例如這里面寫@page{size:297mm 210mm;}這個(gè)就表示紙張的寬是297毫米,高是210毫米,這樣打印出來的效果就跟橫著的A4紙一樣了,一般放在style第一行。
?
頁面其他特性
所有style存放在css文件中(如果只是某個(gè)特性可以直接寫在html),使用link元素關(guān)聯(lián),media="print"必須被設(shè)置。header和footer兩個(gè)div也是重要的,footer有兩個(gè)特殊的元素:pagenumber ?、 pagecount,設(shè)置pdf頁數(shù)時(shí)被使用。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <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 |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | @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); } |
原文地址:http://www.cnblogs.com/reese-blogs/p/5546806.html ps:當(dāng)打印的內(nèi)容含有“&”字符時(shí),應(yīng)將"&"替換為“&”; ?且要實(shí)現(xiàn)加粗的同學(xué)可能要另找其他的方法咯。
總結(jié)
以上是生活随笔為你收集整理的iTextRenderer(Flying Saucer) HTML转PDF的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 24/7专业家庭安全监控值得吗?
- 下一篇: Python之plot()与Tk窗体的绑