有人知道如何在FPDF软件包中设置编码为UTF-8吗?或者至少设置为支持希腊字符的ISO-8859-7(希腊语)?
基本上我想创建一个包含希腊字符的PDF文件。
任何建议都会有所帮助。 George
有人知道如何在FPDF软件包中设置编码为UTF-8吗?或者至少设置为支持希腊字符的ISO-8859-7(希腊语)?
基本上我想创建一个包含希腊字符的PDF文件。
任何建议都会有所帮助。 George
utf8_decode()
进行转换为ISO-8859-1编码:
$str = utf8_decode($str);
但一些字符例如欧元符号无法正确转换。如果iconv扩展可用,则应该采用以下方法:
$str = iconv('UTF-8', 'windows-1252', $str);
还有一种官方的UTF-8版本FPDF叫做tFPDF http://www.fpdf.org/en/script/script92.php
您可以轻松地从原始FPDF切换,只需确保您也使用一个Unicode字体,如上面链接中的示例或我的代码所示:
<?php
//this is a UTF-8 file, we won't need any encode/decode/iconv workarounds
//define the path to the .ttf files you want to use
define('FPDF_FONTPATH',"../fonts/");
require('tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
// Add Unicode fonts (.ttf files)
$fontName = 'Helvetica';
$pdf->AddFont($fontName,'','HelveticaNeue LightCond.ttf',true);
$pdf->AddFont($fontName,'B','HelveticaNeue MediumCond.ttf',true);
//now use the Unicode font in bold
$pdf->SetFont($fontName,'B',12);
//anything else is identical to the old FPDF, just use Write(),Cell(),MultiCell()...
//without any encoding trouble
$pdf->Cell(100,20, "Some UTF-8 String");
//...
?>
if($txt!=='')
{
这是我版本的fpdf中的第648行。 插入以下代码:
$txt = iconv('utf-8', 'cp1252', $txt);
if($align=='R')
你需要先生成一个字体。你必须使用FPDF包中包含的MakeFont
实用程序。我在Linux上使用了一份稍微扩展过的演示脚本:
<?php
// Generation of font definition file for tutorial 7
require('../makefont/makefont.php');
$dir = opendir('/usr/share/fonts/truetype/ttf-dejavu/');
while (($relativeName = readdir($dir)) !== false) {
if ($relativeName == '..' || $relativeName == '.')
continue;
MakeFont("/usr/share/fonts/truetype/ttf-dejavu/$relativeName",'ISO-8859-2');
}
?>
然后我将生成的文件复制到我的网站的font
目录中,使用了这个:
$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Buňka jedna'),1);
(我正在处理一个表格。)这对我的语言有效(Buňka jedna是捷克语中的Cell one)。捷克语属于中欧语言,也是ISO-8859-2编码。遗憾的是,FPDF用户被迫失去了UTF-8编码的优势,您无法在PDF中获得以下内容:
Městečko Fruens Bøge
在 ISO-8859-2 中,丹麦字母 ø
变成了 ř
。
解决建议:你需要获取一种希腊字体,使用正确的编码 (ISO-8859-7) 生成该字体,并使用与字体相同的目标编码来使用 iconv
。
(下面是使用代码的快照)
我想提供:问题的概述,解决方案,带有工作代码的Github项目以及具有预期结果的在线示例PDF。
问题:
您实际上需要一种支持您正在使用的UTF-8字符的字体。
例如,仅使用Helvetica并尝试显示日语将不起作用。如果您使用Font Forge或其他字体工具,可以滚动到字体的中文字符并查看它们为空白。
谷歌有一个字体(Noto font),其中包含所有语言,大小通常是文本大小的几倍。因此,您可以看到为什么许多字体简单地无法涵盖每种语言。
解决方案:
我正在使用开源的rounded-mgenplus-20140828.ttf和ZCOOL_QingKe_HuangYou.ttf字体包来处理日文和中文,这些字体包在许多开源项目中都可以找到。 在tFPDF本身中,或者像class HTMLtoPDF extends tFPDF {...}
这样的新继承类中,您需要进行以下操作...$this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
$this->SetFont('japanese', '', 14);
$this->Write(14, '日本語');
GitHub 上的代码包:
https://github.com/HoldOffHunger/php-html-to-pdf
工作中,日语在线演示:
只需编辑fpdf.php文件中的函数单元格,查找看起来像这样的行
function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{
{
后面添加内容。$txt = utf8_decode($txt);
保存文件后,准备就绪,重音符号和UTF8编码将正常工作 :)
这个答案对我无效,我还需要对字符串进行HTML解码。请参考
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
感谢来自StackOverflow的emfi提供帮助,解决了在使用tFPDF扩展中的html_entity_decode问题。
.ttf
字体。确保选择正确的编码数字以适合您的语言。下载文件并将它们粘贴到当前的FPDF字体目录中。$pdf->AddFont($font_name,'','Your_Font_Here.php');
然后您可以正常地使用$pdf->SetFont
。iconv('UTF-8', 'windows-1255', $first_name)
。strrev(iconv('UTF-8', 'windows-1255', $first_name))
。您可以创建一个继承FPDF的类,并添加以下内容:
class utfFPDF extends FPDF {
function Cell($w, $h=0, $txt="", $border=0, $ln=0, $align='', $fill=false, $link='')
{
if (!empty($txt)){
if (mb_detect_encoding($txt, 'UTF-8', false)){
$txt = iconv('UTF-8', 'ISO-8859-5', $txt);
}
}
parent::Cell($w, $h, $txt, $border, $ln, $align, $fill, $link);
}
}