做了这么多年项目,以前只是在别人的项目中了解过php生成pdf文件,知道并不难,但是涉及到了pdf开发库,首先介绍pdf库。
代码托管在:https://code.google.com/p/wkhtmltopdf/在linux和mac os等其它平台安装文档:http://www.tecmint.com/install-wkhtmltopdf-html-page-to-pdf-converter-in-rhel-centos-fedora/
要想完好支持html中的url和其它,参考:http://www.cnblogs.com/timelyxyz/archive/2012/12/24/2831523.html
说明文档: http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9.9-doc.html
wkhtmltopdf安装包
php使用方法: http://mikehaertl.github.com/phpwkhtmltopdf/
例子:addPage('/home/eoe/page.html');
$pdf->addPage('....');
$pdf->addPage('http://google.com');
// Add a cover (same sources as above are possible)
$pdf->addCover('mycover.pdf');
// Add a Table of contents
$pdf->addToc();
// Save the PDF
$pdf->saveAs('/tmp/new.pdf');
// ... or send to client for inline display
$pdf->send();
// ... or send to client as file download
$pdf->send('test.pdf');
FPDF是一个纯粹的通过PHP类来生成PDF文档的方法,需要生成的内容直接在PHP代码中来指定,生成文字,图片,线条等等,都有自己的方法。不足的是utf8和中文支持很差,分别需要调用chinese-unicode.php和chinese.php等扩展文件,附上一个简单的例子:
Open();
$pdf->AddPage();
$pdf->AddUniCNShwFont('uni');
$pdf->SetFont('uni','',20);
$pdf->Write(10, "eoe移动开发者社区");
$pdf->Ln();
$pdf->MultiCell (120, 10, "开发者社区");
$pdf->Cell (240, 10, "本文是用utf8编码格式");
$pdf->Ln();
$pdf->Output();
?>
TCPDF是一个用于快速生成PDF文件的PHP5函数包。TCPDF基于FPDF进行扩展和改进。支持UTF-8,Unicode,HTML和 XHTML。但是文件很多很大,配置起来比较复杂。相对而言对复杂的css渲染效果不好,而且不能支持html中太多的css文件,用php转换效率很慢。
不过官方的文档很多,例子也很多,也能够生成很漂亮的pdf文件。官方网址为:http://www.tcpdf.org/
本人使用的就是这个工具包,所以着重给大家介绍一下,个人认为TCPDF还是很好用的,足以满足大多数pdf应用,官方提供了丰富的文档以及例子,各种特性都提供了详细的例子,上手极快。
以下为TCPDF目录结构:
本人使用的是CI框架,在将这个库集成进来的时候,对这个包做了一些改动。
1.所有的基础配置信息都在tcpdf根目录“examples/include/tcpdf_config_alt.php”中,我们为了简化配置,也使用了它原生的配置文件,以简化在开发过程中的配置,将该文件的内容拷贝至CI框架application/conf/pdf_config.php中,找到“K_PATH_IMAGES”配置项,将其值修改为你项目中图片所在的位置,到时候在省城pdf时,所用到的图片资源,将从这里查找。
“PDF_HEADER_LOGO”用于配置pdf中header中logo图片,如需要的话设置成你自己的
还有其他一些常用的配置,如配置Top margin、Bottom margin、Left margin、Default main font name
使用tcpdf时中文问题是比较常见,在新版的tcpdf中,已经支持中文了,在fonts目录下有个cid0cs.php和stsonstdlight.php文件,只要直接使用即可
$pdf->SetFont('cid0cs', '', 10);
$pdf->SetFont('stsongstdlight','', 10);
在你的代码中添加如下代码:
$fontname = $this->tcpdf->addTTFfont('dist/font/Droid_Sans_Fallback.ttf', 'TrueTypeUnicode', '', 32);
$this->tcpdf->SetFont($fontname, '', 10);
以下为完整的代码:
//加载配置文件以及pdf类
require_once(APPPATH . 'config/pdf_config.php');
$this->load->library('tcpdf/tcpdf');
// set document information
$this->tcpdf->SetCreator(PDF_CREATOR);
$this->tcpdf->SetAuthor('aaron');
$this->tcpdf->SetTitle($cur_order['title']);
$this->tcpdf->SetSubject('lvpad');
$this->tcpdf->SetKeywords('lvpad, china tour, guide');
// set default header data
$this->tcpdf->SetHeaderData('logo.png', PDF_HEADER_LOGO_WIDTH, 'lvpad order', '');
// set header and footer fonts
$this->tcpdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$this->tcpdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
// set default monospaced font
$this->tcpdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
// set margins
$this->tcpdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$this->tcpdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$this->tcpdf->SetFooterMargin(PDF_MARGIN_FOOTER);
// set auto page breaks
$this->tcpdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
// set image scale factor
$this->tcpdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
//set some language-dependent strings (optional)
$l['a_meta_charset'] = 'UTF-8';
$l['a_meta_dir'] = 'ltr';
$l['a_meta_language'] = 'cn';
// TRANSLATIONS --------------------------------------
$l['w_page'] = 'page';
$this->tcpdf->setLanguageArray($l);
// 设置字体,如果要支持中文 则选择支持中文的字体
$fontname = $this->tcpdf->addTTFfont('dist/font/Droid_Sans_Fallback.ttf', 'TrueTypeUnicode', '', 32);
$this->tcpdf->SetFont($fontname, '', 10);
// add a page
$this->tcpdf->AddPage();
$this->tcpdf->setJPEGQuality(75);
// Image example with resizing
$this->tcpdf->Image('images/pdf.jpg', 10, 20, 190, 60, 'JPG', 'http://lvpad.com', '', false, 150, '', false, false, 1, false, false, false);
// output the HTML content
$this->tcpdf->writeHTML($html_content, true, false, true, false, '');
// reset pointer to the last page
$this->tcpdf->lastPage();
//Close and output PDF document
$this->tcpdf->Output($cur_order['title'] . '.pdf', 'I');
生成的pdf就是这样的: