使用itext將xml轉換為pdf(二)
阿新 • • 發佈:2019-01-17
使用itext將xml轉換為pdf(一)主要是一個探索的過程,所以使用Java project來立項。現在經過將近一個月的整理和整合,在web專案中已經漸近成熟。再總結一下。
基本上分為三個模組
- xml的配置
- xml資料結構
- xml解析與資料裝配
類似於mvc結構,即xml配置為前端展現view,資料裝配為controller,xml對應的資料模型為model。
用到了dom4j的相關jar,還有就是jaxb2,這個主要是借鑑網上的。
xml配置
主要是dtd約束及xml的編寫
dtd檔案的編碼及說明
dtd的主要作用是用來約束xml的編寫規範。
dtd檔案
<!ELEMENT tablepage (title,tables,include)>
<!ELEMENT tables (table,include)>
<!ELEMENT table (trs,include)>
<!ELEMENT trs (tr)>
<!ELEMENT tr (tds)>
<!ELEMENT tds (td)>
<!ELEMENT td (text)>
<!ATTLIST include file CDATA #IMPLIED>
<!ATTLIST title align CDATA "center"
v-align CDATA "middle"
font-family CDATA #IMPLIED>
<!ATTLIST table entity CDATA #REQUIRED
rows CDATA #IMPLIED
font CDATA "微軟雅黑"
rotate CDATA "false">
<!ATTLIST tr foreach CDATA "false"
entities CDATA "">
<!ATTLIST td align CDATA "center"
v-align CDATA "middle"
rowspan CDATA #IMPLIED
colspan CDATA "微軟雅黑">
dtd檔案說明
xml-config中配置的是每個pdf對應的xml,下邊是引數的dtd文件說明
tablepage是xml的root節點,有且只有一個
tablepage的子節點為title和tables
<!ELEMENT tablepage (title,tables)>
//tablepage下可以有多個table,多個table用tables包裹,其子節點用有且只有一個trs
<!ELEMENT tables (table)>
//table子節點能且只能是trs
<!ELEMENT table (trs)>
//table下可以有多個tr,多個tr用trs包裹
<!ELEMENT trs (tr)>
//tr子節點能且只能是tds
<!ELEMENT tr (tds)>
//tds子節點能且只能是td
<!ELEMENT tds (td)>
<!ELEMENT td (text)>
//包含檔案,其中file只得是xml-config下的檔案路徑,不包含xml-config,但要包含.xml字尾,file不能為空.
//被包含檔案不能有根節點tablepage
<!ATTLIST include file CDATA #IMPLIED>
//下邊是每個標籤的熟悉,屬性名可以參考html,如有不懂之處,請上網搜尋
<!ATTLIST title align CDATA "center"
v-align CDATA "middle"
font-family CDATA #IMPLIED>
<!ATTLIST table entity CDATA #REQUIRED
rows CDATA #IMPLIED
font CDATA "微軟雅黑"
//rotate,false:正常A4,true:橫向A4
rotate CDATA "false">
<!ATTLIST tr foreach CDATA "false"
//foreach 用來指定是否是一個迴圈
//配合下邊的entities,entities的資料結構為List<Map<String,Object>>
entities CDATA "">
<!ATTLIST td align CDATA "center"
v-align CDATA "middle"
rowspan CDATA #IMPLIED
//四個邊框的寬度,其順序按照上、右、下、左的順序設定
//若只有一個值則為上、右、下、左
//若兩個值則前一個值為上下,後一個值為左右
border-width CDATA "1 1 1 1"
colspan CDATA "微軟雅黑">
xml編碼及說明
NewFile.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tablepage PUBLIC "tablepage" "http://localhost:8080/dtd/tablepage.dtd">
<tablepage file-name="">
<!-- <title align="center" v-align="middle" font-family="STSong-Light"> -->
<!-- <text>測試標題</text> -->
<!-- </title> -->
<tables>
<table cols="12" font-family="STSong-Light" entity="cpafInfo" rotate="false">
<title align="center" v-align="middle" font-family="STSong-Light">
<text>事務所基本資訊</text>
</title>
<trs>
<tr>
<tds>
<td colspan="12" align="center" v-align="middle" border-width="1 1 1 1">
<text>基本情況</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle" border-width="2 2">
<text>名稱</text>
</td>
<td colspan="10" align="left" v-align="middle">
<text>{{cpafName}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle" border-width="3">
<text>所屬行政區劃</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{divisionProvince}}</text>
</td>
<td colspan="2" align="left" v-align="middle" border-width="0 0">
<text>組織形式</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{orgForm}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle">
<text>執業許可批准日期</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{approDate}}</text>
</td>
<td colspan="2" align="left" v-align="middle">
<text>統一社會信用程式碼</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{regisCno}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle">
<text>執業許可批准文號</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{rna}}</text>
</td>
<td colspan="2" align="left" v-align="middle">
<text>執業證書編號</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{cpafCno}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" rowspan="2" align="left" v-align="middle">
<text>註冊資本(出資總額)(單位:萬元)</text>
</td>
<td colspan="4" rowspan="2" align="left" v-align="middle">
<text>{{totalInves}}</text>
</td>
<td colspan="2" align="left" v-align="middle">
<text>分所數量</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{cpafbNum}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle">
<text>國際網路名稱(如有)</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{internetName}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle">
<text>經營場所</text>
</td>
<td colspan="10" align="left" v-align="middle">
<text>{{officeLocation}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle">
<text>通訊地址</text>
</td>
<td colspan="10" align="left" v-align="middle">
<text>{{address}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle">
<text>報備業務聯絡人</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{reporter}}</text>
</td>
<td colspan="2" align="left" v-align="middle">
<text>電子郵箱</text>
</td>
<td colspan="4" align="left" v-align="middle">
<text>{{email}}</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle">
<text>報備業務聯絡電話</text>
</td>
<td colspan="10" align="left" v-align="middle">
<text>{{phone}}</text>
</td>
</tds>
</tr>
</trs>
</table>
<include file="test-include.xml"/>
</tables>
</tablepage>
test-include.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tablepage PUBLIC "tablepage" "http://localhost:8080/dtd/tablepage.dtd">
<table cols="12" font-family="STSong-Light" entity="cpafInfo"
rotate="true">
<title align="center" v-align="middle" font-family="STSong-Light">
<text>測試橫向頁面</text>
</title>
<trs>
<tr>
<tds>
<td colspan="12" align="center" v-align="middle">
<text>基本情況</text>
</td>
</tds>
</tr>
<tr>
<tds>
<td colspan="2" align="left" v-align="middle">
<text>名稱</text>
</td>
<td colspan