歡迎點(diǎn)擊此處訂閱本Blog" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Java動(dòng)態(tài)生成PDF的兩個(gè)開(kāi)源工具-iText與FOP

系統(tǒng) 1871 0
<!-- Feedsky FEED發(fā)布代碼開(kāi)始 --> 歡迎點(diǎn)擊此處訂閱本Blog <!-- FEED自動(dòng)發(fā)現(xiàn)標(biāo)記開(kāi)始 --> <link title="RSS 2.0" type="application/rss+xml" rel="alternate"> <!-- FEED自動(dòng)發(fā)現(xiàn)標(biāo)記結(jié)束 --> Blog 訂閱

<!--Google 468*60橫幅廣告開(kāi)始--><script type="text/javascript"><!-- google_ad_client = "pub-7343546549496470"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as"; google_ad_type = "image"; //2007-07-26: CSDN google_ad_channel = "6063905817"; google_color_border = "6699CC"; google_color_bg = "E6E6E6"; google_color_link = "FFFFFF"; google_color_text = "333333"; google_color_url = "AECCEB"; google_ui_features = "rc:6"; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><!--Google 468*60橫幅廣告結(jié)束-->

本文轉(zhuǎn)自 http://www.blogjava.net/sean/archive/2008/10/05/232577.html

由于工作需要,今天簡(jiǎn)單的看了一下Java生成PDF的相關(guān)資料。綜合看下來(lái),除了使用報(bào)表平臺(tái)和OOo的附帶工具,目前使用較為普遍的有兩個(gè)途徑:iText和Apache的FOP。從實(shí)際出發(fā),我們分別看看兩者處理帶有中文的PDF的具體用法吧。

[iText] ( link )

iText 我想大概不少人都有所耳聞,JasperReports默認(rèn)的PDF支持就來(lái)自這個(gè)軟件包,它處理速度快,支持很多PDF"高級(jí)"特性, 如:Annotations、AcroForms、數(shù)字簽名、加密等,支持對(duì)已有PDF的處理,通過(guò)iTextAsian.jar和 iTextAsianCmaps.jar,它對(duì)中文的支持也不錯(cuò)。缺點(diǎn)是較為依賴Java代碼,需要學(xué)習(xí)不少的專有API,當(dāng)輸入/輸出格式有變化時(shí),需 要修改代碼(除非手工寫一些wrapper),不夠靈活。目前的版本是2.1.3。具體代碼:

