最近調查了一個新鮮東東。XSL-FO和FOP,用來將FO文件生成PDF文件,覺得它是個不錯的東東,所以記下來,與大家分享。
相關術語:
XSL-FO(XML?Stylesheet?Language-Formatting?Objects)
XSL-T(XSL Transformations)
FOP?(Formatting?Objects?Processor)?
英文教程:
FOP下載地址:
注意:fop.jar要放在你的CLASSPATH中。
?
命令格式:
-------------------------------------------------------------------
至于XSL-FO的起源,特點和作用我就不多啰嗦了,祥細說明在網上到處都是,自已去看吧。我只想來點實用的。在這里只要了解一點,XSL-FO他只是描述了頁面展現給用戶的時候它應該是什么樣子的就行了。
?
1:直接將fo文件通過FOP命令轉換成pdf文件。
格式: fop test.fo test.pdf
?
2:將xml+xslt(樣式表文件)轉換成pdf文件。
格式:fop -xsl test.xsl -xml test.xml -pdf test.pdf
--------------------------------------------------------------------
?
對雙字節(中/日文)的支持:
--------------------------------------------------------------------
這里我只介紹日文的例子,中文照著做就行了。
實現步驟:
1.使用批處理生成字體文件(XML)
java -cp build\fop.jar;lib\avalon-framework-cvs-20020806.jar; org.apache.fop.fonts.apps.TTFReader -ttcname "MS Gothic" C:\WINNT\Fonts\MSGOTHIC.TTC msgothic.xml
注意:TTC文件和TTF文件的生成方式不同。
上面給出的是TTC字體文件的例子。
TTF命令格式是:
java -cp build\fop.jar;lib\avalon-framework-cvs-20020806.jar; org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\Cyberbit.ttf msmincho.xml
?
上面只用到了fop.jar和avalon-framework-cvs-20020806.jar,這因為我的FOP Ver是0.20.5,如果小于這個版本則要加上其他的包,這個在網上的教程沒有說,
結果我用他們給出的命令格式狂試,結果就是出錯,最后還是在apache網上找到了正解,
擦汗....
?
2.將生成的字體文件注冊到fop。
修改下面的配置文件conf/userconfig.xml
增加下面的內容:
<!-- Example Japanese fonts -->
?<font metrics-file="D:\xslfo\fop-0.20.5\msgothic.xml" embed-file="c:\winnt\fonts\msgothic.ttc" kerning="yes">
??? <font-triplet name="Gothic" style="normal" weight="normal"/>
??? <font-triplet name="Gothic" style="normal" weight="bold"/>
??? <font-triplet name="Gothic" style="italic" weight="normal"/>
??? <font-triplet name="Gothic" style="italic" weight="bold"/>
?</font>
?
3.利用FOP再次生成PDF文件(FOP命令格式有變)
修改你的FOP.BAT批處理文件,將最后一行
java -cp "%LOCALCLASSPATH%" org.apache.fop.apps.Fop %1 %2 %3 %4 %5 %6 %7 %8
?
修改成
java -cp "%LOCALCLASSPATH%" org.apache.fop.apps.Fop -c conf/userconfig.xml %1 %2 %3 %4 %5 %6 %7 %8
也就是增加了-c conf/userconfig.xml參數。
網上很多地方這一點也沒說到,害得我注冊好字體后怎么試都不成功,生成的PDF就是不能正常顯示日文。后來想想修改后的配置文件沒有用到,到網上查了一下才知道那里要修改一下,增加-c參數,我狂暈~~~~~。
?
要驗證你的日文是否被正確顯示,針對FO文件需要修改以下地方有:
原:<fo:block font-size="20pt" font-family="serif"
??????????????? line-height="30pt">
??????? Hello~kaegunテスト
????? </fo:block>
現:<fo:block font-size="20pt" font-family="Gothic"
??????????????? line-height="30pt">
??????? Hello~kaegunテスト
????? </fo:block>
?
如果你是用XML+XSLT的方式成生PDF,則要修改xsl文件
原:<xsl:template match="name">??????
?????? <fo:block font-size="18pt"
???????????? font-family="serif"
???????????? line-height="24pt"
???????????? space-after.optimum="15pt"
???????????? background-color="blue"
???????????? color="white"
???????????? text-align="center"
???????????? padding-top="3pt">
???????? <xsl:value-of select="."/>
?????? </fo:block>
?</xsl:template>
現:<xsl:template match="name">??????
?????? <fo:block font-size="18pt"
???????????? font-family="Gothic"
???????????? line-height="24pt"
???????????? space-after.optimum="15pt"
???????????? background-color="blue"
???????????? color="white"
???????????? text-align="center"
???????????? padding-top="3pt">
???????? <xsl:value-of select="."/>
?????? </fo:block>
?</xsl:template>
經過上述操作后,用新的批處理命令即可生成能正確顯示日文的PDF文件了。