用 TCPDF 显示非英文字符
Display non-english characters with TCPDF
我正在使用 TCPDF 库导出音乐网站的专辑/目录发布信息,专辑包含可能是英文、中文或任何其他语言的歌曲标签,我在打印非-tcpdf 中的英文字符正确。有几点我想说一下。
- 我正在使用
Zend framework 1.12
.
- 数据库连接排序规则
utf8
.
- Table 字段整理
utf8_unicode_ci
.
我的方案是信息来自数据库,我使用视图以特定格式显示与相册相关的信息以及 HTML
。发布名称是中文 奥马尔阿斯拉姆
,我在 Whosebug 上搜索了所有与设置字体和更改字符排序规则相关的选项,同时初始化 TCPDF 对象,但是每当我打印它时显示的名称都是这样 奥马尔阿斯æ‹Â
我尝试 utf8_encode()
和 utf8_decode()
围绕 HTML 中的发布名称,但没有任何帮助。
另一个例子是拉丁字符,专辑名称是 Extraña EP
,当在 pdf 中打印时,它显示为 Extraña EP
。
这是我在视图中使用的 HTML。
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td align="left" valign="top">
<img src="/images/release_details.png">
</td>
</tr>
<tr>
<td align="left" valign="top">
<table width="100%" cellpadding="0" cellspacing="0" class="release_table">
<tr>
<td align="left" valign="top" class="label">CATALOG #:</td>
<td align="right" valign="top" class="data"><?=$this->release->Catalog?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">RELEASE NAME:</td>
<td align="right" valign="top" class="data"><?=$this->release->Name?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">RELEASE TYPE:</td>
<td align="right" valign="top" class="data"><?=$releaseType?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">UPC CODE:</td>
<td align="right" valign="top" class="data"><?=$this->release->UPCCode?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">NUMBER OF SONGS:</td>
<td align="right" valign="top" class="data"><?=$this->release->TracksQty?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">PRIMARY ARTIST:</td>
<td align="right" valign="top"
class="data"><?=$this->release->PrimaryArtist?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">LABEL:</td>
<td align="right" valign="top" class="data"><?=$this->release->LabelName?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">MAIN GENRE:</td>
<td align="right" valign="top" class="data"><?=$this->release->MainGenre?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">GENRE:</td>
<td align="right" valign="top" class="data"><?=$this->release->Genre?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">(C):</td>
<td align="right" valign="top"
class="data"><?=$this->release->CLine . " " . $this->release->CYear?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">(P):</td>
<td align="right" valign="top"
class="data"><?=$this->release->PLine . " " . $this->release->PYear?></td>
</tr>
<?php if ($this->release->Howlong > 0 && $this->release->EffectiveDate > 0) {?>
<tr>
<td align="left" valign="top" class="label">EXCLUSIVE DATE:</td>
<td align="right" valign="top"
class="data"><?=$this->release->EffectiveDate?></td>
</tr>
<?php }?>
<tr>
<td align="left" valign="top" class="label">RELEASE DATE:</td>
<td align="right" valign="top" class="data"><?=$this->release->ReleaseDate?></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center" valign="middle"> </td>
</tr>
<tr>
<td align="center" valign="middle">
<img src="/images/symphonic_logo.png"/>
</td>
</tr>
</table>
这里是我在发送要打印的 pdf 内容之前调用此视图的代码。
require_once APPLICATION_PATH . 'library/tcpdf/tcpdf.php';
$pdf = new TCPDF("L", "mm", "A4", false, 'ISO-8859-1', false);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetFont('helvetica', '', 11, '', true);
$pdf->SetMargins(1, -1, -1, false);
//$pdf->SetFont('dejavusans', '', 12);
//whole TCPDF's settings goes here
$this->view->songs = $releaseSongs;
$this->view->release = $releasInformation;
$htmlcontent = $this->view->render('exportpdf.phtml');
// output the HTML content
$pdf->AddPage();
$pdf->writeHTML($htmlcontent, true, false, true, false, '');
$pdf->lastPage();
$pdf->deletePage($pages + 1);
$pdf->Output($filename, 'D');
exit();
以下是我为更正代码所做的几件事。
使用自定义字体选项添加了 Ms arial unicode true type 字体。
我添加了带有 css 类 的样式标签,我在视图中设置了字体系列,这在非英文字符的情况下导致了垃圾字符.这是主要的错误。
这是他的最终工作代码
require_once(APPLICATION_PATH . 'library/tcpdf/tcpdf.php');
$pdf = new TCPDF("L", "mm", "A4", TRUE, 'utf-8', false);
$fontname = TCPDF_FONTS::addTTFfont(APPLICATION_PATH.'/../library/tcpdf/fonts/ARIALUNI.TTF','TrueTypeUnicode', '', 32);
$pdf->AddFont($fontname);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->setFontSubsetting(true);
$pdf->SetFont($fontname, '', 12, '', true);
$pdf->SetMargins(1, -1, -1, false);
//$pdf->SetFont('dejavusans', '', 12);
//whole TCPDF's settings goes here
$htmlcontent = $this->view->render('exportpdf.phtml');
// output the HTML content
$pdf->AddPage();
$pdf->writeHTML($htmlcontent, true, false, true, false, '');
$pdf->lastPage();
$pdf->deletePage($pages + 1);
$pdf->Output($filename, 'D');
如果您想使用 UTF-8,排序规则没有帮助,它只能确定排序顺序。您可能需要的是设置数据库连接的字符集,您应该在执行任何操作之前设置 query/inserts:
// tells the mysqli connection to deliver UTF-8 encoded strings.
$db = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
$db->set_charset('utf8');
// tells the pdo connection to deliver UTF-8 encoded strings.
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
$db = new PDO($dsn, $dbUser, $dbPassword);
使用此连接读取和写入数据,您应该能够将 PDF 的编码设置为 UTF-8。
我正在使用 TCPDF 库导出音乐网站的专辑/目录发布信息,专辑包含可能是英文、中文或任何其他语言的歌曲标签,我在打印非-tcpdf 中的英文字符正确。有几点我想说一下。
- 我正在使用
Zend framework 1.12
. - 数据库连接排序规则
utf8
. - Table 字段整理
utf8_unicode_ci
.
我的方案是信息来自数据库,我使用视图以特定格式显示与相册相关的信息以及 HTML
。发布名称是中文 奥马尔阿斯拉姆
,我在 Whosebug 上搜索了所有与设置字体和更改字符排序规则相关的选项,同时初始化 TCPDF 对象,但是每当我打印它时显示的名称都是这样 奥马尔阿斯æ‹Â
我尝试 utf8_encode()
和 utf8_decode()
围绕 HTML 中的发布名称,但没有任何帮助。
另一个例子是拉丁字符,专辑名称是 Extraña EP
,当在 pdf 中打印时,它显示为 Extraña EP
。
这是我在视图中使用的 HTML。
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td align="left" valign="top">
<img src="/images/release_details.png">
</td>
</tr>
<tr>
<td align="left" valign="top">
<table width="100%" cellpadding="0" cellspacing="0" class="release_table">
<tr>
<td align="left" valign="top" class="label">CATALOG #:</td>
<td align="right" valign="top" class="data"><?=$this->release->Catalog?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">RELEASE NAME:</td>
<td align="right" valign="top" class="data"><?=$this->release->Name?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">RELEASE TYPE:</td>
<td align="right" valign="top" class="data"><?=$releaseType?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">UPC CODE:</td>
<td align="right" valign="top" class="data"><?=$this->release->UPCCode?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">NUMBER OF SONGS:</td>
<td align="right" valign="top" class="data"><?=$this->release->TracksQty?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">PRIMARY ARTIST:</td>
<td align="right" valign="top"
class="data"><?=$this->release->PrimaryArtist?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">LABEL:</td>
<td align="right" valign="top" class="data"><?=$this->release->LabelName?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">MAIN GENRE:</td>
<td align="right" valign="top" class="data"><?=$this->release->MainGenre?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">GENRE:</td>
<td align="right" valign="top" class="data"><?=$this->release->Genre?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">(C):</td>
<td align="right" valign="top"
class="data"><?=$this->release->CLine . " " . $this->release->CYear?></td>
</tr>
<tr>
<td align="left" valign="top" class="label">(P):</td>
<td align="right" valign="top"
class="data"><?=$this->release->PLine . " " . $this->release->PYear?></td>
</tr>
<?php if ($this->release->Howlong > 0 && $this->release->EffectiveDate > 0) {?>
<tr>
<td align="left" valign="top" class="label">EXCLUSIVE DATE:</td>
<td align="right" valign="top"
class="data"><?=$this->release->EffectiveDate?></td>
</tr>
<?php }?>
<tr>
<td align="left" valign="top" class="label">RELEASE DATE:</td>
<td align="right" valign="top" class="data"><?=$this->release->ReleaseDate?></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center" valign="middle"> </td>
</tr>
<tr>
<td align="center" valign="middle">
<img src="/images/symphonic_logo.png"/>
</td>
</tr>
</table>
这里是我在发送要打印的 pdf 内容之前调用此视图的代码。
require_once APPLICATION_PATH . 'library/tcpdf/tcpdf.php';
$pdf = new TCPDF("L", "mm", "A4", false, 'ISO-8859-1', false);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetFont('helvetica', '', 11, '', true);
$pdf->SetMargins(1, -1, -1, false);
//$pdf->SetFont('dejavusans', '', 12);
//whole TCPDF's settings goes here
$this->view->songs = $releaseSongs;
$this->view->release = $releasInformation;
$htmlcontent = $this->view->render('exportpdf.phtml');
// output the HTML content
$pdf->AddPage();
$pdf->writeHTML($htmlcontent, true, false, true, false, '');
$pdf->lastPage();
$pdf->deletePage($pages + 1);
$pdf->Output($filename, 'D');
exit();
以下是我为更正代码所做的几件事。
使用自定义字体选项添加了 Ms arial unicode true type 字体。
我添加了带有 css 类 的样式标签,我在视图中设置了字体系列,这在非英文字符的情况下导致了垃圾字符.这是主要的错误。
这是他的最终工作代码
require_once(APPLICATION_PATH . 'library/tcpdf/tcpdf.php');
$pdf = new TCPDF("L", "mm", "A4", TRUE, 'utf-8', false);
$fontname = TCPDF_FONTS::addTTFfont(APPLICATION_PATH.'/../library/tcpdf/fonts/ARIALUNI.TTF','TrueTypeUnicode', '', 32);
$pdf->AddFont($fontname);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->setFontSubsetting(true);
$pdf->SetFont($fontname, '', 12, '', true);
$pdf->SetMargins(1, -1, -1, false);
//$pdf->SetFont('dejavusans', '', 12);
//whole TCPDF's settings goes here
$htmlcontent = $this->view->render('exportpdf.phtml');
// output the HTML content
$pdf->AddPage();
$pdf->writeHTML($htmlcontent, true, false, true, false, '');
$pdf->lastPage();
$pdf->deletePage($pages + 1);
$pdf->Output($filename, 'D');
如果您想使用 UTF-8,排序规则没有帮助,它只能确定排序顺序。您可能需要的是设置数据库连接的字符集,您应该在执行任何操作之前设置 query/inserts:
// tells the mysqli connection to deliver UTF-8 encoded strings.
$db = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
$db->set_charset('utf8');
// tells the pdo connection to deliver UTF-8 encoded strings.
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
$db = new PDO($dsn, $dbUser, $dbPassword);
使用此连接读取和写入数据,您应该能够将 PDF 的编码设置为 UTF-8。