青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

如何在程序中嵌入FOP

FOP 簡介

developerWorks
文檔選項
將此頁作為電子郵件發送

將此頁作為電子郵件發送

未顯示需要 JavaScript 的文檔選項


最新推薦

Java 應用開發源動力 - 下載免費軟件,快速啟動開發


級別: 初級

馬 路 ,

2001 年 11 月 01 日

如何在程序中嵌入FOPFOP是由James Tauber發起的一個開源項目,最初的目的是利用xsl-fo將xml文件轉換成pdf文件。目前最新的版本是2001年9月29日發布的0.20.2,它可以將xml文件轉換成pdf,mif,pcl,txt等多種格式以及直接輸出到打印機,并且支持使用SVG描述圖形。XML顯然是最好的內容存儲格式,而PDF是目前最流行的內容載體格式,FOP顯然希望借助這種必然的XML to PDF需求,來推動xsl-fo規范的發展。雖然xsl-fo規范停滯不前,但利用FOP能使自己的程序具有將XML內容輸出成PDF等流行格式的功能無疑是令人興奮的。

FOP使用方式

FOP有3種使用方式,分別為命令行,程序嵌入,XT 嵌入,這里將主要介紹如何在程序中嵌入FOP功能。將XML文件轉換為PDF實際上分為2步,第1步是利用XSLT將XML轉換為XSL-FO,第2步是將XSL-FO轉換為PDF。這里不想講述XSLT和XSL-FO有關的知識(這方面的文檔相當多),而只將講述如何進行第2步的轉換編程。

在程序中嵌入FOP

1. 范例simple.fo文件

												
														<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <fo:layout-master-set>
    <fo:simple-page-master master-name="simple"
                  page-height="29.7cm" 
                  page-width="21cm"
                  margin-top="1cm" 
                  margin-bottom="2cm" 
                  margin-left="2.5cm" 
                  margin-right="2.5cm">
      <fo:region-body margin-top="3cm"/>
      <fo:region-before extent="3cm"/>
      <fo:region-after extent="1.5cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:page-sequence master-name="simple">
    <fo:flow flow-name="xsl-region-body">
       <!-- Title -->
      <fo:block font-size="18pt" 
            font-family="sans-serif" 
            line-height="24pt"
            space-after.optimum="15pt"
            background-color="blue"
            color="white"
            text-align="center"
            padding-top="3pt">
            FOP 0.20.2
      </fo:block>
      <!-- Normal Text -->
      <fo:block font-size="12pt" 
                font-family="sans-serif" 
                line-height="15pt"
                space-after.optimum="3pt"
                text-align="justify">
FOP is the world's first print formatter driven by XSL formatting objects.
It is a Java application that reads a formatting object tree and then turns it into a PDF document.
      </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>
												
										

上述是一個很簡單的fo文件,將顯示兩塊文字,具體的fo語法請讀者自己查看相應資料。

2. 簡單調用FOP
FOP提供的所有對外調用接口都在org.apache.fop.apps下,其下的AWTStarter.class是一個用AWT寫的轉換結果預覽程序,CommandLineStarter.class提供命令行使用方式,PrintStarter.class提供打印接口,XTDriver.class提供XT嵌入方式接口,Driver.class則是我們要在這里討論的程序接口。下面這個程序foptest.java演示了FOP的最簡單也是最常用的使用方式。

												
														import java.io.*;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.apache.fop.apps.*;

public class foptest {
    public static void main(String[] args) {
        try {
            Driver driver = new Driver();
            //設置要轉換的fo文件名
            driver.setInputSource(new InputSource (args[0]));
            //設置輸出文件名
            driver.setOutputStream(new FileOutputStream(args[1]));
            //設置轉換類型
            //還可以為RENDER_PCL,RENDER_PS,RENDER_TXT,RENDER_MIF
            driver.setRenderer(Driver.RENDER_PDF);
            //開始轉換
            driver.run();
        }
        catch( Exception e ){
            e.printStackTrace();
        }
    }
}
												
										

