代码之家  ›  专栏  ›  技术社区  ›  senty

在FDPI中使用汉字

  •  0
  • senty  · 技术社区  · 4 年前

    我有一个pdf模板,我在上面写英文信,效果很好。

    $fontPath = public_path('fonts/');
    define('FPDF_FONTPATH', $fontPath);
    
    $pdf = new Fpdi();
    $template = public_path('template.pdf');
    $pdf->setSourceFile($template);
    
    $pdf->AddFont('NotoSans-Regular');
    $pdf->SetFont('NotoSans-Regular', '', 9);
    
    $pdf->Write(2, "This is working");
    

    现在我也在尝试写中文信,但我一直面临着问题。

    • 如果我尝试 $pdf->Write(2, "This is working"); 它告诉我:

    enter image description here

    • 如果我尝试 $pdf->Write(2, iconv('UTF-8', 'UCS-4BE', '我的名字是约翰')); 它告诉我:

    enter image description here

    我做错了什么?如何使用FDPI唤醒中文文本?

    我见过一些人用FDPF做这件事,但我不知道如何用FDPI做。

    0 回复  |  直到 4 年前
        1
  •  1
  •   senty    4 年前

    老办法:

    我找到了 solution buried in a github repo 从DCgithub21,您可以像下面这样扩展和修改它。

    正确扩展类后,可以在Fpdi中使用汉字

    $pdf = new ChineseFpdi();
    $template = public_path('template.pdf');
    $pdf->setSourceFile($template);
    
    $pdf->AddGBFont('arial');
    $pdf->SetFont('arial', '', 9);
    
    $pdf->Write(2, iconv("utf-8", "gbk", "会写中文"));
    $pdf->Write(2, iconv("utf-8", "gbk", "Can write Latin"));
    

    在正式回购中:

    class Fpdi extends FpdfTpl {}
    class FpdfTpl extends \FPDF {}
    

    您需要做的是创建一个名为PdfChinese的桥接类,这样您的outlook将:

    class Fpdi extends FpdfTpl {}
    class FpdfTpl extends PDFChinese {}
    class PdfChinese extends FPDF {}
    

    正确的方法:

    显然,tFPDF是一种更好的方法。参考: https://www.setasign.com/products/fpdi/demos/tfpdf-demo/

    define("_SYSTEM_TTFONTS", public_path('fonts/'));
    
    $pdf = new \setasign\Fpdi\Tfpdf\Fpdi();
    $template = public_path('template.pdf');
    $pdf->setSourceFile($template);
    
    $pdf->AddFont('Code200365k','','Code200365k.ttf', true);
    $pdf->SetFont('Code200365k','',42);
    
    $pdf->Write(2, "会写中文");
    
    推荐文章