使用PHP生成格式良好、打印良好的PDF文档并非易事。传统上,有两种使用PHP生成PDF的主要方法。如果有足够的时间和耐心,两者都可以完成工作,但仍有很多不足之处:HTML-to-PDF:这种方法广泛用于主流应用程序。这里使用众多开源库之一以编程方式创建HTML文档并将其转换为PDF。但是,由于HTML不是面向页面的格式(如PDF),因此无法在HTML和PDF之间执行一对一的映射。典型的文字处理文件格式特征,如页眉和页脚、孤儿和寡妇,甚至页码都不能用HTML表示。程序化:此方法允许完全控制生成的PDF。但是,它需要从程序代码中设置每行文本、每个几何形状和图形的x和y坐标。这不仅是一个非常耗时的解决方案,而且非常脆弱:每次图形设计师更改文档的布局时,程序员都必须重写他或她的程序代码。一种新颖的方法在本文中,作者提出了一种新颖的第三种方法。它依赖于在WYSIWYG环境中创建的模板,例如Microsoft?Word或OpenOffice,然后使用PHP来填充数据。生成的文档不仅可以保存为PDF,还可以保存为DOCX、DOC和RTF。在深入研究这种新方法的内部工作原理之前,让我们先看一个实际示例。以下PHP5代码说明了在模板template.docx[46.7KB]中使用标量数据填充的合并字段软件、被许可方和公司的PDF生成。生成的文档document.pdf[104.7KB]已创建并写入磁盘。$phpLiveDocx=newZend_Service_LiveDocx_MailMerge(array('username'=>'yourUsername','password'=>'yourPassword'));$phpLiveDocx->setLocalTemplate('template.docx');$phpLiveDocx->assign('software','MagicGraphicalCompressionSuitev1.9');$phpLiveDocx->assign('licensee','HenrySmith');$phpLiveDocx->'公司','兆软合作');$phpLiveDocx->createDocument();$document=$phpLiveDocx->retrieveDocument('pdf');file_put_contents('document.pdf',$document);取消设置($phpLiveDocx);本文中演示的代码将随ZendFramework1.10一起提供。在撰写本文时,还没有正式发布日期,1.10预计将在2009年第四季度发布。同时,您可以在StandardIncubatorSVN存储库中查看组件。LiveDocx简介LiveDocx是基于市场领先的文字处理组件TXTextControl.NET的基于SOAP的文档生成服务。LiveDocx允许使用任何支持SOAP的编程语言填充文字处理模板。生成的文档可以以任何支持的格式保存。不过,本文主要介绍如何在PHP5中使用LiveDocx。LiveDocx的ZendFramework实现的组件位于标准ZendFramework分发文件中的/Zend/Service/LiveDocx/中。可以在不使用ZendFramework的情况下直接使用LiveDocx和PHP5SoapClient,或者使用第三方库NuSOAP。NuSOAP方法甚至允许在PHP4中使用LiveDocx。但是,本文主要关注PHP5中的官方ZendFramework组件。LiveDocx的关键点在于最大限度地减少生成格式良好、可打印的文字处理文档所需的工作量.对于最终用户,创建任何支持的文件格式所涉及的逻辑都是相同的。例如,无论您想要PDF还是RTF文件,代码(除了一个参数)都是相同的。LiveDocx的核心开发人员还希望确保在最终用户已经非常熟悉的环境中尽可能轻松地生成模板。因此,您可以在Word或OpenOffice中创建模板。模板和文档在整篇文章中,我们引用术语模板和文档。了解两者之间的区别非常重要。模板:术语模板用于指代包含格式和文本字段的输入文件。模板可以是以下任何文件格式:DOCX-OfficeOpenXML格式DOC-Microsoft?WordDOC格式RTF-富文本格式TXD-TXTextControl?格式模板可以本地存储在客户端计算机上(在发起SOAP请求的计算机上),也可以远程存储在后端服务器上。决定使用哪一个取决于您正在开发的应用程序类型。如果模板存储在本地,则模板必须与应在每个请求中填充的数据一起传输。如果模板在每个请求上都保持不变,则此方法效率非常低。最好将模板上传一次到后端服务器,然后在所有后续请求中引用它。这样,只有应填充的数据才会从客户端传输到后端服务器。大多数使用LiveDocx的应用程序都属于这一类。另一方面,如果您有一个不断变化的模板,或者您有一个允许最终用户上传模板的应用程序,您可以考虑将模板存储在本地并在每次请求时传输它们。这种方法显然较慢,因为每个请求都包含模板本身以及填充它的数据。文档:术语文档用于指生成的输出文件,其中包含模板文件,填充有数据-即完成的文档。文档可以保存为以下任何文件格式:DOCX-OfficeOpenXML格式DOC-Microsoft?WordDOC格式HTML-XHTML1.0过渡格式RTF-富文本格式PDF-Acrobat?便携式文档格式TXD-TX文本控制格式TXT-ANSI纯文本除了上述文字处理文件格式外,文档还可以保存为以下图像文件格式:BMP-位图图像格式GIF-图形交换格式JPG-联合图像专家组格式PNG-便携式网络图形格式TIFF-标记图像文件格式WMF-使用LiveDocx的Windows图元文件格式在本节中,我们将从头开始了解使用LiveDocx创建文档的整个过程。在Microsoft?Word2007中创建模板任何LiveDocx项目的第一步都是创建模板。为此,您可以使用OpenOffice或Microsoft?Word。出于本文的目的,我们将使用Microsoft?Word2007。有关使用OpenOffice的说明,请查看LiveDocx博客。要在Microsoft?Word2007中插入合并字段,请先在Microsoft?Word2007中创建一个新文件,然后将模板文件另存为template.docx。然后,您可以使用“字段”对话框开始编写模板、插入文本、图形和合并字段,如右图所示。一段时间后,您将拥有一个包含图像、文本和大量合并字段的模板。合并字段由{MERGEFIELDname}表示,并将在下一步中填充标量数据。以下Microsoft?Word2007中模板的屏幕截图说明了模板的外观:完成后保存模板template.docx[/img][46KB]。在LiveDocx中分配标量数据类型现在我们有了模板文件,下一步是用数据填充它。在下面的示例中,我们将为模板分配一个标量数据类型(在本例中为字符串)。$phpLiveDocx=newZend_Service_LiveDocx_MailMerge(array('username'=>'yourUsername','password'=>'yourPassword'));$phpLiveDocx->setLocalTemplate('template.docx');$phpLiveDocx->assign('software','MagicGraphicalCompressionSuitev1.9');$phpLiveDocx->assign('licensee','HenrySmith');$phpLiveDocx->'公司','兆软合作');$phpLiveDocx->assign('日期','2009年10月10日');$phpLiveDocx->assign('时间','14:12:01');$phpLiveDocx->assign('城市','法兰克福');$phpLiveDocx->assign('国家','德国');$phpLiveDocx->createDocument();检索文档('pdf');file_put_contents('document.pdf',$document);取消设置($phpLiveDocx);是那些使用PDF文件进行归档的应用程序,您可能希望设置PDF文件的元数据。您可以通过指定一个包含应嵌入PDF文件的元数据的关联数组来执行此操作。createDocument()必须在()setDocumentProperties方法之前调用:$documentProperties=array('title'=>'MagicGraphicalCompressionSuitev1.9','author'=>'MegasoftCo-operation','subject'=>'MagicGraphicalCompressionSuitev1.9','keywords'>'graphics,magic,compression,suite,license');$phpLiveDocx->setDocumentProperties($documentProperties);生成的文档document.pdf[104KB]会被写入磁盘,现在可以在你喜欢的PDF阅读器中打开,比如Ubuntu自带的DocumentViewer:AssigningCompoundDataTypesinLiveDocx除了标量数据类型分配给前面示例中的模板的复合数据类型,例如关联数组。考虑模板template.doc[20.5KB]和生成的文档document.pdf[77.6KB]。请特别注意模板的以下部分(单击放大):Microsoft?Word和Microsoft?Word中的书签之间的模板部分在最终文档中重复生成表格的行。每行使用以下关联数组的子数组。使用以下PHP5代码,我们将使用电话连接数据的关联数组填充模板。为清楚起见,此示例仅显示分配关联数组的部分。LiveDocx的实例化以及文档创建和检索的过程与前面的示例相同,已省略://instantiateLiveDocx$billConnections=array(array('connection_number'=>'+11(0)222333441','connection_duration'=>'00:01:01','fee'=>'1.15'),array('connection_number'=>'+11(0)222333442','connection_duration'=>'00':01:02','fee'=>'1.15'),array('connection_number'=>'+11(0)222333443','connection_duration'=>'00:01:03','fee'=''1.15'),array('connection_number'=>'+11(0)222333444','connection_duration'=>'00:01:04','cost'=>'1.15'));$phpLiveDocx->assign('connection',$billConnections);//CreatingandretrievingdocumentationGenerateddocumentationcontainsthefollowingtablewithdataintheassignedassociativearray(clicktoenlarge):GenerateimagefilesusingLiveDocx除了上面列出的文件之外,除了LiveDocx支持的文字处理文件格式外,您还可以还将生成的文档另存为一个或多个图像文件。为此,Zend_Service_LiveDocx_MailMerge提供方法getAllBitmaps()和getBitmaps()://实例化LiveDocx//获取所有位图//(zoomFactor,format)$bitmaps=$phpLiveDocx->getAllBitmaps(100,'png');同样,您可以检索特定范围内的页面图像://Getbitmapswithinaspecifiedrangejust//(fromPage,toPage,zoomFactor,format)$Bitmap=$phpLiveDocx->getBitmaps(2,2,100,'PNG');注意zoomFactor参数。这是一个百分比值,范围从10%到400%。这些方法非常适合生成您创建的文档的缩略图,例如,在浏览器中显示为预览。通过迭代$bitmaps数组,可以将实际图像文件写入磁盘。数组中每条记录一页二进制数据://写入磁盘//(每条记录一页)foreach($bitmapsas$pageNumber=>$bitmapData){$filename=sprintf('documentPage%d.png',$页码);file_put_contents($filename,$bitmapData);printf('Write%dbytestodiskas%s.%s',filesize($filename),$filename,PHP_EOL);在您自己的应用程序中部署LiveDocxZend框架中提供的LiveDocxPHP5实现的代码是在新BSD许可下发布的,因此可以根据许可条款在大多数项目中部署、修改和重新分发.然而,实际的LiveDocxSOAP服务器是专有软件。可以通过三种方式在您自己的应用程序中部署SOAP服务。免费公共服务器对于绝大多数应用程序,开发人员选择这种方式。ZendFramework组件中引用的默认LiveDocx服务器是免费的公共服务器。完全免费用于您自己的应用程序。注册一个LiveDocx帐户。高级托管服务器如果您的应用程序每小时生成数千个文档,您可以考虑每月支付少量费用来访问您自己的个人LiveDocx服务器。与领先的托管服务提供商合作,您可以租用此类高级托管服务器。本地许可证服务器如果您的应用程序在一个小时内生成超过一万个文档,您可以考虑在您的本地网络中安装一个LiveDocx服务器。直接访问本地千兆网络是迄今为止部署LiveDocx的最快方式。
