Использование китайских иероглифов в FDPI

#php #pdf #unicode #fpdf #fpdi

Вопрос:

У меня есть шаблон 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");
 
  • Я скачал Noto без CJK SC, потому что он поддерживает китайский
  • Я отправился в http://www.fpdf.org/makefont/ для преобразования NotoSans-Обычный (с кодировкой cp1252 ).

Сейчас я тоже пытаюсь писать китайскими буквами, но у меня возникли проблемы.

  • Если я попытаюсь $pdf->Write(2, "This is working"); , это покажет мне:

введите описание изображения здесь

  • Если я попытаюсь $pdf->Write(2, iconv('UTF-8', 'UCS-4BE', '我的名字是约翰')); , это покажет мне:

введите описание изображения здесь

Что я делаю не так? Как я могу заставить китайский текст работать с FDPI?

Я видел, как некоторые люди делали это с помощью FDPF, но я не мог понять, как это сделать в FDPI.

Ответ №1:

По-Старому:

Я нашел решение, скрытое в репозитории GitHub от 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 setasignFpdiTfpdfFpdi();
$template = public_path('template.pdf');
$pdf->setSourceFile($template);

$pdf->AddFont('Code200365k','','Code200365k.ttf', true);
$pdf->SetFont('Code200365k','',42);

$pdf->Write(2, "会写中文");