Formatter.java
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 import java.io.FileOutputStream;
2
3 import com.lowagie.text.Document;
4 import com.lowagie.text.Font;
5 import com.lowagie.text.PageSize;
6 import com.lowagie.text.Paragraph;
7 import com.lowagie.text.pdf.BaseFont;
8 import com.lowagie.text.pdf.PdfWriter;
9
10 public class Formatter{
11
12 public static void main(String[]args) throws Exception{
13 Documentdocument = new Document(PageSize.A4);
14 try {
15 System.out.print( " GeneratingPDF " );
16 PdfWriter.getInstance(document, new FileOutputStream( " test.pdf " ));
17 document.open();
18 // iText自帶的中文字體
19 BaseFontbf1 = BaseFont.createFont( " STSong-Light " , " UniGB-UCS2-H " ,BaseFont.NOT_EMBEDDED);
20 // 自定義字體
21 BaseFontbf2 = BaseFont.createFont( " wqy-zenhei.ttf " ,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
22 Fontfont = new Font(bf2, 12 ,Font.NORMAL);
23 Paragraphp = new Paragraph( " 測(cè)試abc中文123 " ,font);
24 document.add(p);
25 System.out.println( " Done. " );
26 } finally {
27 document.close();
28 }
29 }
30
31 }

效果:
itext.png

中文支持有默認(rèn)的STSong-Light等字體,但為了優(yōu)化輸出效果,這里使用了文泉驛正黑字體。如果不指定中文字體,默認(rèn)情況下中文字符不會(huì)顯示。

[FOP] ( link )

FOP 出自Apache,在各大Java網(wǎng)站、論壇出現(xiàn)相對(duì)較低,我也是從DocBook這條線摸進(jìn)來(lái)的,DocBook主要提供了一個(gè)現(xiàn)成的、符合一般技術(shù)書 籍要求的數(shù)據(jù)結(jié)構(gòu),而展現(xiàn)效果(如PDF),則是通過(guò)預(yù)定義好的XSL-FO來(lái)實(shí)現(xiàn)的。XSL-FO是W3C的標(biāo)準(zhǔn),正式的名稱是XSL,是XSL相關(guān)的 三大組件/語(yǔ)言中的一個(gè),另外兩個(gè)是XSLT和XPath。Apache的FOP是處理FO的眾多proecessor之一,相比iText,支持的輸出 格式更多,對(duì)W3C相關(guān)標(biāo)準(zhǔn)支持度高,格式定義可以完全脫離具體的Java代碼,十分靈活,且控制力很強(qiáng)。缺點(diǎn)是大數(shù)據(jù)量時(shí)性能較差,默認(rèn)中文支持不好。 目前的版本是0.95。具體代碼:

test.xml
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 <? xmlversion="1.0"encoding="UTF-8" ?>
2 < source >
3 < title >
4 FOPSample
5 </ title >
6 < paragraph >
7 測(cè)試abc中文123
8 </ paragraph >
9 </ source >

test.xsl
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 <? xmlversion="1.0"encoding="UTF-8" ?>
2 < xsl:transform version ="1.0"
3 xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"
4 xmlns:fo ="http://www.w3.org/1999/XSL/Format" >
5
6 < xsl:template match ="/" >
7 < fo:root >
8 < fo:layout-master-set >
9 < fo:simple-page-master master-name ="A4-portrait"
10 page-height ="29.7cm" page-width ="21.0cm" margin ="2cm" >
11 < fo:region-body />
12 </ fo:simple-page-master >
13 </ fo:layout-master-set >
14 < fo:page-sequence master-reference ="A4-portrait" >
15 < fo:flow flow-name ="xsl-region-body" >
16 < fo:block font-family ="WenQuanYiZenHei" font-size ="24pt" >
17 < xsl:value-of select ="source/title" />
18 </ fo:block >
19 < fo:block font-family ="WenQuanYiZenHei" text-indent ="1cm" >
20 < xsl:value-of select ="source/paragraph" />
21 </ fo:block >
22 </ fo:flow >
23 </ fo:page-sequence >
24 </ fo:root >
25 </ xsl:template >
26
27 </ xsl:transform >

fop-config.xml
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 <? xmlversion="1.0" ?>
2 < fop version ="1.0" >
3 < base > . </ base >
4 < source-resolution > 72 </ source-resolution >
5 < target-resolution > 72 </ target-resolution >
6 < default-page-settings height ="29.7cm" width ="21.0cm" />
7 < renderers >
8 < renderer mime ="application/pdf" >
9 < filterList >
10 < value > flate </ value >
11 </ filterList >
12 < fonts >
13 < directory > . </ directory >
14 < auto-detect />
15 </ fonts >
16 </ renderer >
17 </ renderers >
18 </ fop >

Formatter.java
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 import java.io.File;
2 import java.io.FileOutputStream;
3 import java.io.OutputStream;
4
5 import javax.xml.transform.Result;
6 import javax.xml.transform.Source;
7 import javax.xml.transform.Transformer;
8 import javax.xml.transform.TransformerFactory;
9 import javax.xml.transform.sax.SAXResult;
10 import javax.xml.transform.stream.StreamSource;
11
12 import org.apache.fop.apps.FOUserAgent;
13 import org.apache.fop.apps.Fop;
14 import org.apache.fop.apps.FopFactory;
15 import org.apache.fop.apps.MimeConstants;
16
17 public class Formatter{
18
19 public static void main(String[]args) throws Exception{
20 Filesource = new File( " test.xml " );
21 Filespecs = new File( " test.xsl " );
22 Filetarget = new File( " test.pdf " );
23 FopFactoryfopFactory = FopFactory.newInstance();
24 fopFactory.setUserConfig( " fop-config.xml " ); // 讀取自定義配置
25 FOUserAgentfoUserAgent = fopFactory.newFOUserAgent();
26 OutputStreamout = new FileOutputStream(target);
27 out = new java.io.BufferedOutputStream(out);
28 try {
29 System.out.print( " GeneratingPDF " );
30 Fopfop = fopFactory.newFop(MimeConstants.MIME_PDF,foUserAgent,out);
31 TransformerFactoryfactory = TransformerFactory.newInstance();
32 Transformertransformer = factory.newTransformer( new StreamSource(specs));
33 Sourcesrc = new StreamSource(source);
34 Resultres = new SAXResult(fop.getDefaultHandler());
35 transformer.transform(src,res);
36 System.out.println( " Done. " );
37 } finally {
38 out.close();
39 }
40 }
41
42 }

效果:
fop.png

FOP 的中文支持(其實(shí)是自定義字體支持),在0.94版本之前,十分有限,對(duì)每一個(gè)需要使用的TrueType字體,都需要生成一個(gè)metrics文件,在 0.94和之后的版本,則沒(méi)有這個(gè)要求,且可以自動(dòng)掃描系統(tǒng)字體和指定文件夾中的TTF字體。如果不配置中文字體,默認(rèn)情況下,中文字符在PDF中將被處 理成"#"。

上面的示例代碼雖然簡(jiǎn)單,但展示了FOP真正強(qiáng)大的地方,那就是控制力。這里篇幅有限,不可能全部特性都一一涉及,這個(gè)簡(jiǎn)單 的例子至少可以讓我們看到從原始的XML格式的數(shù)據(jù),通過(guò)XSLT按照自定義的規(guī)則轉(zhuǎn)換成XSL-FO,最后輸出到PDF的過(guò)程,每一步都可以在Java 代碼之外進(jìn)行嚴(yán)格控制。

以上是我對(duì)iText和FOP一些基本特點(diǎn)和用法的整理,它們各有特點(diǎn),大家可以根據(jù)各自需要繼續(xù)深入研究,F(xiàn)OP和iText相結(jié)合也未嘗不可。希望能夠幫助到有需要的朋友。

<!--新Google 468*60橫幅廣告開(kāi)始--><script type="text/javascript"><!-- google_ad_client = "pub-7343546549496470"; /* 468x60, 創(chuàng)建于 08-8-6 */ google_ad_slot = "7368701459"; google_ad_width = 468; google_ad_height = 60; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><!--新Google 468*60橫幅廣告結(jié)束-->

<!--新Google 468x15 橫鏈接單元開(kāi)始--><script type="text/javascript"><!-- google_ad_client = "pub-7343546549496470"; /* 468x15 橫鏈接單元 */ google_ad_slot = "5785741422"; google_ad_width = 468; google_ad_height = 15; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><!--新Google 468x15 橫鏈接單元結(jié)束-->

<!-- Google Reader shared發(fā)布代碼開(kāi)始 --><script type="text/javascript" src="http://www.google.com/reader/ui/publisher.js"></script><script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/00697638153916680411/state/com.google/broadcast?n=5&amp;callback=GRC_p(%7Bc%3A%22green%22%2Ct%3A%22%5Cu8FD9%5Cu4E9B%5Cu6587%5Cu7AE0%5Cu4E5F%5Cu503C%5Cu5F97%5Cu4E00%5Cu770B%22%2Cs%3A%22false%22%7D)%3Bnew%20GRC"></script><!-- Google Reader shared發(fā)布代碼結(jié)束 -->

Java動(dòng)態(tài)生成PDF的兩個(gè)開(kāi)源工具-iText與FOP


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美一级久久久久久久大片 | 一级毛片国产真人永久在线 | 九九精品视频在线观看九九 | 日韩精品一区在线观看 | 日本精品久久无码影院 | 91九色视频| 欧美精品综合一区二区三区 | 亚洲影视在线 | 欧美在线黄 | 亚洲AV久久无码精品九九九小说 | 亚洲成网站www久久九 | 日韩精品免费视频 | 91亚瑟视频 | 欧美高清在线视频一区二区 | 亚洲午夜精品aaa级久久久久 | 国内真实迷j下药在线观看 人人艹逼 | 国产精品成人av | 欧美一级在线观看 | 热99久久| 在线观看av网站永久 | 亚洲精品高清视频 | 精品国产一区二区三区性色av | av一二三区| 91久久国产综合久久 | 91麻豆国产极品在线观看洋子 | 天天影视综合网色综合国产 | 日本黄色大片免费观看 | 国产高清一国产免费软件 | 免费一级毛片不卡在线播放 | 日本精品在线 | 国产一区二区免费 | 91精品国产一区二区三区蜜臀 | 精品综合久久久久久99 | 国产精品19禁在线观看2021 | 日本无卡无吗在线 | 精品国产青草久久久久福利 | 免费成人午夜视频 | 亚洲一区二区三区视频 | 五月婷婷丁香在线观看 | 日韩av线 | 99青草青草久热精品视频 |