<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Read Sean

    Read me, read Sean.
    posts - 508, comments - 655, trackbacks - 9, articles - 4

    由于工作需要,今天簡(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
    ?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?????????Document?document?=?new?Document(PageSize.A4);
    14?????????try?{
    15?????????????System.out.print("Generating?PDF");
    16?????????????PdfWriter.getInstance(document,?new?FileOutputStream("test.pdf"));
    17?????????????document.open();
    18?????????????//iText自帶的中文字體
    19?????????????BaseFont?bf1?=?BaseFont.createFont("STSong-Light",?"UniGB-UCS2-H",?BaseFont.NOT_EMBEDDED);
    20?????????????//自定義字體
    21?????????????BaseFont?bf2?=?BaseFont.createFont("wqy-zenhei.ttf",?BaseFont.IDENTITY_H,?BaseFont.NOT_EMBEDDED);
    22?????????????Font?font?=?new?Font(bf2,?12,?Font.NORMAL);
    23?????????????Paragraph?p?=?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ū)籍要求的數(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
    ?1?<?xml?version="1.0"?encoding="UTF-8"?>
    ?2?<source>
    ?3?????<title>
    ?4?????????FOP?Sample
    ?5?????</title>
    ?6?????<paragraph>
    ?7?????????測(cè)試abc中文123
    ?8?????</paragraph>
    ?9?</source>

    test.xsl
    ?1?<?xml?version="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="WenQuanYi?Zen?Hei"?font-size="24pt">
    17?????????????<xsl:value-of?select="source/title"/>
    18???????????</fo:block>
    19???????????<fo:block?font-family="WenQuanYi?Zen?Hei"?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
    ?1?<?xml?version="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
    ?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?????????File?source?=?new?File("test.xml");
    21?????????File?specs?=?new?File("test.xsl");
    22?????????File?target?=?new?File("test.pdf");
    23?????????FopFactory?fopFactory?=?FopFactory.newInstance();
    24?????????fopFactory.setUserConfig("fop-config.xml");?//?讀取自定義配置
    25?????????FOUserAgent?foUserAgent?=?fopFactory.newFOUserAgent();
    26?????????OutputStream?out?=?new?FileOutputStream(target);
    27?????????out?=?new?java.io.BufferedOutputStream(out);
    28?????????try?{
    29?????????????System.out.print("Generating?PDF");
    30?????????????Fop?fop?=?fopFactory.newFop(MimeConstants.MIME_PDF,?foUserAgent,?out);
    31?????????????TransformerFactory?factory?=?TransformerFactory.newInstance();
    32?????????????Transformer?transformer?=?factory.newTransformer(new?StreamSource(specs));
    33?????????????Source?src?=?new?StreamSource(source);
    34?????????????Result?res?=?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é)合也未嘗不可。希望能夠幫助到有需要的朋友。

    Feedback

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2008-10-06 08:43 by 123
    FOP沒(méi)有使用過(guò),上個(gè)周就用iText做了一個(gè)PDF報(bào)表,還不錯(cuò),很強(qiáng)大。
    不過(guò),郁悶的是,對(duì)網(wǎng)頁(yè)轉(zhuǎn)成PDF格式,都不怎么樣。
    估計(jì)是網(wǎng)頁(yè)格式里用了層的原因吧。

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇[未登錄](méi)  回復(fù)  更多評(píng)論   

    2008-10-06 23:14 by shenguanghua
    itext我覺(jué)得最難的是排版,希望大哥能重點(diǎn)講些排版的例子

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2008-10-07 14:14 by innate
    IText在Html支持上,表格的寬度控制有bug,我用的是2.1.2不知道更新的有沒(méi)有解決

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2008-10-07 14:16 by innate
    IText中文支持也不是很好,曾經(jīng)在中文問(wèn)題上郁悶了很長(zhǎng)時(shí)間。
    我用IText一般都是結(jié)合他的Html進(jìn)行的,排版上問(wèn)題不大,但是有些地方還是不好看。

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2008-10-08 00:50 by 大胃
    iText對(duì)中文的支持至少一方面自帶了中文字體,另外也可以通過(guò)normal體計(jì)算出粗體和斜體,不像FOP完全依賴字體文件。

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2008-11-04 11:15 by ALGO
    很多java的PDF都是以iText為底層的,iText的文檔中也提到,他們不打算做一個(gè)完整的html2pdf converter,并推薦ICE Browser SDK和另外一個(gè)什么來(lái)著,ice我試過(guò),效果相對(duì)好很多,對(duì)普通html就能支持,不過(guò)可惜這個(gè)庫(kù)是要賣錢的。

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2008-11-04 12:05 by 大胃
    從對(duì)Java友好這個(gè)角度,iText確實(shí)不錯(cuò),但正因?yàn)檫@個(gè)特點(diǎn),脫離了手寫的Java代碼,操作起來(lái)也就不是那么方便了。不像FOP,雖然不是100%標(biāo)準(zhǔn)實(shí)現(xiàn),但思路還是清晰的,基本按照XSL-FO定義就能夠做出比較漂亮的排版,不需要寫任何Java代碼。文中的例子只是示意,其實(shí)FOP通過(guò)命令行就能玩轉(zhuǎn),就算通過(guò)Java代碼去調(diào)用,這段Java也是寫一次就好,不管你格式多復(fù)雜。

    對(duì)于項(xiàng)目預(yù)算有限,或者由于其他原因不能或不希望采用商業(yè)解決方案的情況,iText和FOP都是不錯(cuò)的選擇,看具體項(xiàng)目/工程需要吧。對(duì)于純輸出,以我實(shí)際使用看,F(xiàn)OP效果已經(jīng)很好了,大不了多寫點(diǎn)XML,多畫(huà)點(diǎn)<fo:table/>,死不了。

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2008-11-04 13:35 by ALGO
    我正有一個(gè)項(xiàng)目需要做這種html2pdf的轉(zhuǎn)換,咨詢過(guò)ICE Browser, 但是他們說(shuō)2010年后不再提供支持,看來(lái)生意做得也不好。此外有什么好的推薦嗎?

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2008-11-04 14:44 by 大胃
    現(xiàn)在很多商用軟件受到同類型開(kāi)源軟件的沖擊都比較大,有些被迫開(kāi)源,有些則慢慢淡出視線。

    曾經(jīng)看過(guò)AntennaHouse的FO實(shí)現(xiàn),好像還不錯(cuò),你可以看看:
    http://www.antennahouse.com/

    其實(shí)Apache的FOP已經(jīng)很好了,主要是花時(shí)間熟悉FO語(yǔ)法。

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2015-04-14 16:23 by fop
    代碼拷貝運(yùn)行報(bào)錯(cuò)啊

    # re: iText vs FOP - Java動(dòng)態(tài)生成PDF的兩個(gè)選擇  回復(fù)  更多評(píng)論   

    2015-04-14 16:25 by fop
    用0.95報(bào)錯(cuò)的大概意思是還不支持。。。。。
    本地字庫(kù)的字體embet不進(jìn)去。。。。
    主站蜘蛛池模板: 亚洲AV无码成人网站久久精品大 | 免费久久人人爽人人爽av| 亚洲无线码在线一区观看| 中文字幕在线免费| 亚洲avav天堂av在线网毛片| 亚洲综合国产精品第一页| 在线看无码的免费网站| 羞羞漫画小舞被黄漫免费| 亚洲AV无码精品色午夜果冻不卡 | 国产亚洲成在线播放va| 亚洲va久久久噜噜噜久久狠狠| 日本免费一区二区在线观看| 久久精品国产亚洲AV| 亚洲精品无码专区久久久| 69成人免费视频| 免费看一级毛片在线观看精品视频| 亚洲精品~无码抽插| 毛片免费视频播放| 国产免费一级高清淫曰本片| 亚洲嫩草影院在线观看| 亚洲美女在线国产| 在线看免费观看AV深夜影院| 成人午夜免费视频| 亚洲av无码一区二区三区天堂古代| 亚洲第一成人影院| 美女裸身网站免费看免费网站| 一级特级aaaa毛片免费观看| 亚洲午夜在线一区| 亚洲精品国产精品乱码视色| 最近中文字幕无吗高清免费视频| 中文字幕视频在线免费观看| 亚洲国产成人AV在线播放| 久久久久久久综合日本亚洲| 免费一看一级毛片全播放| 免费H网站在线观看的| 久久黄色免费网站| 亚洲精品国产日韩无码AV永久免费网| 亚洲H在线播放在线观看H| 亚洲国产高清在线| 在线亚洲午夜理论AV大片| 国产午夜鲁丝片AV无码免费|