haidong 发表于 2010-2-24 13:41:19

用PHP编写PDF文档生成器

<P>PHP一个最大的优点就是它对新技术的支持非常容易,这种语言的可扩展性使得开发人员能够很方便地添加新的模块,而且遍布世界的技术团体的支持和众多扩展模块的支持使得PHP已经成为功能最齐全的Web编程语言之一。目前可得到的扩展模块已经能够使开发人员执行IMAP和POP3操作,可以动态产生图象和Shockwave Flash动画,进行信用卡验证,敏感数据的加密解密,还能够解析XML格式的数据。但这还不是全部,现在,又有一个新的模块可以与PHP进行绑定了,那就是PDFLib扩展模块,它能够让开发人员动态产生PDF(Adobe Portable Document Format)格式的文件,下面就先看看如何在PHP里使用这个模块。<BR><BR>为了能够使PHP具有操作PDF格式文档的能力,你必须先在你的系统里安装PDFLib扩展库,如果你使用的是Lunix系统,你可以从 http://www.pdflib.com/pdflib/index.html下载一个并进行编译,如果你使用的是Windows系统,那就更简单了,只需要下载一个编译好的PDFLib库,然后在PHP的配置文件里把相应的行的注释去掉即可。<BR><BR><BR>extension=php_pdf.dll<BR><BR><BR>如果是动态装载,也可以是参照下面的命令:<BR><BR><BR>dl("php_pdf.dll");<BR><BR><BR>此外,你还必须有一个Adobe Acrobat PDF阅读器,用来浏览PDF格式,如果你没有,你可以从http://www.adobe.com/免费下载。<BR><BR>一旦你做好了前期准备,就可以创建PDF文件了,下面就是一个简单的例子:<BR><BR><BR></P><P >&lt;?php<BR><BR>// 创建一个新的PDF文档句柄<BR><BR>$pdf = PDF_new();<BR><BR><BR>// 打开一个文件<BR><BR>PDF_open_file($pdf, "PDFTest.pdf");<BR><BR><BR>// 开始一个新页面(A4)<BR><BR>PDF_begin_page($pdf, 595, 842);<BR><BR><BR>// 得到并使用字体对象<BR><BR>$arial = PDF_findfont($pdf, "Arial", "host", 1);<BR><BR>PDF_setfont($pdf, $arial, 10);<BR><BR><BR>// 输出文字<BR><BR>PDF_show_xy($pdf, "This is an exam of PDF Documents, It is a good Lib,",50, 750);<BR><BR>PDF_show_xy($pdf, "If you like,please try yourself!", 50, 730);<BR><BR><BR>// 结束一页<BR><BR>PDF_end_page($pdf);<BR><BR><BR>// 关闭并保存文件<BR><BR>PDF_close($pdf);<BR><BR>?&gt;</P><BR><BR><BR>然后保存成PHP文件,在浏览器里进行浏览,PHP就会执行上面的代码,它产生一个新的PDF文件,并保存到指定的位置。<BR><BR>现在我们分析一下什么的代码,要使用PHP创建PDF文件,有四个步骤:1,创建文档句柄;2,注册文档的字体和颜色;3,用PDFLib提供的函数向文件句柄写文字或画图;4,保存文档。<BR><BR>首先,创建PDF文档句柄,语法如下:<BR><BR><BR>$pdf = PDF_new();<BR><BR><BR>这个任务是由PDF_new()函数完成的,它返回一个PDF文档的句柄,这个句柄将会被后续的所有操作使用。<BR><BR>下一步要做的,就是给PDF文件一个名字,由PDF_open_file()函数完成,它需要先前创建的文件句柄和自定义的文件名做参数:<BR><BR><BR>PDF_open_file($pdf, "PDFTest.pdf");<BR><BR><BR>一旦我们创建了文档,就可以用PDF_begin_page()函数在其中插入新页面了:<BR><BR><BR>PDF_begin_page($pdf, 595, 842);<BR><BR><BR>然后用PDF_end_page()结束页面。<BR><BR>注意这里,在PDF_begin_page()函数里,有另外两个参数,他们分别代表页面尺寸的宽和高,单位是磅(point,1磅等于1/72英寸),或许在这里数学并不是你的强项,PHP还提供了大多数标准页面尺寸,象A4等,上面的例子就是使用A4的尺寸。<BR><BR>在调用PDF_begin_page()函数和PDF_end_page()函数之间的代码是向PDF文档了写内容的,内容可以是文字、图象以及几何图形等。例子中只是写了一行文字,先得到一个字体,然后把文字写到文档里。通过PDF_findfont()和PDF_setfont()函数选择和注册字体是很方便的,PDF_findfont()函数预备了一种文档中要使用的字体,需要的参数有字体的名字,使用的编码,字体是否要嵌入到PDF文件中。PDF_findfont()函数返回一个字体对象,它将会在PDF_setfont()函数里使用。<BR><BR><BR>$arial = PDF_findfont($pdf, "Arial", "host", 1);<BR><BR>PDF_setfont($pdf,$arial, 10);<BR><BR><BR>一旦我们设定了字体,就可以使用PDF_show_xy()函数向页面中的指定位置写字符串了。<BR><BR><BR>PDF_show_xy($pdf, "This is an exam of PDF Documents, It is a good Lib,",50, 750);<BR><BR>PDF_show_xy($pdf, "If you like,please try yourself!", 50, 730);<BR><BR><BR>PDF_show_xy()函数用来向页面写内容,最后两个参数是要写入的字符串的坐标位置,注意坐标的原点(0,0)是在文档的左下角。一旦文字写完了,页面就可以关闭了PDF_end_page(),当然你也可以写更多的页。所有的页面写完之后,用PDF_close()函数关闭文档,此时文档就回保存到调用PDF_open_file()函数时指定的文件名和路径下,文档句柄随之销毁。<BR><BR>PDFLib库能做的事情还远不止这些,还可以在页面里加入图象,我们以前面的文件为例,在文字的下面添加一个图象文件,下面的语句实现了添加图象功能:<BR><BR><BR>$image = PDF_open_image_file($pdf, "jpeg", "PDFImageTest.jpg");<BR><BR>PDF_place_image($pdf, $image, 50, 650, 0.25);<BR><BR><BR>是不是很简单?PDF_open_image_file()函数打开一个图形文件,可以接受的图象类型有:GIF, JPEG, TIFF 和 PNG,该函数返回图象句柄,PDF_place_image()函数利用前面的图象句柄,把图象插入到PDF文档中。注意这里的坐标位置是指图象的左下角,最后一个参数是图象显示时的比例因子,1是与实际大小一样显示,0.5是按原来尺寸的一半显示。<BR><BR>除了在PDF文档里画出现有的图象以外,PDF模块还提供了许多函数来让我们画出几何图形。比如:直线、圆、长方形等几何图案,下面就是一段画直线的实现方法:<BR><BR><BR><P >&lt;?php<BR><BR>$pdf = PDF_new();<BR><BR>PDF_open_file($pdf, "LineExam.pdf");<BR><BR>PDF_begin_page($pdf, 595, 842);<BR><BR>$arial = PDF_findfont($pdf, "Arial", "host", 1);<BR><BR>PDF_setfont($pdf, $arial, 12);<BR><BR><BR>// 设定直线的颜色<BR><BR>PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0);<BR><BR><BR>// 在左上角放置一个Logo标识<BR><BR>$image = PDF_open_image_file($pdf, "jpeg", "logo.jpg");<BR><BR>PDF_place_image($pdf, $image, 50, 785, 0.5);<BR><BR><BR>// 在Logo标识下画出直线<BR><BR>PDF_moveto($pdf, 20, 780);<BR><BR>PDF_lineto($pdf, 575, 780);<BR><BR>PDF_stroke($pdf);<BR><BR><BR>// 在页面底部画出另外一条直线<BR><BR>PDF_moveto($pdf, 20,50);<BR><BR>PDF_lineto($pdf, 575, 50);<BR><BR>PDF_stroke($pdf);<BR><BR><BR>// 输出一些文字<BR><BR>PDF_show_xy($pdf, "Meng's Corporation", 200, 35);<BR><BR>PDF_end_page($pdf);<BR><BR>PDF_close($pdf);<BR><BR>?&gt;</P><BR><BR><BR>从上面的例子可以看出,要画一条直线,只需要三个函数即可:PDF_moveto(), PDF_lineto() 和 PDF_stroke()。上面的例子是先用PDF_moveto($pdf, 20, 780)函数把光标移动到坐标(20,780),然后用PDF_lineto($pdf, 575, 780)函数定义直线的另外一个点的坐标(575,780),最后用PDF_stroke($pdf)画出线。设定颜色的函数PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0)有好几个参数,其中的颜色填充模式有stroke、fill、both三种选项,颜色可以是RGB或CMYK配色方案的颜色值。值得注意的是:PDF_setcolor()函数中使用的值是颜色的百分比,也就是说是该颜色的亮度,比如:如果想设为红色(RGB:255,0,0),你可以这样写:PDF_setcolor($pdf, "stroke", "rgb", 1, 0, 0),如果想设为黄色,可以这样:PDF_setcolor($pdf, "stroke", "rgb", 1, 1, 0)。<BR><BR><BR>要想画带填充色的长方形和圆形,可以使用下面的方法:<BR><BR><BR><P >//设定填充颜色<BR><BR>PDF_setcolor($pdf, "fill", "rgb", 1, 1, 0);<BR><BR><BR>// 设定边框线的颜色<BR><BR>PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 0);<BR><BR><BR>// 画矩形,后面的四个参数分别是左下角的坐标X、Y和宽度、高度<BR><BR>PDF_rect($pdf, 50, 500, 200, 300);<BR><BR>PDF_fill_stroke($pdf);<BR><BR>PDF_setcolor($pdf, "fill", "rgb", 0, 1, 0);<BR><BR>PDF_setcolor($pdf, "stroke", "rgb", 0, 0, 1);<BR><BR><BR>// 画出圆,参数分别是圆心坐标和圆的半径</P><BR><BR>PDF_circle($pdf, 400, 600, 100)<BR><BR><BR>此外,PDFLib还提供了书写文档摘要信息的函数,这些函数以PDF_set_info_*()开头,这些信息可以包括:文档的作者、标题、内容,主题等。下面是几个常用的函数:<BR><BR><BR>PDF_set_info_author($pdf, "net_lover");<BR><BR>PDF_set_info_creator($pdf, "Meng Xianhui");<BR><BR>PDF_set_info_title($pdf, "PHP Exam");<BR><BR>PDF_set_info_subject($pdf, "PHP");<BR><BR>PDF_set_info_keywords($pdf, "PHP PDF PDFLib");<BR><BR><BR>当用Acrobat Reader打开这样的文档时,在菜单“文件”-“文档属性”-“摘要”里就能看到上面写进去的信息。<BR><BR>说到这里,相信大家对如何使用PDFLib创建PDF文档有了基本的了解了吧。下面,我们就以一个实际的例子来看看如何为我们的工作服务。这个例子就是根据提供的数据来生成饼图,首先,建立一个数据输入表单,输入饼图中每一块的大小。文件如下:<BR><BR><BR><P >&lt;html&gt;<BR><BR>&lt;head&gt;<BR><BR>&lt;title&gt;利用PHP创建PDF文档(饼图)&lt;/title&gt;<BR><BR>&lt;/head&gt;<BR><BR>&lt;body&gt;<BR><BR>&lt;h3&gt;饼图生成器&lt;/h3&gt;<BR><BR>&lt;table cellspacing="5" cellpadding="5"&gt;<BR><BR>&lt;form action="pie.php" method=POST&gt;<BR><BR>&lt;tr&gt;<BR><BR>&lt;td&gt;请输入饼图中每一块的数据值,以(,)分割开:&lt;/td&gt;&lt;/tr&gt;<BR><BR>&lt;tr&gt;&lt;td&gt;&lt;input type=text name=data&gt;&lt;/td&gt;&lt;/tr&gt;<BR><BR>&lt;tr&gt;&lt;td&gt;&lt;input type=submit value="产生PDF饼图"&gt;&lt;/td&gt;&lt;/tr&gt;<BR><BR>&lt;/form&gt;<BR><BR>&lt;/table&gt;<BR><BR>&lt;/body&gt;<BR><BR>&lt;/html&gt;<BR><BR><BR>下面是pie.php文件的代码:<BR><BR><BR>&lt;?php<BR><BR>// 接受书库<BR><BR>$data = $_POST['data'];<BR><BR>$slices = explode(",", $data);<BR><BR><BR>// 初始化变量<BR><BR>$sum = 0;<BR><BR>$degrees = Array();<BR><BR>$diameter = 200;<BR><BR>$radius = $diameter/2;<BR><BR><BR>// 设定每一块饼图的颜色,用数组存储<BR><BR>$colours = array(array(0,0,0),array(0,0,1),array(0,1,0),<BR><BR>array(1,0,0),array(0,1,1),array(1,1,0),<BR><BR>array(1,0,1));<BR><BR><BR>// 计算总的数值<BR><BR>$sum = array_sum($slices);<BR><BR><BR>// 把每一块分别转换成相应的百分数(360度圆)<BR><BR>for ($y=0; $y&lt;sizeof($slices); $y++) {<BR><BR>$degrees[$y] = ($slices[$y]/$sum) * 360;<BR><BR>}<BR><BR><BR>// 开始创建 PDF 文档<BR><BR>$pdf = PDF_new();<BR><BR>PDF_open_file($pdf, "chart.pdf");<BR><BR>PDF_begin_page($pdf, 500, 500);<BR><BR>PDF_setcolor($pdf, "stroke", "rgb", 1, 1, 0);<BR><BR>PDF_moveto($pdf, 250, 250);<BR><BR>PDF_lineto($pdf, 350, 250);<BR><BR>PDF_stroke($pdf);<BR><BR><BR>for ($z=0; $z&lt;sizeof($slices); $z++)<BR><BR>{<BR><BR>// 设定填充颜色<BR><BR>PDF_setcolor($pdf, "fill", "rgb", $colours[$z],<BR><BR>$colours[$z], $colours[$z]);<BR><BR><BR>// 计算每个圆弧的终点坐标<BR><BR>$end_x = round(250 + ($radius * cos($last_angle*pi()/180)));<BR><BR>$end_y = round(250 + ($radius * sin($last_angle*pi()/180)));<BR><BR><BR>// 用直线分割每一块圆弧<BR><BR>PDF_moveto($pdf, 250, 250);<BR><BR>PDF_lineto($pdf, $end_x, $end_y);<BR><BR><BR>// 计算并画出圆弧<BR><BR>PDF_arc($pdf, 250, 250, $radius, $last_angle,($last_angle+$degrees[$z]));<BR><BR><BR>// 保存最后的角度<BR><BR>$last_angle = $last_angle+$degrees[$z];<BR><BR><BR>// 填充颜色<BR><BR>PDF_fill_stroke($pdf);<BR><BR>}<BR><BR><BR>// 重画外圆轮廓<BR><BR>PDF_circle($pdf, 250, 250, 100);<BR><BR>PDF_stroke($pdf);<BR><BR><BR>PDF_end_page($pdf);<BR><BR>PDF_close($pdf);<BR><BR><BR>// 如果要直接输出到客户端的话,把下面的代码加上<BR><BR>$buf = PDF_get_buffer($p);<BR><BR>$len = strlen($buf);<BR><BR>header("Content-type: application/pdf");<BR><BR>header("Content-Length: $len");<BR><BR>header("Content-Disposition: inline; filename=Pie_php.pdf");<BR><BR>print $buf;<BR><BR>PDF_delete($p);<BR><BR>?&gt;</P><BR><BR><BR>运行上面的程序,并输入不同数值,你将会得到不同的饼图。<BR><BR>PDFLib是一个兼容性很好的模块,你不但可以用PHP编写,还可以用Java,C#,VB.NET,VB5/6(ActiveX/COM),ASP(VBScript/Jscript),Borland Delphi, Windows Script Host,ColdFusion4.5+,C/C++,Python,Perl,RPG;支持的平台不仅仅有Windows,还有Unix/Linux,Mac OS,IBM eServer iSeries 400 和 zSeries S/390等,具体的运行环境请随时访问他们的网站得到最新的资料。<BR></div>

