使用LiveDocx和Zend Framework生成基于模板的文档

使用PHP生成打印良好的格式良好的PDF文档并非易事。 传统上,使用PHP生成PDF有两种主要方法。 如果有足够的时间和耐心,两者都可以完成工作,但仍然有很多不足之处:

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服务。

  1. 免费公共服务器
    对于绝大多数应用程序,开发人员选择这种方法。 Zend Framework组件中引用的默认LiveDocx服务器是免费的公共服务器。 它可以完全免费用于您自己的应用程序。 注册  LiveDocx帐户。
  2. 高级托管服务器
    如果您的应用程序每小时生成数千个文档,您可以考虑支付少量月费来访问您自己的个人LiveDocx服务器。 与领先的托管服务提供商合作,您可以租用这样的高级托管服务器。
  3. 本地许可服务器
    如果您的应用程序在一小时内生成的文档超过一万个,您可以考虑在本地网络中安装LiveDocx服务器。 在本地千兆网络中直接访问是迄今为止部署LiveDocx的最快方式。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69933200/viewspace-2649193/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69933200/viewspace-2649193/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值