XSL-FO學習筆記(1)
能夠產生PDF檔案,總是件讓我感到很神秘的事情。我以前用過的產生PDF的方法有1)將相關檔案用相應的軟體開啟,“列印”到一個檔案如ali.prn,然後手工將ali.prn改為ali.ps,再用GostView開啟ali.ps,最後用其convert功能產生pdf檔案,有一定比率的不成功;2)利用Acrobat Distiller;3)利用Acrobat PDFWriter。
現在,可以通過xsl-fo和apache fop編程實現,總讓我感到興奮。
1、下載安裝及運行fop
去fop首頁下載fop,有兩個版本一個是維護版一個是設計版,我下的維護版的0.20.5版binary包。解壓縮到$FOPHOME,此目錄下有fop.cmd(for windows)或fop.sh(for *nix)。
從這兒下載樣本sample.fo檔案,運行
fop.cmd sample.fo sample.pdf
,OK產生sample.pdf了。
2、將 XML 文檔轉換為 PDF 檔案需要兩個基本步驟:
1)用 XSLT 樣式表將 XML 文檔轉換為由 XSL-FO 元素構成的檔案。要執行這一轉換,只需用調用 XSLT 處理器。
2)用某種顯示引擎將 XSL-FO 元素轉換為 PDF 檔案。
3、XSL-FO 文檔定義了製作高品質可列印文檔時非常重要的幾件事情:
1)有關頁面的實際大小的資訊(信紙和 A4 等等)
2)有關頁面邊界(頂部、左邊、底部和右邊)、頁首和頁尾和頁面其它特性的資訊
3)有關文本的字型、字型大小、顏色和其它特徵的資訊
4)要列印的實際文本,由描述段落、反白、表等類似物的元素來標記
4、XSL-FO文檔結構
<fo:root> 元素包含 <fo:layout-master-set> 和 <fo:page-sequence>。
<fo:layout-master-set> 通常包含關於頁面配置的資訊,而 <fo:page-sequence> 包含您正在格式化的實際內容。
5、樣本講解
| sample.fo |
說明 |
| <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> |
根項目<fo:root>,fo為命名空間首碼,包含一個 <fo:layout-master-set>,然後是一個或多個 <fo:page-sequence>。 |
| <fo:layout-master-set> |
指定頁面定義,可以使用 <fo:simple-page-master> 元素來定義所需的每一種頁面配置. |
| <fo:simple-page-master master-name="main" |
定義某個特定頁面的布局, maste-name是該頁面master的名稱。 |
| margin-top="36pt" margin-bottom="36pt" |
頁面頂底邊距 |
| page-width="8.5in" page-height="11in" |
頁面實際寬高 |
| margin-left="72pt" margin-right="72pt"> |
頁面左右邊距 |
| <fo:region-body margin-bottom="50pt" margin-top="50pt"/> |
為 region-body 地區定義了長度為 50 點的頂部和底部頁面邊界,頁面上還有region-before/region-after/region-start/region-end四地區。 |
| </fo:simple-page-master> |
|
| </fo:layout-master-set> |
|
| <fo:page-sequence master-reference="main"> |
<fo:page-sequence> 定義文檔內使用的頁面配置的序列,此處將main用於所有頁面 |
| <fo:flow flow-name="xsl-region-body"> |
<fo:flow>定義在指定地區內顯示的內容, 由於顯示引擎(如fop)可以自動或據指定規則計算換行、分欄、分頁符, 故稱之為流。 |
| <fo:block font-size="14pt" line-height="17pt"> |
<fo:block> 是最基本的元素,用于格式化一個文字區塊, 它類似於 HTML 中的 p 元素<fo:block> 元素總是會產生一個換行。此處定義字型大小和行高,有行間距為3,此值一般為3-6。 |
| This is a paragraph of text. Notice that as |
|
| <fo:inline font-style="italic">this meaningless |
<fo:inline> 在現有 <fo:block> 內定義一些新的文本特性. |
| prose</fo:inline> drones on and on, the FOP |
|
| software automatically calculates line breaks for us. |
|
| Isn't that fascinating? |
|
| </fo:block> |
|
| </fo:flow> |
|
| </fo:page-sequence> |
|
| </fo:root> |
|
6、兩個概念
頁面配置(layout)主要設定與紙有關的資訊;頁面則是指用以列印的地區。頁面又分為5個地區(region),如右圖。上例中只用到了region-body地區。
7、xsl-fo中關於距離的單位
| 單位 |
含義 |
| cm |
厘米 |
| mm |
毫米 |
| in |
英寸 |
| pt |
點(72 點 = 1 英寸) |
| pc |
派卡(12 點 = 1 派卡,6 派卡 = 1 英寸) |
| px |
像素(有時隨格式化程式或裝置的不同而有所不同,所以要小心使用) |
| em |
一個大寫 M 的寬度 |
8、<fo:inline>元素
設定粗體用font-weight="bold",斜體字用font-style="italic",字型如等寬字型font-family="monospace".
9、<fo:block>元素
text-align/text-align-last定義文本行/最後一行文本如何對齊,兩者的值集都是start、center、end 和 justify,分別指左、中、右和左靠右對齊。
space-before 和 space-after用來指定塊前塊後的間距。可以再附以.minimum、.maximum、.optimum 和 .precedence 等尾碼,由此可得10個屬性。
keep-with-next、keep-with-previous 和 keep-together用來設定與前塊、與後塊及塊內的顯示控制,可賦之以.within-line、.within-column 和 .within-page 等尾碼,可得12種屬性。值集為auto/數值/always,優先順序由低到高。
break-before和break-after分別定義塊前塊後放置分隔字元,值有五個,如表
| 屬性值 |
值的作用 |
auto |
讓顯示引擎自行處理 |
column |
在這個塊的前面放置分欄符號 |
page |
在這個塊的前面放置分頁符 |
odd-page |
顯示引擎插入一個分頁符(或兩個,如有必要的話),以便這一塊在奇數頁上開始。換句話說,如果一個分頁符會使這個塊在偶數頁上開始的話,FOP 會插入第二個分頁符。 |
even-page |
顯示引擎插入一個分頁符(或兩個,如有必要的話),以便這一塊在偶數頁上開始。 |
widows 特性定義了當一個塊在頁面底部開始顯示時,必須一起出現的最小行數;預設值是 2。
orphans 特性定義了當一個塊在當前頁面顯示不下時其最後幾行在下頁頂部顯示時必須一起出現的最小行數。其預設值也是 2。
10、圖形
外部的gif/jpg/svg檔案,可以用<fo:external-graphic src="...">來指定。svg檔案可以嵌入fo檔案本身,用<fo:instream-foreign-object>.只有把這些元素單獨放到block中才能有換行的效果。
11、水平線
用<fo:leader>來實現,有屬性leader-pattern,可取值space/rule/dots分別表空白/實線/虛線,有屬性leader-length指明長度,預設忹列等寬。
XSL-FO學習筆記(2)
參考文獻:
1、FOP首頁
http://xml.apache.org/fop/
2、XSL 格式化對象(XSL-FO)基礎知識
http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/xml-onlinecourse-bytitle/3B308072632F949FC8256D320006CA3F?OpenDocument
3、XSL規範
http://www.w3.org/TR/xsl/Overview.html
Posted by Hilton at September 19, 2003 10:42 PM | TrackBack