jinlequan 发表于 2012-4-25 23:23:27

{:6_267:}

jinlequan 发表于 2012-4-25 23:25:36

{:6_267:}

332104496 发表于 2012-6-22 15:28:04

{:6_290:}

857401199 发表于 2015-3-18 08:57:09

顶帖!~!~!~~!~!!~

857401199 发表于 2015-3-25 09:15:04

虚拟主机比较适合一般的企业站,中小型的,当企业规模发展壮大了以后,单纯的网站空间也许再也满足不了企业网站的需求之后,也许就会把目光放在了主机托

管上面,下面第一商务来讲解服务器托管需注意的两大点。

一、托管服务器能小则小

在机房里面想要租一个位置价格不会低,虽然对于一些小型公司来说,节约成本是前期计划里的一部分,但是也要学会如何去省,虽然主机托管价格颇高,但是硬

件强大,把视线放远一点还是非常划算的。1U服务器在主机托管领域的应用是很有实际意义的。所以,要去托管,就请先把你塔式服务器里的配件拿出来,装进1U

服务器机箱里,能节省下多少钱您心里应该有数的,而且加上主机托管的年份,节省的成本数可想而知了。

二、选择托管商的风险

目前国内市场上的主机托管价格不同的服务商不一样的价格,有的贵的离谱有的又超便宜,虽然说太贵的租不起,但是也别选择太便宜的,当中的猫腻显而易见,

就是质量和服务的问题。有些服务商平时好好的,一旦遇到经济波动或者资金周转不当,就撒手不管或者更换机房位置、IP,那就大事不妙了,也许听上去比较少

见,但是中国之大,这种情况还是经常发生的。

第一商务在这里奉劝打算主机托管的朋友,尽量选择大的有实力的服务商,如果您将来服务器上是要放置上百个企业的网站资料,那就要小心行事,一旦出问题,

只要有一两家企业因为服务器中断,告到工商局,你就惨了,轻则罚款,重则关门。


网址:yun77.net
电话:4000351360
页: [1]
查看完整版本: 用PHP编写PDF文档生成器