最近需要用 PHP 创建包含中文的 PDF,网上搜了不少资料,都提到需要自己创建字体等步骤。但经过我试验,其实利用 TCPDF 及其自带的字体定义文件,创建包含中文的 PDF 可以说易如反掌。

首先下载最新版本的 TCPDF,下载地址:https://github.com/tecnickcom/TCPDF/releases

然后创建一个新的 create-pdf.php 文件,输入以下代码:

<?php
// filename: create-pdf.php
// 设置 PHP 脚本的执行时的内存限制为 256M,因为中文字体的定义需要消耗大量内存
ini_set('memory_limit', '256M');
// 设置默认时区
date_default_timezone_set('Asia/Shanghai');
// 载入 TCPDF 库
require ('tcpdf.php');
// 创建一个新 PDF 文档
$pdf = new TCPDF('Portrait', 'mm', 'A4', true, 'UTF-8');
// 添加页面
$pdf->AddPage();
// 设置字体为 TCPDF 内置的 cid0cs,也就是 CID-0 Chinese Simplified
$pdf->SetFont('cid0cs', '', 14);
// 定义要输出的内容
$html = <<<TEXT
<h1>Welcome to <a href="http://www.tcpdf.org" style="text-decoration:none;background-color:#CC0000;color:black;">&nbsp;<span style="color:black;">TC</span><span style="color:white;">PDF</span>&nbsp;</a>!</h1>
<p>就像西文 typography 中已经相对成熟的 kerning,中文也需要同样的东西。很自然地,中文字符与西文字符交替出现的时候,也需要合适的 kerning。然而问题是目前的计算机字体,在这方面的设计很差。在网页的文本中,利用手工添加空格的方式,一定程度上,可以起到调整中英文字偶之间的空隙,然而这终究是个临时的「折衷」办法。类似的「空格折衷」,在机械打字机普及的时代,有更多例子。</p>
<backquote>
以上内容来自:<a href="https://www.zhihu.com/question/19587406">https://www.zhihu.com/question/19587406</a>
</backquote>
<p>This text is printed using the <i>writeHTMLCell()</i> method but you can also use: <i>Multicell(), writeHTML(), Write(), Cell() and Text()</i>.</p>
<p>Please check the source code documentation and other examples for further information.</p>
<p style="color:#CC0000;">TO IMPROVE AND EXPAND TCPDF I NEED YOUR SUPPORT, PLEASE <a href="http://sourceforge.net/donate/index.php?group_id=128076">MAKE A DONATION!</a></p>
TEXT;
// 以 HTML 方式输出内容
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
// 将输出结果为与 .php 文件同目录的 example_001.pdf
$pdf->Output(__DIR__ . '/example_001.pdf', 'F');

在命令行中执行:

$ php create-pdf.php

上面的代码就可以输出漂亮的中英文混排 PDF 了。

example_001.png

当然,这个方法也有缺点:

  • 在没有中文字体的系统里无法显示中文
  • 中文字体会使用系统的默认中文字体,所以在不同系统里看上去会有一点差异
  • 只有一种中文字体

但是,这个方法最大的好处不就是“简单”吗!

-EOF-