关于tcpdf生成PDF文档 无法正常编码emoji表情求助

AI摘要
【问题提问】用户分享在PHP中使用TCPDF等库将包含Emoji表情的HTML转换为PDF时遇到的技术难题,尝试合并字体、转换编码等方法后仍无法正常显示大部分Emoji(仅“❌”可显示),并附带了相关代码。用户已测试多个PHP库均未成功,目前使用Node.js方案但需满足PHP环境要求,因此寻求解决方案。

这几天遇到一个棘手的问题,简单分析下如下:
1.需要生成pdf的测试html文本:

可以显示❌😉眨眼表😊面带微笑的眼睛 😋品尝美味食物表情 😎太阳镜笑脸 😍面带心形眼睛 😘飞吻表情 😗亲吻表情 😙含笑亲吻表情 😚闭眼亲吻表情 😇光环笑脸 😐中性面 😑面无表情 😶没有嘴的脸 😏

2.能考虑到的是tcpdf生成的时候是根据字体来生成的,可能自带的字体是没有办法支持emoji表情,所以我找了Apple Color Emoji、Segoe UI这俩都支持emjio比较全,因为这个库好像不能支持指定多个字体自动识别,我就使用字体编辑工具把三套字体都合并成一个ttf,使用tcpdf的字体转换tool工具转换字体,但是发现可能字体有些部分确实有但是可能编码不一致无法识别到对应的表情字体,但是发现❌这个符号是可以识别出来的。

附带php代码:

// 自动加载Composer的类
require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'utf-8', false);

    // 设置文档信息
    $title = extractTitleFromHtml($htmlContent);
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor("System");
    $pdf->SetTitle($title);
    $pdf->SetSubject("{$title} - PDF导出");

    // 禁用页眉页脚
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);


    // 1. 添加并注册字体(假设你已添加)
    $mainFont = 'yaheiemjio'; // TCPDF内置中文字体,或你添加的字体名
    // $emojiFont = 'yaheiemjio';       // 添加的Emoji字体
    $lg['a_meta_charset'] = 'UTF-8';
    $pdf->setLanguageArray($lg);
    // 添加中文支持
    // $pdf->SetFont($mainFont, '', $fontSize, '', true);
    $pdf->SetFont($mainFont, '', $fontSize);
    $pdf->setFontSubsetting(true);

    // 添加页面
    $pdf->AddPage();

    // 处理HTML中的相对路径
    $baseUrl = 'http://' . ($_SERVER['HTTP_HOST'] ?? 'localhost') . '/';
    $processedHtml = processHtmlForPdf($htmlContent, $baseUrl);

    // 写入HTML内容,指定使用中文字体
    $pdf->writeHTML($processedHtml, true, false, true, false, '');
// 直接输出PDF
  $pdf->Output($safeFilename, 'I');

3.不局限于tcpdf库,我也试过mpdf、dompdf,很多php能转pdf的库我都试过了,都是无法正常转换emoji表情,后面自己使用的node来转换的,但是甲方爸爸就是要用php,这个比较麻烦。特来求助,看看大佬们都有没有遇到相似问题,感激不尽。

讨论数量: 3

应该是字体的关系。

3周前 评论

wkhtmltopdf,我经常用这个,可以试试

3周前 评论
mainblog (楼主) 3周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!