使用TCPDF插件生成pdf以及pdf的中文处理
2014-04-23 11:21
393 查看
做了这么多年项目,以前只是在别人的项目中了解过php生成pdf文件,知道并不难,但是涉及到了pdf开发库,首先介绍pdf库。
1) 先获取所有的远程html,然后生成wkhtmltopdf的shell脚本
2) 在php中执行此shell脚本文件批量生成pdf(当然是采用定时任务)
3) 前端页面中检查当前页面是否存在此pdf,如果存在则显示下载链接
在linux和mac os等其它平台安装文档:http://www.tecmint.com/install-wkhtmltopdf-html-page-to-pdf-converter-in-rhel-centos-fedora/
要想完好支持html中的url和其它,参考:/article/6209933.html
说明文档: http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9.9-doc.html
wkhtmltopdf安装包
php使用方法: http://mikehaertl.github.com/phpwkhtmltopdf/
例子:
FPDF是一个纯粹的通过PHP类来生成PDF文档的方法,需要生成的内容直接在PHP代码中来指定,生成文字,图片,线条等等,都有自己的方法。不足的是utf8和中文支持很差,分别需要调用chinese-unicode.php和chinese.php等扩展文件,附上一个简单的例子:
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
但是经过本人的实践,使用这两种字体,的确是支持中文,但是英文的显示并不是太好,这种方式生成的PDF文件的优点是:文件体积小,生成快速。但也有缺点是,没有嵌入中文字体,只限于安装了Adobe Reader之后才能正常显示。那万一用户使用的是FoxIt Reader或者是Linux操作系统呢?显示效果就不一样了。因此,为了保证生成的PDF文件在任何环境下都有同样的显示效果,嵌入字体是必需的。
Windows下有很多中文字体,但是我们要用在TCPDF中的中文字体有下面几个要求:
· 支持Unicode,因为TCPDF支持的是Unicode;
· 体积越小越好;
· 最好是也支持繁体中文;
将下载后的DroidSansFallback.ttf字体文件复制到tcpdf目录下的fonts目录,并保证web服务器对该目录有读写的权限,否则在生成tcpdf字体是会出错。DroidSansFallback.ttf下载地址
在你的代码中添加如下代码:
这句代码将你下载的ttf字体自动转化为tcpdf使用的字体,将在font目录下增加这几个文件“droid_sans_fallback.ctg.z,droid_sans_fallback.php,droid_sans_fallback.z”,生成之后,以后就可以直接使用这种字体了。
以下为完整的代码:
生成的pdf就是这样的:
以上中文问题已经解决,当然,你还可以寻找其他的字体,然后进行尝试。
多种多样的pdf开发库
1.WKHTMLTOPDF
wkhtmltopdf是一个很好的解决方案,基本上可以原样输出html页面中的内容,包括:图片/代码高亮部分css/页头/页尾等。有php和命令行方式,大概思路如下:1) 先获取所有的远程html,然后生成wkhtmltopdf的shell脚本
2) 在php中执行此shell脚本文件批量生成pdf(当然是采用定时任务)
3) 前端页面中检查当前页面是否存在此pdf,如果存在则显示下载链接
<?php $domain = "http://wiki.eoe.cn"; $htmlUrl = $domain . "/show/html/slug/$slug"; $_binpath = '/usr/local/bin/'; $_binname = 'wkhtmltopdf'; $savePath = "/User/Xia/eoecn/pdf/"; if (!is_dir($savePath)) { //需要自己编写mkdirs函数 @mkdirs($savePath); } //由于生成中文目录会乱码,这里过滤掉 if (preg_match("/[x7f-xff]/", $slug)) { $filename = "wiki-slug-$id"; }else { $filename = $slug; } $saveFile = $savePath . $filename . '.pdf'; //判断是否已经存在 if (file_exists($saveFile)) { die($saveFile); } $header = $domain . "/pdf/header"; $command = $_binpath . $_binname . ' -T 15mm --header-spacing 5 --header-html ' . $header . ' --footer-right "[page]/[toPage]" ' . $htmlUrl . ' ' . $saveFile; if ($exec) { exec($command, $output, $var); } ?>代码托管在: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和其它,参考:/article/6209933.html
说明文档: http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9.9-doc.html
wkhtmltopdf安装包
php使用方法: http://mikehaertl.github.com/phpwkhtmltopdf/
例子:
<?php require_once('WkHtmlToPdf.php'); $pdf = new WkHtmlToPdf; // Add a HTML file, a HTML string or a page from a URL $pdf->addPage('/home/eoe/page.html'); $pdf->addPage('<html>....</html>'); $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');
2.FPDF
FPDF是一个纯粹的通过PHP类来生成PDF文档的方法,需要生成的内容直接在PHP代码中来指定,生成文字,图片,线条等等,都有自己的方法。不足的是utf8和中文支持很差,分别需要调用chinese-unicode.php和chinese.php等扩展文件,附上一个简单的例子:<?php require('chinese-unicode.php'); $pdf=new PDF_Unicode(); $pdf->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(); ?>
3.TCPDF
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);
但是经过本人的实践,使用这两种字体,的确是支持中文,但是英文的显示并不是太好,这种方式生成的PDF文件的优点是:文件体积小,生成快速。但也有缺点是,没有嵌入中文字体,只限于安装了Adobe Reader之后才能正常显示。那万一用户使用的是FoxIt Reader或者是Linux操作系统呢?显示效果就不一样了。因此,为了保证生成的PDF文件在任何环境下都有同样的显示效果,嵌入字体是必需的。
Windows下有很多中文字体,但是我们要用在TCPDF中的中文字体有下面几个要求:
· 支持Unicode,因为TCPDF支持的是Unicode;
· 体积越小越好;
· 最好是也支持繁体中文;
将下载后的DroidSansFallback.ttf字体文件复制到tcpdf目录下的fonts目录,并保证web服务器对该目录有读写的权限,否则在生成tcpdf字体是会出错。DroidSansFallback.ttf下载地址
在你的代码中添加如下代码:
$fontname = $this->tcpdf->addTTFfont('dist/font/Droid_Sans_Fallback.ttf', 'TrueTypeUnicode', '', 32);
$this->tcpdf->SetFont($fontname, '', 10);
这句代码将你下载的ttf字体自动转化为tcpdf使用的字体,将在font目录下增加这几个文件“droid_sans_fallback.ctg.z,droid_sans_fallback.php,droid_sans_fallback.z”,生成之后,以后就可以直接使用这种字体了。
以下为完整的代码:
//加载配置文件以及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就是这样的:
以上中文问题已经解决,当然,你还可以寻找其他的字体,然后进行尝试。
相关文章推荐
- PHP 使用TCPDF插件生成pdf以及pdf的中文处理
- php使用TCPDF生成支持中文的pdf
- 使用TCPDF生成pdf,中文显示为问号
- PHP下的HTML转PDF以及日文的处理(中文同理)
- php采用tcpdf生成pdf支持中文,图片
- JAVAWEB开发之数据库简介、MySQL的安装与卸载(处理中文乱码)、以及MySQL语言(DDL、DML、DCL、DQL)的详解和使用
- 使用itext将html生成pdf中文换行问题解决方案2
- Laravel 使用TCPDF生成PDF文档 - tcpdf
- 关于使用reportlab生成中文PDF文档
- JasperReport生成PDF中文不显示处理
- 使用iText5.x创建PDF中文处理问题
- 在网页中使用jQuery-qrcode生成二维码以及中文支持解决方案
- PHP下的HTML转PDF以及日文的处理(中文同理)
- 分享一个 jsPDF的简单使用以及中文编码问题的解决
- PHP下的HTML转PDF以及日文的处理(中文同理)
- PDF网页显示: object标签使用pdf插件打开中文文件的问题 (WEB开发)
- iText生成中文PDF行首标点处理
- PDF网页显示: object标签使用pdf插件打开中文文件的问题 (WEB开发)
- 对itext导出PDF的一些小总结,以及ireport中生成中文PDF
- 使用xpdf来处理中文PDF文档