Transcript Document

第12章 XSL-FO格式化輸出PDF








12-1
12-2
12-3
12-4
12-5
12-6
12-7
12-8
XSL-FO的基礎
XSL-FO的文件架構
XSL-FO的頁面範本
XSL-FO的頁面內容
XSL-FO的多頁面範本
XSL-FO的段落內容
XSL-FO的文字內容
應用實例:XSL-FO與XSLT
12-1 XSL-FO的基礎



什麼是XSL-FO
如何從XML文件產生PDF文件
XSL-FO工具與引擎
什麼是XSL-FO


XSL-FO(Extensible Stylesheet Language
Formatting Objects)是一種XML語法的語言來
格式化XML資料,在2001年10月15日成為W3C
的建議規格。
XSL-FO語言可以視為XML預設的樣式語言
XSL(Extensible Stylesheet Language),標
準的樣式語言包含轉換和格式化資料的功能,簡
單的說,XSL包含轉換和格式化XML文件的語法。
在2000年11月W3C工作小組將XSL分成三種建
議規格,如下所示:
• XSLT:轉換XML文件的語言。
• XPath:查詢XML文件中的部分資料。
• XSL-FO:格式化XML文件的語言。
如何從XML文件產生PDF文件-1

在實作上,我們並不會直接建立XSL-FO文
件,而是透過XSLT Script將XML文件轉換
成XSL-FO,然後格式輸出成PDF檔案,如
下圖所示:
如何從XML文件產生PDF文件-2


將XML文件轉換成PDF的步驟,如下所示:
步驟一:XML+XSLT轉換成XSL-FO
• 第一步是將XML文件內容轉換成XSL-FO文件,
我們可以使用XSLT Script將XML文件透過
XSLT處理器轉換成XSL-FO文件。

步驟二:XSL-FO格式化成PDF
• 當轉換成XSL-FO文件後,可以使用XSL-FO引
擎(Formatting Engine)格式化輸出成PDF檔
案格式。
XSL-FO工具與引擎

XSL-FO Debugger是Altsoft公司的免費
XSL除錯工具,屬於.NET Framework平
台的應用程式,它是使用Altsoft的
Xml2PDF格式化引擎來將XSL-FO文件或
是XML和XSLT Script轉換輸出成PDF檔案。
12-2 XSL-FO的文件架構


第一份XSL-FO文件
XSL-FO格式模型
第一份XSL-FO文件-1
XSL-FO文件的副檔名為.fo或.fob,或是和
XML文件相同的.xml,在本章是使用.fo副
檔名。XSL-FO文件的根標籤是<fo:root>,
在根標籤宣告名稱空間字首fo,XSL-FO預
設的URI,如下所示:
http://www.w3.org/1999/XSL/Format

第一份XSL-FO文件-2
<?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 mastername="page1"…>…………
</fo:simple-page-master>
<fo:simple-page-master mastername="page2"…>………
</fo:simple-page-master>
<fo:page-sequence-master>
………
</fo:page-sequence-master>
</fo:layout-master-set>
第一份XSL-FO文件-3
<fo:page-sequence master-reference="page1">
<fo:title>………</fo:title>
<fo:static-content…>…</fo:static-content>
<fo:flow…>………</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="page2">
<fo:title>………</fo:title>
<fo:static-content…>…</fo:static-content>
<fo:flow…>………</fo:flow>
</fo:page-sequence>
</fo:root>
第一份XSL-FO文件-4


fo:layout-master-set元素:定義頁面範本的版
型,每一個fo:simple-page-master子元素可以
定義一個頁面的尺寸和邊界等版面配置資訊,以
此例是名為page1和page2兩頁頁面範本。對於
多頁面範本,我們需要使用fo:page-sequencemaster子元素定義各頁面範本出現的順序和次數。
fo:page-sequence元素:使用masterreference屬性對應指定的頁面範本名稱,其內
容就是此頁顯示的內容,內含fo:title、
fo:static-content和fo:flow子元素,分別顯示
標題、固定內容和頁面內容。
第一份XSL-FO文件-5
XSL-FO的格式物件
 在XSL-FO文件的元素就是XSL-FO的「格
式物件」(Formatting Objects),其樹狀
結構如下圖所示:
XSL-FO格式模型-1

XSL-FO格式模型(XSL Formatting Model)是由
長方形的地區(Areas)組成,XSL-FO引擎將輸
出內容的文字、空白字元、圖形和其它格式物件
格式編排進入這些地區,如下圖所示:
XSL-FO格式模型-2


