有人知道如何将 FPDF 包中的编码设置为 UTF-8 吗?或者至少支持希腊字符的 ISO-8859-7(希腊)?
基本上我想创建一个包含希腊字符的 PDF 文件。
任何建议都会有所帮助。乔治
不要使用 UTF-8 编码。标准 FPDF 字体使用 ISO-8859-1 或 Windows-1252。可以使用 utf8_decode()
执行到 ISO-8859-1 的转换:$str = utf8_decode($str);
但是某些字符(例如 Euro)将无法正确翻译。如果 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");
//...
?>
我认为使用它而不是到处发送垃圾邮件 utf8_decode() 更优雅,并且直接在 AddFont() 中使用 .ttf 文件的能力也是一个优势。
此处的任何其他答案都只是避免或解决该问题的一种方法,并且避免 UTF-8 对于最新项目来说并不是真正的选择。
还有其他替代品,例如 mPDF 或 TCPPDF(以及其他),它们基于 FPDF,但提供高级功能,支持 UTF-8 并且可以解释 HTML 代码(当然,由于没有直接将 HTML 转换为 PDF 的方法,因此受到限制)。大多数 FPDF 代码可以直接在这些库中使用,因此迁移代码非常容易。
https://github.com/mpdf/mpdf http://www.tcpdf.org/
这个问题有一个非常简单的解决方案。
在文件 fpdf.php 中,转到显示以下内容的行:
if($txt!=='')
{
这是我的 fpdf 版本中的第 648 行。插入以下代码行:
$txt = iconv('utf-8', 'cp1252', $txt);
(代码行上方)
if($align=='R')
这适用于所有德语特殊字符,也适用于希腊特殊字符。否则,只需将 cp1252 替换为您需要的相应字母。您可以在此处查看所有支持的字符:http://en.wikipedia.org/wiki/Windows-1252
我在这里看到了解决方案:http://fudforum.org/forum/index.php?t=msg&goto=167345 请使用我上面的示例代码,因为原作者忘记在 utf 和 8 之间插入破折号。
希望以上内容对您有所帮助。
大安
您需要先生成字体。您必须使用 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
和。
如何在 FPDF 中创建支持中文、日文、俄文等的 PDF?
https://raw.githubusercontent.com/HoldOffHunger/php-html-to-pdf/master/images/php-html-to-pdf-converter.jpg
(下面使用的代码快照)
我想提供:问题摘要、解决方案、带有工作代码的 github 项目,以及带有预期结果 PDF 的在线示例。
问题 :
正如 Tarsis 所说,将 FPDF 交换为 TFPDF。您实际上需要一种支持您正在使用的 UTF-8 字符的字体。 IE,仅仅使用 Helvetica 并试图显示日语是行不通的。如果您使用 Font Forge 或其他字体工具,您可以滚动到字体的中文字符,然后查看它们是否为空白。谷歌有一种包含所有语言的字体(Noto 字体),它是 20mb,通常是文本大小的几个因素。因此,您可以看到为什么许多字体根本无法涵盖每一种语言。
解决方案 :
我使用的是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
工作,日语在线演示:
https://www.earthfluent.com/privacy.pdf?language=ja
这个答案对我不起作用,我还需要在字符串上运行 html decode 。看
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
道具从 html_entity_decode in FPDF(using tFPDF extention) 转到 emfi
只需编辑 fpdf.php 文件中的函数单元格,查找如下所示的行
function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{
找到线后
写在 {
之后,
$txt = utf8_decode($txt);
保存文件并准备好,重音和 utf8 编码将起作用:)
您可以创建一个类来扩展 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);
}
}
我想为任何出于任何原因(框架集成等)没有切换到 TFPDF 的人回答这个问题。
转到:http://www.fpdf.org/makefont/index.php
为您要使用的语言使用与 .ttf
兼容的字体。确保选择适合您的语言的编码编号。下载文件并将它们粘贴到您当前的 FPDF 字体目录中。
使用它来激活新字体:$pdf->AddFont($font_name,'','Your_Font_Here.php');
然后就可以正常使用$pdf->SetFont
了。
在字体本身上,使用 iconv 转换为 UTF-8。因此,例如,如果您使用的是希伯来语,您可以使用 iconv('UTF-8', 'windows-1255', $first_name)
。
将 windows 编码号替换为您的语言编码。
对于从右到左,快速解决方法是执行 strrev(iconv('UTF-8', 'windows-1255', $first_name))
之类的操作。
以上解决方案都不起作用。
尝试这个:
function filter_html($value){
$value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
return $value;
}
您可以将此功能应用于您的文本:
$yourtext = iconv('UTF-8', 'windows-1252', $yourtext);
谢谢
不确定它是否适用于希腊语,但我对巴西葡萄牙语字符也有同样的问题,我的解决方案是使用 html 实体。我基本上有两种情况:
字符串可能包含 UTF-8 字符。
对于这些,我首先使用 htmlentities()
将其编码为 html 实体,然后将它们解码为 iso-8859-1
。例子:
$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
修复了带有 html 实体的字符串:
对于这些,我只留下 htmlentities()
呼叫。例子:
$s = html_entity_decode("Treasurer/Trésorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
然后我将 $s
传递给 FPDF,如下例所示:
$pdf->Cell(100, 20, $s, 0, 0, 'L');
注意:ENT_COMPAT | ENT_HTML401
是参数 #2 的标准值,如 http://php.net/manual/en/function.html-entity-decode.php
希望有帮助。
为子孙。
我如何设法在我的 Linux 机器上将俄语添加到 fpdf:
1) 转到 http://www.fpdf.org/makefont/ 并将您的 ttf 字体(例如 AerialRegular.ttf)转换为 2 个文件使用 ISO-8859-5 编码:AerialRegular.php 和 AerialRegular.z
2)把这2个文件放到fpdf/font目录下
3)在您的代码中使用它:
$pdf = new \FPDI();
$pdf->AddFont('ArialMT','','ArialRegular.php');
$pdf->AddPage();
$tplIdx = $pdf->importPage(1);
$pdf->useTemplate($tplIdx, 0, 0, 211, 297); //width and height in mms
$pdf->SetFont('ArialMT','',35);
$pdf->SetTextColor(255,0,0);
$fullName = iconv('UTF-8', 'ISO-8859-5', 'Алексей');
$pdf->SetXY(60, 54);
$pdf->Write(0, $fullName);
而不是这个 iconv 解决方案:
$str = iconv('UTF-8', 'windows-1252', $str);
您可以使用以下内容:
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
请参阅:How to convert Windows-1252 characters to values in php?
FPDF 有一个扩展名为 UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/
但是,恕我直言,如果您可以更改课程,最好使用 mpdf。
我用FPDF for ASP,iconv功能不可用。看起来很奇怪,我通过在 AddPage() 函数之后向 pdf 添加假图像(1x1px jpeg)来解决 UTF-8 问题:
pdf.Image "images/fpdf.jpg",0,0,1
通过这种方式,重音字符被正确地添加到我的 pdf 中,不要问我为什么,但它可以工作。
我知道这个问题很老,但我认为我的回答会帮助那些在其他答案中没有找到解决方案的人。所以,我的问题是我无法在我的 PDF 中显示克罗地亚语字符。首先,我使用了 FPDF,但我认为它不支持 Unicode。最后,解决我的问题的是 tFPDF,它是支持 Unicode 的 FPDF 版本。这是对我有用的示例:
require('tFPDF/tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
$pdf->AddFont('DejaVu', 'B', 'DejaVuSansCondensed-Bold.ttf', true);
$pdf->SetFont('DejaVu','',14);
$txt = 'čćžšđČĆŽŠĐ';
$pdf->Write(8,$txt);
$pdf->Output();
就像这里很多人说的:
$yourtext = iconv('UTF-8', 'windows-1252', $yourtext);
但是!在 windows-1252 或在我的情况下为 CP1252 之后有一个 '//Ignore'
,如下所示:
iconv("UTF-8", "CP1252//IGNORE", $row['project_name'])
这个对我有用,我希望它对你有用!
不定期副业成功案例分享