php - 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");
- I downloaded Noto Sans CJK SC because it supports Chinese
- I went to http://www.fpdf.org/makefont/ to convert the NotoSans-Regular (with encoding
cp1252
).
Now I am trying to write Chinese letters too, but I have been facing problems.
- If I try
$pdf->Write(2, "This is working");
it shows me:
- If I try
$pdf->Write(2, iconv('UTF-8', 'UCS-4BE', '?��??�????��?????�??�'));
it shows me:
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.
Answer
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, "????��??�?��");
Source