區域地區(Region Area):在每一個XSL-FO頁面
包含5個區域,相當於Word文件的頁首、本文和
頁尾部分。XSL-FO定義區域的格式物件為
fo:region-body、fo:region-before、
fo:region-after、fo:region-start和
fo:region-end。
區塊地區(Block Area):在XSL-FO的區域包含
區塊,在區塊之中可以擁有其它區塊,每一個區
塊是使用斷行符號來分割,我們可以將區塊視為
是一個段落、表格或清單。XSL-FO定義區塊的
格式物件有fo:block、fo:table和fo:list-block。
XSL-FO格式模型-3


行地區(Line Area):行代表區塊中的一行,例如:
清單中的每一個項目就是行地區,XSL-FO並沒
有對應的格式物件,其目的主要是讓XSL-FO引
擎能夠計算區塊中行地區的大小,以便在區塊中
正確的換行。
行內地區(Inline Area):行內地區是位在行地區
之內,例如:一個字、片語和公式等。在XSLFO可以定義行內地區的格式物件有fo:inline、
fo:external-graphic、fo:leader和fo:pagenumber等。
12-3 XSL-FO的頁面範本


簡單頁面範本
頁面區域範本
簡單頁面範本-1
XSL-FO的簡單頁面範本是fo:simple-page-master格式
物件,這是fo:layout-master-set的子元素,可以使用
fo:simple-page-master定義頁面範本。
 在XSL-FO 1.0版只定義一種簡單頁面範本,也就是一頁
長方形的頁面,如下所示:
<fo:simple-page-master master-name="myPage"
page-width="8.5in" page-height="11in"
margin-top="20pt" margin-bottom="20pt"
margin-left="50pt" margin-right="50pt">
<fo:region-body region-name="region-body"
margin-bottom="25pt" margin-top="250pt"/>
</fo:simple-page-master>

簡單頁面範本-2

以此例,我們定義一頁8.5in X 11in大小的頁面,
上下邊界20pt,左右邊界50pt的長方形地區,如
下圖所示:
簡單頁面範本-3

fo:simple-page-master元素常用的屬性
說明,如下表所示:
屬性
master-name
說明
頁面範本名稱,在頁面內容可以使用此名稱
指定輸出的頁面範本
page-height
頁面高,可以使用 inch、cm 和 pt 點數為單位
page-width
頁面寬,可以使用 inch、cm 和 pt 點數為單位
margin-bottom、margin-left、 頁面下、左、右和上方的邊界尺寸,可以使
margin-right、margin-top
用 inch、cm 和 pt 點數為單位
writing-mode
指定文字方向為 left-to-right、right-to-left 或
top-to-bottom
頁面區域範本-1

在XSL-FO的頁面共分為上、下、左、右和
中間五個區域,如下圖所示:
頁面區域範本-2

5個區域的格式物件名稱都是fo:simple-pagemaster的子元素,如下所示:
<fo:region-before region-name="region-before"
extent="25pt"/>
<fo:region-after region-name="region-after"
extent="25pt"/>
<fo:region-body region-name="region-body"
margin-bottom="25pt" margin-top="250pt"/>
<fo:region-start region-name="region-start"
extent="25pt"/>
<fo:region-end region-name="region-end"
extent="25pt"/>
頁面區域範本-3

格式物件相關屬性如下表所示:
屬性
region-name
說明
指定區域名稱,在頁面內容可以使用此名稱指
定輸出的區域
extent
fo:region-before 和 fo:region-after 使用此屬性指
定區域的高度,fo:region-start 和 region-end 使
用此屬性指定區域的寬度
margin-bottom、margin-left、 指定 fo:region-body 下、左、右和上方的邊界尺
margin-right、margin-top
寸,可以使用 inch、cm 和 pt 點數為單位,
fo:region-body 並沒有 extent 屬性
12-4 XSL-FO的頁面內容




XSL-FO的頁面內容
頁面內容fo:title和fo:flow
靜態內容fo:static-content
頁碼fo:page-number
XSL-FO的頁面內容
接下來,我們就可以針對指定範本定義頁面的實際內容,
也就是一至多個fo:page-sequence格式物件,如下所示:
<fo:page-sequence master-reference="myPage">
………
</fo:page-sequence>
 在fo:page-sqeuence元素之下依序擁有3個子元素,如
下所示:

