使用LiveDocx和Zend Framework生成基於模板的文檔

使用PHP生成打印良好的格式良好的PDF文檔並不是易事。傳統上,使用PHP生成PDF有兩種主要方法。若是有足夠的時間和耐心,二者均可以完成工做,但仍然有不少不足之處:php

HTML-to-PDF:這種方法普遍用於主流應用程序。這裏使用衆多開源庫之一以編程方式建立HTML文檔並將其轉換爲PDF。可是,因爲HTML不是面向頁面的格式(如PDF),所以沒法在HTML和PDF之間執行1對1映射。典型的文字處理文件格式功能,例如頁眉和頁腳,孤兒和寡婦甚至頁碼都不能用HTML表示。程序員

程序化:此方法能夠徹底控制生成的PDF。可是,它要求從程序代碼中設置每行文本的x和y座標,每一個幾何形狀和圖形。這不只是一個很是耗時的解決方案,並且很是脆弱:每當圖形設計師更改文檔的佈局時,程序員必須從新編寫他或她的程序代碼。編程

一種全新的方法
在本文中,做者提出了一種全新的第三種方法。它依賴於在WYSIWYG環境中建立的模板,例如Microsoft®Word或Open Office,而後使用PHP填充數據。生成的文檔不只能夠保存爲PDF,還能夠保存爲DOCX,DOC和RTF。後端

在咱們深刻研究這種新方法的內部工做方式以前,讓咱們先來看一個實際的例子。如下PHP 5代碼說明了PDF生成,其中模板template.docx [46.7 KB]中的合併字段軟件,被許可方和公司用PHP中的標量數據填充。生成的文檔document.pdf [104.7 KB]已建立並寫入磁盤。數組

$ phpLiveDocx = new Zend_Service_LiveDocx_MailMerge ( array ('username' => 'yourUsername' ,'password' => 'yourPassword' )); $ phpLiveDocx - > setLocalTemplate ('template.docx' ); $ phpLiveDocx - > assign ('software' ,'Magic Graphical Compression Suite v1.9' ); $ phpLiveDocx - > assign ('licensee' ,'Henry Smith' ); $ phpLiveDocx - >瀏覽器

'公司' ,'Megasoft合做' ); $ phpLiveDocx - > createDocument (); $ document = $ phpLiveDocx - > retrieveDocument ('pdf' ); file_put_contents ('document.pdf' ,$ document ); unset ($ phpLiveDocx ); 服務器

本文中演示的代碼將隨Zend Framework 1.10一塊兒提供。雖然在撰寫本文時,沒有正式發佈日期,但預計將於2009年第四季度發佈1.10。同時,您能夠檢查標準孵化器 SVN存儲庫中的組件。網絡

介紹LiveDocx
LiveDocx是一種基於SOAP的文檔生成服務,基於市場領先的文字處理組件TX Text Control .NET。LiveDocx容許在任何支持SOAP的編程語言中填充文字處理模板。生成的文檔能夠保存爲任何支持的格式。可是,本文主要介紹如何在PHP 5中使用LiveDocx。框架

LiveDocx的Zend Framework實現的組件位於標準Zend Framework分發文件中的/ Zend / Service / LiveDocx /。能夠將LiveDocx直接與PHP 5 SoapClient一塊兒使用,不使用Zend Framework,也可使用第三方庫NuSOAP。NuSOAP方法甚至容許在PHP 4中使用LiveDocx。然而,本文主要關注PHP 5中的官方Zend Framework組件。編程語言

LiveDocx的關鍵點是將生成格式良好,可打印的文字處理文檔所需的工做量減小到最低限度。對於最終用戶,建立任何支持的文件格式所涉及的邏輯是相同的。例如,不管您是想要PDF仍是RTF文件,代碼(一個參數除外)都是相同的。

LiveDocx的核心開發人員還但願確保模板的生成儘量簡單,在最終用戶已經很是熟悉的環境中。所以,您能夠在Word或Open Office中建立模板。

模板和文檔
在整篇文章中,咱們引用術語模板和文檔。瞭解二者之間的區別很是重要。

模板:術語模板用於指代輸入文件,包含格式和文本字段。模板能夠採用如下任何一種文件格式:

DOCX - Office Open XML格式
DOC - Microsoft®WordDOC格式
RTF - 富文本格式
TXD - TXTextControl®格式
模板能夠本地存儲在客戶端計算機(發起SOAP請求的計算機上)上,也能夠遠程存儲在後端服務器上。決定使用哪個取決於您正在開發的應用程序類型。

若是在本地存儲模板,則必須將模板與應在每一個請求上填充的數據一塊兒傳輸。若是模板在每一個請求中保持不變,則此方法效率很是低。最好將模板上傳到後端服務器一次,而後在全部後續請求中引用它。這樣,只有應填充的數據纔會從客戶端傳輸到後端服務器。使用LiveDocx的大多數應用程序屬於此類別。

另外一方面,若是您有一個不斷變化的模板,或者您容許最終用戶上傳模板的應用程序,您能夠考慮在本地存儲模板並在每一個請求時傳輸它們。這種方法顯然較慢,由於每一個請求都包含模板自己,以及填充它的數據。

文檔:術語文檔用於指生成的輸出文件,其中包含模板文件,填充數據 - 即完成的文檔。文檔可使用如下任何一種文件格式保存:

DOCX - Office Open XML格式
DOC - Microsoft®WordDOC格式
HTML - XHTML 1.0過渡格式
RTF - 富文本格式
PDF - Acrobat®便攜式文檔格式
TXD - TX文本控制格式
TXT - ANSI純文本
除了上述文字處理文件格式外,文檔還能夠保存爲如下圖像文件格式:

BMP - 位圖圖像格式
GIF - 圖形交換格式
JPG - 聯合圖像專家組格式
PNG - 便攜式網絡圖形格式
TIFF - 標記圖像文件格式
WMF - Windows元文件格式
使用LiveDocx
在本節中,咱們將從頭開始查看使用LiveDocx建立文檔的整個過程。

在Microsoft®Word2007中建立模板
任何LiveDocx項目的第一步都是建立模板。爲此,您可使用Open Office或Microsoft®Word。出於本文的目的,咱們將使用Microsoft®Word2007.有關使用Open Office的說明,請查看LiveDocx博客。

在Microsoft®Word2007中插入合併字段首先在Microsoft®Word2007中建立一個新文件,而後將模板文件另存爲template.docx。

而後,您能夠開始撰寫模板,使用「 字段」對話框插入文本,圖形和合並字段,如右圖所示。

一段時間後,您將擁有一個模板,其中包含圖像,文本和許多合併字段。合併字段由{MERGEFIELD name}表示,並將在下一步中填充標量數據。Microsoft®Word2007中模板的如下屏幕截圖說明了模板的外觀:

完成後保存模板template.docx [/ img] [46 KB]。

在LiveDocx中分配標量數據類型
如今咱們有了模板文件,下一步就是用數據填充它。在下面的示例中,咱們將向模板分配標量數據類型(在本例中爲字符串)。

$ phpLiveDocx = new Zend_Service_LiveDocx_MailMerge ( array ('username' => 'yourUsername' ,'password' => 'yourPassword' )); $ phpLiveDocx - > setLocalTemplate ('template.docx' ); $ phpLiveDocx - > assign ('software' ,'Magic Graphical Compression Suite v1.9' ); $ phpLiveDocx - > assign ('licensee' ,'Henry Smith' ); $ phpLiveDocx - >

'公司' ,'Megasoft合做' ); $ phpLiveDocx - > assign ('date' ,'2009年10月10日' ); $ phpLiveDocx - > assign ('time' ,' 14:12:01 ' ); $ phpLiveDocx - > assign ('city' ,'Frankfurt' ); $ phpLiveDocx - > assign ('country' ,'Germany' ); $ phpLiveDocx - > createDocument ();

retrieveDocument ('pdf' ); file_put_contents ('document.pdf' ,$ document ); unset ($ phpLiveDocx );

對於許多應用程序,特別是那些使用PDF文件進行存檔的應用程序,您可能但願設置PDF文件的元數據。您能夠經過使用應嵌入PDF文件的元數據指定關聯數組來執行此操做。在()setDocumentProperties方法前必須調用createDocument() :

$ documentProperties = array ('title' => 'Magic Graphical Compression Suite v1.9' ,'author' => 'Megasoft Co-operation' ,'subject' => 'Magic Graphical Compression Suite v1.9' ,'keywords' > '圖形,魔法,壓縮,套件,許可' ); $ phpLiveDocx - > setDocumentProperties ($ documentProperties );

生成的文檔document.pdf [104 KB]將寫入磁盤,如今能夠在您喜歡的PDF閱讀器中打開,例如Ubuntu中隨附的文檔查看器:

在LiveDocx中分配複合數據類型
除了在前一個示例中分配給模板的標量數據類型以外,還能夠分配複合數據類型,例如關聯數組。考慮模板template.doc [20.5 KB]和生成的文檔document.pdf [77.6 KB]。特別是,請看一下模板的如下部分(點擊放大):

Microsoft®Word和Microsoft®Word中的書籤之間的模板部分在最終文檔中重複,以生成表的行。如下關聯數組的一個子數組用於每一行。

使用如下PHP 5代碼,咱們將使用電話鏈接數據的關聯數組填充模板。爲清楚起見,此示例僅顯示分配關聯數組的部分。LiveDocx的實例化以及文檔建立和可檢索的過程與前面的示例相同,而且已被省略:

//實例化LiveDocx

$ billConnections = array ( array ('connection_number' => '+ 11(0)222 333 441' ,'connection_duration' => '00:01:01' ,'fee' => '1.15' ), array ('connection_number' => '+ 11(0)222 333 442' ,'connection_duration' => '00:01:02' ,'fee' => '1.15' ), array ('connection_number' => '+11(0)222 333 443' ,'connection_duration' =>

'00:01:03' ,'費用' = ''1.15' ),    數組('connection_number' => '+ 11(0)222 333 444' ,'connection_duration' => '00:01:04' ,'費用' => '1.15' )); $ phpLiveDocx - > assign ('connection' ,$ billConnections ); //建立和檢索文檔

生成的文檔包含下表,其中包含分配的關聯數組中的數據(單擊以放大):

使用LiveDocx生成圖像文件
除了上面列出的LiveDocx支持的文字處理文件格式以外,您還能夠將生成的文檔另存爲一個或多個圖像文件。爲此,Zend_Service_LiveDocx_MailMerge提供方法getAllBitmaps()和getBitmaps():

//實例化LiveDocx //獲取全部位圖//(zoomFactor,format)$ bitmaps = $ phpLiveDocx - > getAllBitmaps (100 ,'png' );

一樣,能夠檢索特定範圍內頁面的圖像:

//獲取在規定的範圍內的位圖只是//(fromPage,toPage,zoomFactor,格式)$位圖= $ phpLiveDocx - > getBitmaps (2 ,2 ,100 ,'PNG' );

注意zoomFactor參數。這是一個百分比值,在10%到400%的範圍內。這些方法很是適合於生成所建立文檔的縮略圖圖像,例如,做爲預覽在瀏覽器中顯示。

經過迭代$ bitmaps數組,能夠將實際的圖像文件寫入磁盤。數組中每一個記錄有一頁二進制數據:

//寫入磁盤//(每一個記錄一頁)foreach ($ bitmaps as $ pageNumber => $ bitmapData ){ $ filename = sprintf ('documentPage%d.png' ,$ pageNumber ); file_put_contents ($ filename ,$ bitmapData ); printf ('將%d個字節寫入磁盤爲%s。%s' ,filesize ($ filename ),$ filename ,PHP_EOL ); }

在您本身的應用程序中部署LiveDocx
Zend框架中提供的構成LiveDocx的PHP 5實現的代碼在新BSD許可下發布,所以能夠根據許可條款在大多數項目中進行部署,修改和從新分發。可是,實際的LiveDocx SOAP服務器是專有軟件。能夠經過三種方式在本身的應用程序中部署SOAP服務。

免費公共服務器對於絕大多數應用程序,開發人員選擇這種方法。Zend Framework組件中引用的默認LiveDocx服務器是免費的公共服務器。它能夠徹底免費用於您本身的應用程序。註冊 LiveDocx賬戶。高級託管服務器若是您的應用程序每小時生成數千個文檔,您能夠考慮支付少許月費來訪問您本身的我的LiveDocx服務器。與領先的託管服務提供商合做,您能夠租用這樣的高級託管服務器。本地許可服務器若是您的應用程序在一小時內生成的文檔超過一萬個,您能夠考慮在本地網絡中安裝LiveDocx服務器。在本地千兆網絡中直接訪問是迄今爲止部署LiveDocx的最快方式。

相關文章
相關標籤/搜索