<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Fwolf's Blog &#187; TCPDF - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/tcpdf/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fwolf.com/blog</link>
	<description>随心·随意·随缘·努力～</description>
	<lastBuildDate>Wed, 07 Jul 2010 07:07:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>在GLPI中输出中文PDF文件</title>
		<link>http://www.fwolf.com/blog/post/434</link>
		<comments>http://www.fwolf.com/blog/post/434#comments</comments>
		<pubDate>Wed, 01 Apr 2009 17:19:00 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[chinese]]></category>
		<category><![CDATA[diff]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[ezpdf]]></category>
		<category><![CDATA[font]]></category>
		<category><![CDATA[GLPI]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[TCPDF]]></category>
		<category><![CDATA[utf8]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/434</guid>
		<description><![CDATA[PDF，好东西，就是麻烦，以前鼓捣ThingkingRock的时候打过交道，感觉挺复杂，现在捣鼓GLPI时又遇到了，GLPI用的是ezpdf。 先说点闲话，有些比较偏门的东西是真难找啊，比如今天要说的，算不上是学术问题，也没有企业级的支持（如果你愿意打电话咨询GLPI官方又懂法语我没话说），只能在网上大海捞针的找，一方面这是很辛苦的，查阅各类资料几十篇（前提还是你得能找到），写下来也就寥寥百余字，所以我一般愿意把我翻到的资料列在后面作为参考，或许能为别人省点力气；另一方面就是搜索引擎的功劳了，记得还没有google和百度的时候，只有一个yahoo分类目录，要搜问题就得到几个大型论坛比如CSDN里去翻，信息量就窄多了，另外搜索引擎的质量在这里也起到了很大的作用，信息重复率高不高、能否最快速度找到原创内容、信息关联度、是否有用等因素都关系到用户花费时间的多少，这也是我很少用百度的原因之一，还有就是感觉百度的英文资料差太多了。────谨以此纪念我几乎24小时的连续工作以及疲惫的眼睛和脖子。 EZPDF EZPDF一般是不支持unicode多字节编码的，不过还是作了一些尝试，毕竟是GLPI内置的，搞定了用着方便。首先EZPDF使用afm字体，要得到afm字体，需要用到ttf2tex，在pdfTeX包里： $ aptitude install ttf2tex 转换字体，这次我不用宋体了，用于打印的，还是仿宋看着舒服，用了个方正仿宋简体： $ ttf2afm -e T1-WGL4.enc -o fzfangsong.afm fzfangsong.TTF 试了试不能用，然后用afm2font处理： $ php5 afm2font.php fzfangsong 得到php_fzfangsong.font等文件，但这些文件无论怎么套上ezpdf都是不行，什么文字都没了，pdf文件中倒是显示了正确的字体名： fzfangsong Type1 Not embedded 再在网上翻资料，简直就是钻到TeX用户堆儿里去了，忽然发现windows字体应该是TrueType字体，而ezpdf使用的难道是Type1字体，两者之间还需要转换？终于查到基于texlive2008的中文绿色免安装tex系统中有打包的字体，这里面有给TeX用的Type1字体，就是大了点，“dottexlive2008.tar.bz2 仅包含全部字体包和相关宏包”一共是685M，拉下来，好在网速还算很快。把里面的afm字体单独解压出来： $ tar xjvf /big1/dottexlive2008.tar.bz2 .texlive2008/texmf-var/fonts/afm/ $ cd .texlive2008/texmf-var/fonts/afm/cjk/gbkfs $ cat gbkfs??.afm &#62; gbkfs.afm 拿这个gbkfs.afm配置到ezpdf里，能打出字来了，但中文还是问号，估计是因为数据是utf-8编码，而字体是gbk编码的？修改class.ezpdf.php，在function ezProcessText的第一行加上（参考：ezpdf打印德文的处理）： $text = mb_convert_encoding&#40;$text, 'gbk', 'utf-8'&#41;; 还是问号，难道字体要嵌入pdf才行？ 结果又查到一篇Choosing a PHP PDF generation library [...]]]></description>
			<content:encoded><![CDATA[<p>PDF，好东西，就是麻烦，以前<a href="419">鼓捣ThingkingRock</a>的时候打过交道，感觉挺复杂，现在捣鼓GLPI时又遇到了，GLPI用的是ezpdf。</p>

<p>先说点闲话，有些比较偏门的东西是真难找啊，比如今天要说的，算不上是学术问题，也没有企业级的支持（如果你愿意打电话咨询GLPI官方又懂法语我没话说），只能在网上大海捞针的找，一方面这是很辛苦的，查阅各类资料几十篇（前提还是你得能找到），写下来也就寥寥百余字，所以我一般愿意把我翻到的资料列在后面作为参考，或许能为别人省点力气；另一方面就是搜索引擎的功劳了，记得还没有google和百度的时候，只有一个yahoo分类目录，要搜问题就得到几个大型论坛比如CSDN里去翻，信息量就窄多了，另外搜索引擎的质量在这里也起到了很大的作用，信息重复率高不高、能否最快速度找到原创内容、信息关联度、是否有用等因素都关系到用户花费时间的多少，这也是我很少用百度的原因之一，还有就是感觉百度的英文资料差太多了。────谨以此纪念我几乎24小时的连续工作以及疲惫的眼睛和脖子。</p>

<h2>EZPDF</h2>

<p>EZPDF一般是不支持unicode多字节编码的，不过还是作了一些尝试，毕竟是GLPI内置的，搞定了用着方便。首先EZPDF使用afm字体，要得到afm字体，需要用到ttf2tex，在<a href="http://www.tug.org/applications/pdftex/">pdfTeX包</a>里：</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">	$ <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> ttf2tex</pre></div></div>


<p>转换字体，这次我不用宋体了，用于打印的，还是仿宋看着舒服，用了个方正仿宋简体：</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">	$ ttf2afm <span style="color: #660033;">-e</span> T1-WGL4.enc <span style="color: #660033;">-o</span> fzfangsong.afm fzfangsong.TTF</pre></div></div>


<p>试了试不能用，然后用<a href="http://ez.no/developer/contribs/hacks/afm2font__1">afm2font</a>处理：</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">	$ php5 afm2font.php fzfangsong</pre></div></div>


<p>得到php_fzfangsong.font等文件，但这些文件无论怎么套上ezpdf都是不行，什么文字都没了，pdf文件中倒是显示了正确的字体名：</p>

<pre><code>fzfangsong
Type1
Not embedded
</code></pre>

<p>再在网上翻资料，简直就是钻到TeX用户堆儿里去了，忽然发现windows字体应该是TrueType字体，而ezpdf使用的难道是Type1字体，两者之间还需要转换？终于查到<a href="http://thinfilm.ustc.edu.cn/~liangzi/software/CTeXlive/">基于texlive2008的中文绿色免安装tex系统</a>中有打包的字体，这里面有给TeX用的Type1字体，就是大了点，“dottexlive2008.tar.bz2 仅包含全部字体包和相关宏包”一共是685M，拉下来，好在网速还算很快。把里面的afm字体单独解压出来：</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">	$ <span style="color: #c20cb9; font-weight: bold;">tar</span> xjvf <span style="color: #000000; font-weight: bold;">/</span>big1<span style="color: #000000; font-weight: bold;">/</span>dottexlive2008.tar.bz2 .texlive2008<span style="color: #000000; font-weight: bold;">/</span>texmf-var<span style="color: #000000; font-weight: bold;">/</span>fonts<span style="color: #000000; font-weight: bold;">/</span>afm<span style="color: #000000; font-weight: bold;">/</span>
	$ <span style="color: #7a0874; font-weight: bold;">cd</span> .texlive2008<span style="color: #000000; font-weight: bold;">/</span>texmf-var<span style="color: #000000; font-weight: bold;">/</span>fonts<span style="color: #000000; font-weight: bold;">/</span>afm<span style="color: #000000; font-weight: bold;">/</span>cjk<span style="color: #000000; font-weight: bold;">/</span>gbkfs
	$ <span style="color: #c20cb9; font-weight: bold;">cat</span> gbkfs??.afm <span style="color: #000000; font-weight: bold;">&gt;</span> gbkfs.afm</pre></div></div>


<p>拿这个gbkfs.afm配置到ezpdf里，能打出字来了，但中文还是问号，估计是因为数据是utf-8编码，而字体是gbk编码的？修改<code>class.ezpdf.php</code>，在<code>function ezProcessText</code>的第一行加上（参考：<a href="http://issues.ez.no/6574">ezpdf打印德文的处理</a>）：</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$text</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_convert_encoding</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'gbk'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>还是问号，难道字体要嵌入pdf才行？</p>

<p>结果又查到一篇<a href="http://dokeoslead.wordpress.com/2007/12/28/choosing-a-php-pdf-generation-library-for-dokeos/">Choosing a PHP PDF generation library for Dokeos</a>，说ezpdf根本、确实、100%就不支持utf-8编码，合着白折腾了。</p>

<p>到<a href="http://www.ros.co.nz/pdf/">ezpdf官网</a>确认一下，最近的新闻是<code>17 June 2006</code>的，比上面那篇文章还晚，看来ezpdf确实是没法用了。用tcpdf吧，不过在<a href="https://dev.indepnet.net/glpi/roadmap">glpi的roadmap</a>里，<a href="https://dev.indepnet.net/glpi/ticket/712">换上tcpdf</a>是要在0.80实现的，前面还有100+ ticket没完成，也是遥遥无期啊，只好自己动手，丰衣足食了。</p>

<h2>TCPDF</h2>

<p>从官网下载<a href="http://www.tcpdf.org/">tcpdf</a>放到php的include路径下，对照<a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_fonts">字体设置方法</a>来准备字体：</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">	$ <span style="color: #7a0874; font-weight: bold;">cd</span> tcpdf<span style="color: #000000; font-weight: bold;">/</span>fonts
	<span style="color: #666666; font-style: italic;"># Simsun字体好像还不是truetype（嵌入了点阵字体），转换有些问题，先拿方正字体来用，正好方正仿宋简体打印用更好看</span>
	<span style="color: #666666; font-style: italic;">#$ ln -s /big2/fonts/xpfonts/simsun.ttf</span>
	<span style="color: #666666; font-style: italic;"># 注意文件名转为小写</span>
	$ <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>big2<span style="color: #000000; font-weight: bold;">/</span>fonts<span style="color: #000000; font-weight: bold;">/</span>fzfont<span style="color: #000000; font-weight: bold;">/</span>fzfangsong.TTF fzfangsong.ttf
	$ utils<span style="color: #000000; font-weight: bold;">/</span>ttf2ufm <span style="color: #660033;">-a</span> <span style="color: #660033;">-F</span> fzfangsong.ttf 
	<span style="color: #666666; font-style: italic;"># 生成了3个新文件</span>
	$ <span style="color: #c20cb9; font-weight: bold;">ls</span>
	fzfangsong.ufm fzfangsong.t1a fzfangsong.afm	
	<span style="color: #666666; font-style: italic;"># 我选的这个方正字体应该是TrueTypeUnicode字体，用TrueType转的不显字</span>
	<span style="color: #666666; font-style: italic;"># 文中有说明，在ttf ufm后面还可以跟参数，这里的false代表不将字体嵌入PDF文档，</span>
	<span style="color: #666666; font-style: italic;"># 那样会使pdf文件大小增大为自身+字体文件大小，很恐怖的</span>
	$ php5 <span style="color: #660033;">-q</span> utils<span style="color: #000000; font-weight: bold;">/</span>makefont.php fzfangsong.ttf fzfangsong.ufm <span style="color: #c20cb9; font-weight: bold;">false</span>
	<span style="color: #666666; font-style: italic;"># 生成可用的文件了</span>
	<span style="color: #007800;">$ls</span>
	fzfangsong.z fzfangsong.php</pre></div></div>


<p>现在弄个简单的例子，能够用tcpdf输出pdf文件了，里面要有这么一句：</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetFont</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fzfangsong'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>现在文件尺寸还是太大，因为字体依然是全嵌入的（如果是embedded subset更好，不过TCPDF现在还做不到）。按照那篇文章修改fzfangsong.php文件：</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #666666; font-style: italic;">//$type='TrueTypeUnicode';</span>
	<span style="color: #000088;">$type</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'cidfont0'</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">...</span>
	<span style="color: #666666; font-style: italic;">//$dw=600;</span>
	<span style="color: #000088;">$dw</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1000</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">...</span>
	<span style="color: #666666; font-style: italic;">//$enc='';</span>
	<span style="color: #000088;">$diff</span><span style="color: #339933;">=</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//$file='fzfangsong.z';</span>
	<span style="color: #666666; font-style: italic;">//$ctg='fzfangsong.ctg.z';</span>
	<span style="color: #000088;">$originalsize</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">3548232</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Chinese Simplified</span>
	<span style="color: #000088;">$enc</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'UniGB-UTF16-H'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$cidinfo</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Registry'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Adobe'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Ordering'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'GB1'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Supplement'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/uni2cid_ag15.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>现在生成的pdf文件尺寸倒是很小了，但用eivnce看文字全部是空白，这是在Linux下看，跑到windows下看正常，而且完美，gb和big5编码都能显示。又用其它一些字体试了试，都是windows正常但linux下看不了，应该是刚才作的步骤正确，但与平台配合起来还欠点什么。</p>

<p>仔细对比了上面生成的两种pdf文件，以及另外一个用openoffice.org生成的pdf文件（这个应该比较标准吧），发现还是openoffice.org生成的文件又小、效果又好，用的是“已嵌入子集/embedded subset”方式，</p>

<p>最终查到，我基本上已经作好了，问题出在evince身上，安装<code>poppler-data</code>包（evince用这个来处理中文）后，完美解决，字体为非嵌入not embedded方式。生成的pdf文件非常小，用windows和evince浏览也都正常。混合gb2312和big5编码的内容也没问题：evince下中文出西欧字符不出，windows下Adobe Reader只出gb2312的字，Foxit Reader全部中文和西欧字符完美。而在全内嵌字体的情况下，用evince查看big5字符都是小黑块。</p>

<h2>hack GLPI</h2>

<p>接下来是大工程，把ezpdf换成tcpdf。修改<code>inc/export.function.php</code>的<code>function displaySearchFooter</code>函数，把<code>case PDF_OUTPUT_LANDSCAPE</code>和<code>case PDF_OUTPUT_PORTRAIT</code>两部分的内容都换成TCPDF的处理，源数据还借用原来的<code>$PDF_HEADER</code>,<code>$PDF_ARRAY</code>。除了纸张参数不一样，两部分的处理是相同的，下面是一个简单的例子：</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #666666; font-style: italic;">// --------</span>
	<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tcpdf/tcpdf.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$PDF_HEADER</span><span style="color: #339933;">,</span><span style="color: #000088;">$PDF_ARRAY</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// create new PDF document</span>
	<span style="color: #000088;">$pdf</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TCPDF<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'L'</span><span style="color: #339933;">,</span> PDF_UNIT<span style="color: #339933;">,</span> PDF_PAGE_FORMAT<span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
	<span style="color: #666666; font-style: italic;">// set document information</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetCreator</span><span style="color: #009900;">&#40;</span>PDF_CREATOR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetAuthor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Fwolf'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetTitle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetSubject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'GLPI Export'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetKeywords</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'TCPDF, PDF, GLPI, export, fwolf, work, asset'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// set header and footer fonts</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setHeaderFont</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>PDF_FONT_NAME_MAIN<span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> PDF_FONT_SIZE_MAIN<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFooterFont</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>PDF_FONT_NAME_DATA<span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> PDF_FONT_SIZE_DATA<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// remove default header/footer</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setPrintHeader</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setPrintFooter</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
	<span style="color: #666666; font-style: italic;">// set default monospaced font</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetDefaultMonospacedFont</span><span style="color: #009900;">&#40;</span>PDF_FONT_MONOSPACED<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//set margins</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetMargins</span><span style="color: #009900;">&#40;</span>PDF_MARGIN_LEFT<span style="color: #339933;">,</span> PDF_MARGIN_TOP <span style="color: #339933;">-</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> PDF_MARGIN_RIGHT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetHeaderMargin</span><span style="color: #009900;">&#40;</span>PDF_MARGIN_HEADER<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetFooterMargin</span><span style="color: #009900;">&#40;</span>PDF_MARGIN_FOOTER<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//set auto page breaks</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetAutoPageBreak</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">,</span> PDF_MARGIN_BOTTOM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//set some language-dependent strings</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setLanguageArray</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$l</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
	<span style="color: #666666; font-style: italic;">// ---------------------------------------------------------</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// add a page</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">AddPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Column width, by conteng max length</span>
	<span style="color: #000088;">$w_max</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPageWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> PDF_MARGIN_LEFT <span style="color: #339933;">-</span> PDF_MARGIN_RIGHT<span style="color: #339933;">;</span>
	<span style="color: #000088;">$w</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$PDF_ARRAY</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$cell</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Chinese utf8 2 words length=6, should be 4 here</span>
			<span style="color: #000088;">$cell</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cell</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$l</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_strwidth</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cell</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// FZFangSong is not fixed font, so add some to en chars</span>
			<span style="color: #666666; font-style: italic;">// eg: 哈哈abc</span>
			<span style="color: #666666; font-style: italic;">// strlen = 6 + 3 = 9</span>
			<span style="color: #666666; font-style: italic;">// mbstrlen = 5</span>
			<span style="color: #666666; font-style: italic;">// mbstrwidth = 7</span>
			<span style="color: #000088;">$l</span> <span style="color: #339933;">+=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$l</span> <span style="color: #339933;">+</span> <span style="color: #990000;">mb_strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cell</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cell</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #339933;">*</span> <span style="color:#800080;">0.3</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$w</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$l</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$l</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$w</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$l</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">// Compare with max width, maybe below 0</span>
	<span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$w_max</span> <span style="color: #339933;">-</span> <span style="color: #990000;">array_sum</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Add back spaces left to each width</span>
	<span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">/</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$k</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$w</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$k</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$v</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$i</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
	<span style="color: #666666; font-style: italic;">// Table title</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetFont</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fzfangsong'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Write</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'设备一览表'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'C'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// set font</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetFont</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fzfangsong'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Table header</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetFillColor</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">208</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">220</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetTextColor</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$PDF_HEADER</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$head</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Cell</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span> <span style="color: #000088;">$head</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'C'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Ln</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Rows</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetFillColor</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">224</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">235</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetTextColor</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$fill</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$PDF_ARRAY</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$cell</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Cell</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cell</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'LR'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'L'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$fill</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Ln</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$fill</span><span style="color: #339933;">=!</span><span style="color: #000088;">$fill</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Cell</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array_sum</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'T'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
	<span style="color: #666666; font-style: italic;">// ---------------------------------------------------------</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Close and output PDF document</span>
	<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Output</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'glpi.pdf'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'I'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span></pre></div></div>


<p>总体上这个例子是照着<a href="http://www.tecnick.com/pagefiles/tcpdf/example_011.phps">官网Colored Tables例子</a>来的。</p>

<p>最后，把这个文件中所有的utf8_decode处理都去掉，完成。</p>

<h4>参考</h4>

<ul>
<li><a href="http://junist.googlepages.com/latex.html">LaTeX说明</a></li>
<li><a href="http://ez.no/ezpublish/documentation/incoming/truetype_font_in_pdf">Truetype font in PDF</a></li>
<li><a href="http://www.joomla.org.tw/phpbb3/viewtopic.php?f=39&amp;t=3040&amp;st=0&amp;sk=t&amp;sd=a&amp;start=30">1.5 PDF中文顯示（大家協助測試~）</a></li>
<li><a href="http://hi.baidu.com/yangzetao888/blog/item/ab10bbd412214106a18bb7cd.html">tcpdf的使用（中文）</a></li>
<li><a href="http://twpug.net/modules/newbb/viewtopic.php?post_id=9348">請問有關 tcpdf 的問題</a></li>
<li><a href="http://drupal.org/node/303499">Make &#8220;Enable/Disable Unicode Mode&#8221; optional?</a></li>
<li><a href="http://drupaltaiwan.org/module/print_friendly_pages">Print Friendly Pages</a></li>
<li><a href="http://joomlab15.exonsoft.com/zh-cn/articles/joomla!15x/50-generatelightweightchinesepdf?showall=1">产生轻薄短小的中文 PDF</a></li>
<li><a href="http://www.wazu.jp/gallery/Fonts_ChineseTraditional.html">U_fonts Traditional Chinese</a></li>
<li><a href="http://www.wazu.jp/gallery/Fonts_ChineseSimplified.html">U_fonts Simplified Chinese</a></li>
<li><a href="http://www.joomla.org.tw/phpbb3/viewtopic.php?f=39&amp;t=3040&amp;p=9785">1.5 PDF中文顯示（大家協助測試~）</a></li>
<li><a href="http://www.lakeice.com/?action=show&amp;id=6">FPDF中文应用攻略</a></li>
<li><a href="http://www.zhaipeng.cn/2008/01/29/php%E4%BD%BF%E7%94%A8fpdf%E5%88%9B%E5%BB%BApdf/">PHP使用FPDF创建PDF</a></li>
</ul>

<h4>Update @ 2009-11-06</h4>

<p>Print to pdf 的时候，Historical 中的 Comments 如何显示？默认的不好，可以考虑换成 diff 信息，如果又不愿用 pear 里的 <a href="http://pear.php.net/package/Text_Diff">xdiff</a>，可以考虑它的前身──用 php 直接实现的 <a href="http://software.zuavra.net/inline-diff/">PHP inline diff</a>。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/chinese" title="chinese" rel="tag">chinese</a>, <a href="http://www.fwolf.com/blog/post/tag/diff" title="diff" rel="tag">diff</a>, <a href="http://www.fwolf.com/blog/post/tag/export" title="export" rel="tag">export</a>, <a href="http://www.fwolf.com/blog/post/tag/ezpdf" title="ezpdf" rel="tag">ezpdf</a>, <a href="http://www.fwolf.com/blog/post/tag/font" title="font" rel="tag">font</a>, <a href="http://www.fwolf.com/blog/post/tag/glpi" title="GLPI" rel="tag">GLPI</a>, <a href="http://www.fwolf.com/blog/post/tag/pdf" title="pdf" rel="tag">pdf</a>, <a href="http://www.fwolf.com/blog/post/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.fwolf.com/blog/post/tag/tcpdf" title="TCPDF" rel="tag">TCPDF</a>, <a href="http://www.fwolf.com/blog/post/tag/utf8" title="utf8" rel="tag">utf8</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/133" title="截取固定长度的中文字符串 (2006-02-06)">截取固定长度的中文字符串</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/400" title="选择Eclipse PHP Development Tools(PDT)作为PHP开发工具 (2008-05-03)">选择Eclipse PHP Development Tools(PDT)作为PHP开发工具</a> (8)</li>
	<li><a href="http://www.fwolf.com/blog/post/176" title="让phpmailer支持中文名称的附件 (2006-05-23)">让phpmailer支持中文名称的附件</a> (5)</li>
	<li><a href="http://www.fwolf.com/blog/post/170" title="[Ubuntu]明明白白安装中文字体 (2006-05-17)">[Ubuntu]明明白白安装中文字体</a> (20)</li>
	<li><a href="http://www.fwolf.com/blog/post/315" title="Ubuntu FeistyFawn中文字体配置的变化 (2007-04-22)">Ubuntu FeistyFawn中文字体配置的变化</a> (3)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/434/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
