使用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的最快方式。

相关文章
相关标签/搜索