• fo:title:這是可有可無的元素,用來指定文件標題,其功能類似
HTML/XHTML語言的title標籤。
• fo:static-content:可以有0到多個fo:static-content元素,這
是每一頁都擁有的固定內容。
• fo:flow:可以擁有1個且只有1個fo:flow元素,用來定義每一個
頁面範本顯示的內容。
頁面內容fo:title和fo:flow
XSL-FO的fo:title元素可以指定文件標題,如下所示:
<fo:title>Ch12-4-1.fo</fo:title>
 XSL-FO的fo:flow元素內容是頁面的實際內容,它是
fo:page-sqeuence元素的子元素,而且只能有一個,如
下所示:
<fo:flow flow-name="region-body"
font-family="SimHei">
<fo:block font-size="36pt" line-height="40pt">
…………
</fo:block>
……………
</fo:flow>

靜態內容fo:static-content-1

在fo:flow元素的內容只會出現在文件的某
一頁,fo:static-content元素的內容則可
以出現在每一頁。換句話說,fo:staticcontent通常是用來顯示頁首和頁尾資訊,
也就是置於region-before和region-after
區域。
靜態內容fo:static-content-2

XSL-FO的fo:static-content元素是fo:pagesequence元素的子元素,其順序是在fo:title元
素之後,fo:flow元素之前,同一個fo:pagesequence元素可以擁有0到多個fo:staticcontent子元素,如下所示:
<fo:static-content flow-name="region-before">
<fo:block font-family="SimHei" font-size="44pt"
line-height="50pt">
陳會安的圖書清單
</fo:block>
</fo:static-content>
頁碼fo:page-number-1
XSL-FO的fo:page-sequence元素可以指定頁
碼的起始值和頁數,如下所示:
<fo:page-sequence masterreference="myPage"
initial-page-number="2">
……………
</fo:page-sequence>
 上述fo:page-sequence元素除了masterreference屬性外,可以使用initial-pagenumber和force-page-count屬性來定義頁碼。

頁碼fo:page-number-2

在fo:page-sequence元素定義好頁碼後,就可
以在行內區域使用fo:page-number元素插入頁
碼,通常是顯示在fo:static-content元素的固定
內容,如下所示:
<fo:static-content flow-name="region-after">
<fo:block font-family="SimHei" font-size="30pt"
line-height="36pt">
第 <fo:page-number/> 頁
</fo:block>
</fo:static-content>
12-5 XSL-FO的多頁面範本




XSL-FO的多頁面範本
依序使用多頁面範本
重複使用多頁面範本
交互使用多頁面範本
XSL-FO的多頁面範本-1
<fo:simple-page-master master-name="leftPage"
page-width="8.5in" page-height="5in"
margin-top="20pt" margin-bottom="20pt"
margin-left="25pt" margin-right="50pt">
………
</fo:simple-page-master>
<fo:simple-page-master master-name="rightPage"
page-width="8.5in" page-height="5in"
margin-top="20pt" margin-bottom="20pt"
margin-left="50pt" margin-right="25pt">
………
</fo:simple-page-master>
XSL-FO的多頁面範本-2

當在fo:layout-master-set元素定義多個
fo:simple-page-master元素時,我們需要定義
各頁面範本的出現順序,如下所示:
<fo:layout-master-set>
<fo:simple-page-master mastername="leftPage"…
<fo:simple-page-master mastername="rightPage"…
<fo:page-sequence-master mastername="myPage">
…………
</fo:page-sequence-master>
</fo:layout-master-set>
XSL-FO的多頁面範本-3

在fo:page-sequence-master元素擁有
三種子元素來定義各頁面範本的出現順序,
如下所示:
• fo:single-page-master-reference
• fo:repeatable-page-master-reference
• fo:repeatable-page-master-alternatives
依序使用多頁面範本
XSL-FO的fo:single-page-master-reference
元素可以在fo:page-sequence-master元素定
義頁面範本依序出現的順序,如下所示:
<fo:page-sequence-master mastername="myPage">
<fo:single-page-master-reference masterreference="leftPage"/>
<fo:single-page-master-reference masterreference="leftPage"/>
<fo:single-page-master-reference masterreference="rightPage"/>
</fo:page-sequence-master>

重複使用多頁面範本

XSL-FO的fo:single-page-master-reference
元素適用在已知頁數的文件,對於不確定頁數的
情況,fo:repeatable-page-masterreference元素可以定義重複出現指定頁面範本
和最大出現次數,如下所示:
<fo:page-sequence-master mastername="myPage">
<fo:repeatable-page-master-reference masterreference="leftPage"
maximum-repeats="2"/>
<fo:single-page-master-reference masterreference="rightPage"/>
</fo:page-sequence-master>
交互使用多頁面範本-1

XSL-FO的fo:repeatable-page-masteralternatives元素可以指定頁面範本依位置、
交互或內容是否為空白頁來定義出現順序,
特別適用在圖書封面、序、左頁和右頁都
擁有不同頁面範本的情況。
交互使用多頁面範本-2
在fo:repeatable-page-master-alternatives元素是使
用fo:conditional-page-master-reference子元素來指
定參考的頁面範本,如下所示:
<fo:page-sequence-master mastername="myPage">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference
odd-or-even="odd" masterreference="leftPage"/>
<fo:conditional-page-master-reference
odd-or-even="even" masterreference="rightPage"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>

12-6 XSL-FO的段落內容



區塊fo:block
清單fo:list-block
表格fo:table
區塊fo:block

XSL-FO的fo:block元素可以輸出一個長方形地
區,用來輸出段落或是其它fo:block元素,如下
所示:
<fo:block font-size="36pt" font-family="SimHei"
line-height="40pt" text-align="center"
space-before="5pt" space-after="5pt">
什麼是XSL-FO
</fo:block>
清單fo:list-block-1

XSL-FO的清單是由四種格式物件所組成,
各種清單格式物件的說明,如下所示:
• fo:list-block:建立清單,它是多個fo:listitem元素的父元素。
• fo:list-item:建立清單的每一個項目,它是
fo:list-item-label和fo:list-item-body的父
元素。
• fo:list-item-label:項目前的符號或編號。
• fo:list-item-body:項目內容。
清單fo:list-block-2
<fo:list-block font-size="17pt"
space-before="10pt" line-height="20pt">
<fo:list-item>
<fo:list-item-label>…</fo:list-item-label>
<fo:list-item-body start-indent="10pt">
………
</fo:list-item-body>
</fo:list-item>
<fo:list-item>
…………
</fo:list-item>
……………
</fo:list-block>
表格fo:table-1

XSL-FO的表格也是由一組格式物件來組成,
常用XSL-FO表格的格式物件對應XHTML
表格標籤,如下表所示:
XHTML 標籤
<table>
<col>
<thead>
<tbody>
<tr>
<td>
XSL-FO 格式物件
fo:table
fo:table-column
fo:table-header
fo:table-body
fo:table-row
fo:table-cell
說明
建立表格
定義表格的基本屬性
建立表格標題列
建立表格內容列
建立表格列
建立表格欄的儲存格
表格fo:table-2
<fo:table space-before="10pt" textalign="center">
<fo:table-column column-width="2in"/>
<fo:table-column column-width="2in"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell border-style="solid"
border-width="1pt">
………
</fo:table-cell>
<fo:table-cell border-style="solid"
border-width="1pt"> ………
</fo:table-cell>
</fo:table-row>
</fo:table-header>
表格fo:table-3
<fo:table-body>
<fo:table-row>
………
</fo:table-row>
<fo:table-row>
………
</fo:table-row>
</fo:table-body>
</fo:table>
9-7 XSL-FO的文字內容




文字效果
插入水平線
新增圖片
建立超連結
文字效果

對於段落中的指定文字或片語,可以使用
fo:inline格式物件來建立文字效果,如下圖所示:
<fo:block font-size="36pt" font-family="SimHei"
line-height="40pt" text-align="center"
space-before="5pt" space-after="5pt">
什麼是<fo:inline font-weight="bold"
font-family="monospace" font-style="italic">
XSL-FO</fo:inline>
</fo:block>
插入水平線
如同HTML/XHTML語言可以使用<hr/>標
籤插入水平線,在XSL-FO是使用
fo:leader格式物件來插入水平線,如下所
示:
<fo:block text-align="center">
<fo:leader leader-pattern="dots"
leader-length="500pt"/>
</fo:block>

新增圖片

XSL-FO的fo:external-graphic格式物件,
相當於HTML/XHTML語言的<img/>標籤,
可以在文件中新增圖片,如下所示:
<fo:block text-align="center">
<fo:external-graphic src="Ch12-7-3.gif"/>
</fo:block>
建立超連結
XSL-FO的fo:basic-link格式物件,相當於
HTML/XHTML語言的<a>標籤,可以在文件中建立超連
結文字,如下所示:
<fo:block text-align="center" font-size="15pt"
line-height="20pt" font-family="SimHei"
space-before="25pt" space-after="25pt">
中華電信公司:
<fo:basic-link
external-destination="http://www.hinet.net">
HiNet
</fo:basic-link>
</fo:block>
