1. 程式人生 > >使用itext將xml轉換為pdf(二)

使用itext將xml轉換為pdf(二)


使用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