Django 生成PDF(三)——關於RML
接上文,本節講述一下關於報表所需的RML標準。RML(Report Market Language),即報表標記語言,其語法類似於HTML、XML語言。RML中也有標籤、樣式一說,如果你英文比較厲害,請戳以下鏈接下載查看:http://download.csdn.net/detail/yima1006/6433095
如果你的英語跟我一樣很菜的話,就接着往下看吧:
環境準備:
RML文檔中包含可以直接執行的Python源代碼,因此需要用到Preppy,下載地址:http://download.csdn.net/detail/yima1006/6433059,文檔下載地址:http://download.csdn.net/detail/yima1006/6433087
RML常用語法解析:
1,定義文檔:
<document filename="financial_products.pdf" compression='1'>
定義文檔,filename爲文件名稱, compression表示是否壓縮文檔,1表示壓縮。
2,在文檔中引用Python代碼:
{{script}}import locale;locale.setlocale(locale.LC_ALL, '');{{endscript}}
script標籤中所嵌套的即爲python代碼,建議使用一個物理行包含多個邏輯行,因爲在script標籤之間不太好使用固定格式的python代碼(很難編譯通過,實戰經驗)。
3,預定義模板文件:
template通常指定一段模板文件,譬如說頁眉、頁腳等,在頁面佈局中引用。pageSize表示頁面的大小,"(595, 842)" 即爲一張A4紙的大小。leftMargin和rightMargin表示頁面的左右邊距。舉個例子,下面的一段代碼定義了一段 :
<template pageSize="(595, 842)" leftMargin="72" rightMargin="72" >
<pageTemplate id="head" pageSize="a4 portrait">
<pageGraphics>
<image file="{{STATIC_DIR}}/img/db_logo.jpg" x="50" y="780" width="302" height="53"/>
<fill color="black"/>
<setFont name="song" size="10"/>
<lineMode width="2"/>
<lines>
40 765 555 765
</lines>
<fill color="#ADD8E6"/>
<lineMode width="1" />
<lines>
0 60 595 60
</lines>
<fill color="#778899"/>
<setFont name="song" size="10"/>
<drawString x="235" y="40">客服熱線:4006-816-886 </drawString>
<drawString x="450" y="40">當前第<pageNumber countingFrom="1"/>頁 / 總共4頁</drawString>
</pageGraphics>
<frame id="second" x1="35" y1="85" width="525" height="660"/>
</pageTemplate>
</template>
4,定義一段頁面樣式:
<paraStyle name="common" fontName="song" fontSize="12" leading="18" spaceBefore="6" spaceAfter="12" firstLineIndent="0.5in" />
<paraStyle name="alignLeft" alignment="left" fontName="song" fontSize="12" leading="15" spaceBefore="6" spaceAfter="8" firstLineIndent="0.2in" />
上面一段代碼定義了兩種樣式:
這裏的name="common" 以及name="alignLeft"只是對樣式取了一個別名而已,以方便在文檔的正文部分調用(詳細見下文)。指定字體爲song(即:前文中提到的註冊的宋體字, leading指定行間距,spaceBefore 、spaceAfter表示段前、段後的間距,firstLineIndent表示首航縮進。alignment表示對其方式。
5,在頁面中引用預先定義的模板文件:
<story>
<setNextTemplate name="head"/>
</story>
<story>音譯爲故事,可以將每一個PDF文檔想象成一個完美的故事,其標籤包裹的東西即爲故事的內容,setNextTemplate 標籤標示調用文檔前面預定義的模板文件,模板文件可以有多個,工作指定name屬性來表示具體引用哪一個模板文件。6,在頁面中使用段落:
<para style="alignLeft"><b><u>2. 聲明與保證</u></b></para>
<para style="alignLeft">
<b>1.0</b> 雙方均分別向另一方聲明並保證該方具有完全適當的資格與能力訂立、接收及履行本合同以及以其爲一方的其他任何有關文件。</para>
用para標籤表示段落,用style屬性指定該段落使用的屬性,屬性名稱爲上文中預定義好的屬性名稱。一次定義,多處調用。在段落中也可以用到一些常用的RML標記,類似於HTML語言,如:<b></b>包裹的一段文字表示加粗顯示;<i></i>包裹的文字表示斜體顯示等等。
7,在文檔中添加一張圖片:
<image file="{{STATIC_DIR}}/img/common/cachet.gif" x="350" y="350" width="168" height="168"/>
添加圖片一般使用image標籤, file屬性指定圖片文件的位置,在生成PDF時,reprotlab會從file指定的文件中使用Python的urllib相關庫讀取文件,直接指定磁盤中文件的地址貌似難以實現,因此指定該屬性時最好指定一個通過瀏覽器可以訪問的鏈接。x和y屬性指定從哪一點開始畫圖片,width和height指定所畫區域的寬度和高度。
以上即爲上文中生成PDF所涉及到的RML代碼,希望對你會有所幫助,更詳細的解釋,直接下載官方文檔細細斟酌即可。