上述程序將接受兩個命令行參數,第一個參數是需要轉換的fo文件名,第二個參數是輸出文件名。在CLASSPATH中添加下述jar文件: {FOP安裝目錄}\build\fop.jar
{FOP安裝目錄}\lib\batik.jar
{FOP安裝目錄}\lib\xalan-2.0.0.jar
{FOP安裝目錄}\lib\xerces-1.2.3.jar
{FOP安裝目錄}\lib\avalon-framework-4.0.jar
{FOP安裝目錄}\lib\logkit-1.0b4.jar
{FOP安裝目錄}\lib\jimi-1.0.jar
然后執行java foptest simple.fo simple.pdf

執行后產生的simple.pdf文件效果如下



3. 顯示中文
上面的演示程序段可以應付絕大部分轉換編程的需要,不過對于國內用戶來說,不可避免的需要產生中文PDF文件,讓我們把上述simple.fo的標題從"FOP 0.20.2"改成"支持中文的FOP 0.20.2",不改動程序的情況下執行結果顯示如下



可以看到由于沒有加入相應的字體支持,漢字被顯示成了#。

東方字符的顯示在FOP的早期版本中并不被支持,最早嘗試對FOP打補丁以解決顯示東方字符的是日本人。從FOP 0.16版本開始,他們在sourceforge上建立了一個jpfop項目來解決日文字符的顯示問題,使用相同的方法也可以被用來顯示中文字符。幸運的是,當前的FOP版本已經能很好的解決中文顯示的問題,不再需要我們打補丁,下面是在FOP中使用中文的步驟:

  • 第一步,建立font metrics文件對于后綴為ttf的TrueType字體文件,我們可以執行以下命令來產生font metrics文件 java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\simkai.ttf simkai.xml
    這里simkai.xml就是我們為楷體產生的font metrics文件。對于Windows下的宋體來說,存在的是后綴為ttc的TrueType Collection文件,即包含多個TrueType的文件,這時首先要做的是得到這個Collection中所有TrueType的名字,執行以下命令(這個命令其實有錯誤):
    java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\simsun.ttc simsun.xml

    產生輸出如下:

    This is a TrueType collection file with2 fonts
    Containing the following fonts:
    SimSun
    NSimSun
    java.io.IOException: Failed to read font
            at org.apache.fop.fonts.TTFFile.readFont(TTFFile.java:388)
            at org.apache.fop.fonts.apps.TTFReader.loadTTF(TTFReader.java:181)
            at org.apache.fop.fonts.apps.TTFReader.main(TTFReader.java:143)
    

    后面的異常是由于我們給的參數不對(因為ttc不是ttf字體文件)造成的,FOP開發小組知道這個問題,但是可能覺得無關痛癢而沒去修正它。無論怎樣,我們得到了我們要得到的結果,里面含的字體名為SimSun和NSimSun,通過以下命令為其中的SimSun字體產生font metrics文件: java org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" C:\WINNT\Fonts\simsun.ttc simsun.xml -ttcname后面指定需要從ttc文件中提取的字體名稱

  • 第二步,登記上述字體

    在FOP主目錄下的conf子目錄下有一個userconfig.xml文件,為了方便,我們將它和上一步產生的simsun.xml,simkai.xml都拷貝到與我們的演示程序同一目錄下。在userconfig.xml的最后幾行有一個<fonts></fonts>標記區,我們在其中加入以下項:

    <font metrics-file="simsun.xml" kerning="yes" embed-file="c:\WINNT\fonts\simsun.ttc">
        <font-triplet name="mysimsun" style="normal" weight="normal"/>
     </font>
     <font metrics-file="simkai.xml" kerning="yes" embed-file="c:\WINNT\fonts\simkai.ttf">
        <font-triplet name="mysimkai" style="normal" weight="normal"/>
     </font>
    

    其中metrics-file里可以設相對路徑或絕對路徑(因為我們這里在同一目錄下,所以只需寫文件名即可),font-triplet里的name可以自己自由設定,并不要求與字體名一樣。設定這個名字后,在fo里就只能通過這個名字引用這個字體。

    為了演示中文顯示,范例simplecn.fo文件為

    <?xml version="1.0" encoding="gb2312"?>
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    
      <fo:layout-master-set>
        <fo:simple-page-master master-name="simple"
                      page-height="29.7cm" 
                      page-width="21cm"
                      margin-top="1cm" 
                      margin-bottom="2cm" 
                      margin-left="2.5cm" 
                      margin-right="2.5cm">
          <fo:region-body margin-top="3cm"/>
          <fo:region-before extent="3cm"/>
          <fo:region-after extent="1.5cm"/>
        </fo:simple-page-master>
      </fo:layout-master-set>
    
      <fo:page-sequence master-name="simple">
        <fo:flow flow-name="xsl-region-body">
          <fo:block font-size="18pt" 
                font-family="mysimsun" 
                line-height="24pt"
                text-align="center"
                padding-top="3pt">
                這是宋體
          </fo:block>
          <fo:block font-size="18pt" 
                font-family="mysimkai" 
                line-height="24pt"
                text-align="center"
                padding-top="3pt">
                這是楷體
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
    

    上述fo文件使用兩種字體分別顯示一行文字,注意在<fo:block>的屬性中的font-family被我們設成userconfig.xml中相應的名字。

    由于需要讀入userconfig.xml來得到字體信息,程序主體修改如下:

    Driver driver = new Driver();
    driver.setInputSource(new InputSource (args[0]));
    driver.setOutputStream(new FileOutputStream(args[1]));
    driver.setRenderer(Driver.RENDER_PDF);
    //讀入配置(在Options的構造函數中完成)
    Options options = new Options(new File("userconfig.xml"));
    driver.run();

    這里在run之前一行讀入配置(產生的Options的實例在以后沒有用處),執行結果為:







回頁首


總結

FOP從技術上說無疑是一個非常優秀的產品,但是目前它對用戶的開發支持顯然很欠缺。FOP的開發小組也意識到了這個問題,他們允諾在將來會建立一個專門的Web站點以及豐富它的文檔。如果現在就想使用更方便的產品的話,你也可以考慮一些商用產品,如RenderX和X2P。

另外需要注意的是,今年8月推出的FOP 0.20.1版本非常的不好,不但一些范例無法運行,而且附帶的源代碼有若干錯誤,而這個9月29日推出的0.20.2RC版本有極大的改進,建議大家盡快升級到這個版本。





回頁首


參考資料





回頁首


關于作者

馬路,2000級清華大學計算機系研究生,目前在清華大學Java應用技術實驗室學習。E-mail: stevema@263.net

posted on 2006-07-14 11:14 楊粼波 閱讀(389) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美风情在线| 午夜激情亚洲| 欧美+亚洲+精品+三区| 久久久久久九九九九| 伊人久久综合| 亚洲精品1区2区| 欧美国产免费| 亚洲欧美在线视频观看| 欧美一区亚洲| 亚洲精品视频在线观看免费| 一区二区三区成人精品| 国产区日韩欧美| 女同一区二区| 欧美一区二区三区精品电影| 久久精品综合| 国产丝袜美腿一区二区三区| 久久在线播放| 欧美日韩国产高清视频| 久久精品国产99国产精品澳门| 久久精品一区二区三区中文字幕| 亚洲精品中文在线| 亚洲综合激情| 亚洲美女少妇无套啪啪呻吟| 亚洲欧美一区二区三区在线| 亚洲成人直播| 午夜免费在线观看精品视频| 亚洲级视频在线观看免费1级| 亚洲视频在线一区| 亚洲国产日韩欧美一区二区三区| 99国产精品久久久久久久久久| 国产美女搞久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产午夜亚洲精品羞羞网站| 亚洲国产天堂网精品网站| 国产麻豆午夜三级精品| 欧美国产在线观看| 国产精品一级| 9i看片成人免费高清| 亚洲福利在线看| 亚洲欧洲av一区二区| 中文精品视频一区二区在线观看| 久久久综合网| 久久精品99久久香蕉国产色戒| 欧美理论电影在线观看| 裸体女人亚洲精品一区| 国产精品视频不卡| 亚洲视频大全| 亚洲桃色在线一区| 欧美日韩亚洲不卡| 亚洲第一久久影院| 在线看国产日韩| 欧美中文字幕视频| 久久国产精品久久w女人spa| 国产精品久久久久久久久久直播 | 日韩视频在线观看国产| 亚洲黄色尤物视频| 久久婷婷丁香| 欧美+日本+国产+在线a∨观看| 国产在线一区二区三区四区| 午夜亚洲激情| 久久久精品欧美丰满| 国产视频一区二区三区在线观看| 亚洲一区二区在线免费观看视频| 中文亚洲视频在线| 欧美日韩在线影院| 99精品免费| 亚洲欧美日韩国产另类专区| 国产精品国产a级| 中文国产成人精品| 欧美一区1区三区3区公司| 国产精品一区二区久久精品| 午夜精品久久久久| 久久久国产视频91| 亚洲大片免费看| 美女啪啪无遮挡免费久久网站| 欧美福利一区二区三区| 免费看的黄色欧美网站| 亚洲午夜一二三区视频| 欧美体内she精视频| 亚洲一区欧美| 久久综合九色九九| 亚洲欧洲日韩女同| 欧美日韩免费看| 亚洲欧美日本日韩| 麻豆久久久9性大片| 日韩一区二区精品葵司在线| 欧美视频一区二区三区…| 亚洲免费一在线| 欧美gay视频| 一区二区欧美激情| 国产香蕉97碰碰久久人人| 嫩草影视亚洲| 亚洲综合国产激情另类一区| 美女福利精品视频| 亚洲视频axxx| 伊人久久大香线蕉综合热线| 欧美三级乱码| 久久只精品国产| 一区二区三区日韩欧美精品| 久久这里有精品15一区二区三区| 一本到高清视频免费精品| 国产精品久久久久久久久久直播| 久久精品一区二区三区四区| 99re热这里只有精品免费视频| 久久精品一区二区三区不卡| 日韩亚洲精品电影| 精品动漫3d一区二区三区| 欧美性大战久久久久久久蜜臀| 久久精品国产亚洲一区二区三区 | 亚洲一区二区免费| 亚洲高清激情| 久久综合色一综合色88| 亚洲天堂久久| 亚洲精品视频在线观看免费| 国产一区91精品张津瑜| 欧美性片在线观看| 女仆av观看一区| 久久久91精品国产一区二区精品| 99视频国产精品免费观看| 欧美大片免费观看| 久久久久久日产精品| 亚洲欧美第一页| 亚洲午夜国产成人av电影男同| 在线日韩av片| 韩日在线一区| 国产视频亚洲精品| 国产欧美日韩视频一区二区| 国产精品qvod| 国产精品国产成人国产三级| 欧美日韩国产首页| 欧美屁股在线| 欧美精品在线观看| 欧美精品播放| 欧美激情综合在线| 欧美高清你懂得| 美女图片一区二区| 免费在线观看成人av| 六月天综合网| 久久只精品国产| 免费在线一区二区| 欧美高清视频一区二区三区在线观看 | 99精品久久久| 亚洲手机在线| 午夜久久tv| 亚洲欧美国产精品va在线观看| 中文有码久久| 欧美伊人精品成人久久综合97| 亚洲一区二区三区在线| 一区二区三区精品久久久| 一本色道久久88综合日韩精品| 一本大道久久精品懂色aⅴ | 国内精品视频在线播放| 国产一区二区三区日韩欧美| 激情成人综合网| 亚洲福利视频一区| 99国产精品久久久久久久久久| 一区二区国产在线观看| 亚洲性感美女99在线| 久热re这里精品视频在线6| 美女露胸一区二区三区| 欧美激情第9页| 国产精品美女xx| 狠狠v欧美v日韩v亚洲ⅴ| 最新亚洲激情| 亚洲欧美高清| 欧美 日韩 国产在线| 亚洲久久成人| 午夜在线电影亚洲一区| 另类酷文…触手系列精品集v1小说| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美午夜片在线观看| 国产视频在线观看一区| 亚洲国产精品久久| 亚洲视屏在线播放| 久久综合网hezyo| 亚洲狼人精品一区二区三区| 欧美一区亚洲| 欧美日韩一区二区三区在线看| 国产欧美精品一区二区色综合| 在线成人性视频| 亚洲免费在线播放| 欧美成人蜜桃| 亚洲欧美久久久久一区二区三区| 久久久精品国产免费观看同学| 欧美日韩国产色综合一二三四| 国内成人精品2018免费看| 亚洲毛片av| 久久伊人一区二区| 亚洲一区二区三区久久| 欧美~级网站不卡| 国产女主播一区二区| 日韩视频不卡中文| 久久综合给合久久狠狠色| 一本大道av伊人久久综合| 久久全国免费视频| 国产亚洲日本欧美韩国| 亚洲综合欧美| 亚洲精品综合精品自拍| 免费久久99精品国产| 韩日午夜在线资源一区二区|