phppdfunicodefpdffpdi

Using chinese characters in FDPI


I have a pdf template that I write English letters on it and it works fine.

$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");

Now I am trying to write Chinese letters too, but I have been facing problems.

enter image description here

enter image description here

What am I doing wrong? How can I wake the Chinese text work with FDPI?

I have seen some people doing it with FDPF but I couldn't figure out how to do it in FDPI.


Solution

  • The Old Way:

    I found the solution buried in a github repo from DCgithub21 which you can extend and modify like below.

    After extending the the classes properly, you can use Chinese characters inside 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"));
    

    In official repo:

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

    What you need to do is create a bridge class called PdfChinese, so your outlook will be:

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

    The Right Way:

    Apparently tFPDF was a better way to do it. Reference: 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, "会写中文");