如何使用PHP将表情符号导出到PDF文档?

问题描述 投票:0回答:2

我正在尝试使用 FPDF 和 TCPDF php 库导出为 PDF。我发现像 😁 😀 💃🏻 ❤️ 🥳 这样的表情符号没有转换。生成的 pdf 中只有️️一些矩形框。我也尝试过 tfpdf。

    $text = "There is my text 😁 , 😀 and emojis 💃🏻 ❤️ 🥳";
    require('tfpdf/tfpdf.php');
        
    $pdf = new tFPDF();
    $pdf->AddPage();
        
    //Add a Unicode font (uses UTF-8)
    $pdf->AddFont('Segoe UI Symbol','','seguisym.ttf',true); // DejaVuSans.ttf
    $pdf->SetFont('Segoe UI Symbol','',12);
    $pdf->Write(8,$text);
    $pdf->Output();

我也尝试过不同的字体。但对我不起作用。有人可以在这方面帮助我吗?

php pdf-generation fpdf
2个回答
1
投票

遗憾的是,fPDF、TCPDF 或 tFPDF 都无法打印这些字符。问题是,这些字符不是 BMP 的一部分,它们用代理对表示,这意味着它们的行为类似于 UTF-16 中的多个字符(因为一个表情符号被打印为 2 个矩形框,而不是一个),而且它们的代码点位于上方65535。然而,所有提到的 PDF 库都依赖于代码点索引 <= 65535 as well as TFontFile class reading TTF files.

您还需要添加具有完整 Unicode 字符集或至少表情符号集的 TTF 文件。大多数字体没有它。这给 PDF 库带来了另一个问题,它可能需要支持后备字体,当在主字体中找不到代码点时将使用后备字体(例如,您想在 Gotham 中打印文本,但由于它不包括表情符号,使用其他字体)。顺便说一句,例如表情符号字体“Noto Color Emoji”有 23 MB TTF 文件。所以很容易变大。

无论如何,以上所有内容都可以添加到PDF库中,但这需要一些努力。有时我也计划根据自己的需要这样做。我认为大约需要 1 人天。

或者,您可以尝试一些更强大的东西,例如 mPDF,但该库巨大、缓慢并且需要完全重写您的 fPDF 代码。也不能保证它也可以打印表情符号。


0
投票

您可以将表情符号替换为 png 或 svg,然后您可以在 pdf 中使用,因为 png 和 svg 将支持并且您会得到结果。

尝试以下代码

导入 twitter 脚本以获取图像

<script type="module">
    import twemoji from 'https://cdn.jsdelivr.net/npm/[email protected]/+esm' 
</script>

此函数会将您的表情符号转换为十六进制代码

 function emojiToHexForTwemoji($emoji) {
       $hex = '';
       $emojiLength = mb_strlen($emoji, 'UTF-8');
       for ($i = 0; $i < $emojiLength; $i++) {
           $char = mb_substr($emoji, $i, 1, 'UTF-8');
           $hex .= '-' . strtolower(dechex(mb_ord($char)));
       }
       return trim($hex, '-');
   }

此代码会将您的表情符号从字符串替换为 svg 或 png 图像

$input_string = "Hello 😀! Let's grab some 🍕 and 🥤.";
   $output = ''; // Output will store the HTML
   
   // Iterate over each character and convert emojis
   $length = mb_strlen($input_string, 'UTF-8');
   for ($i = 0; $i < $length; $i++) {
       $char = mb_substr($input_string, $i, 1, 'UTF-8');
       
       // If the character is an emoji, convert to Twemoji URL
       if (preg_match('/[\x{1F600}-\x{1F64F}|\x{1F300}-\x{1F5FF}|\x{1F680}-\x{1F6FF}|\x{1F1E0}-\x{1F1FF}|\x{2600}-\x{26FF}|\x{2700}-\x{27BF}|\x{1F900}-\x{1F9FF}]/u', $char)) {
           $hex = emojiToHexForTwemoji($char);
           // $twemojiUrl = "https://twemoji.maxcdn.com/v/latest/72x72/$hex.png"; // Twemoji CDN URL
           $twemojiUrl = "https://cdn.jsdelivr.net/gh/twitter/[email protected]/assets/72x72/$hex.png"; // Twemoji CDN URL
           $output .= "<img src='$twemojiUrl' alt='$char' class='twemoji' style='width: 1em; height: 1em;' />";
       } else {
           $output .= htmlspecialchars($char); // Non-emoji characters stay the same
       }
   }

完整代码如下

<script type="module">
     import twemoji from 'https://cdn.jsdelivr.net/npm/[email protected]/+esm'
</script>
$output = ''; // Output will store the HTML
for ($i = 0; $i < $length; $i++) { // Iterate over each character and convert emojis
$char = mb_substr($text, $i, 1, 'UTF-8');
if (isEmoji($char)) {
    $hex = emojiToHexForTwemoji($char);
    /* $twemojiUrl = "https://cdn.jsdelivr.net/gh/twitter/[email protected]/assets/72x72/$hex.png"; // PNG Twemoji CDN URL  */
    $twemojiUrl = "https://cdn.jsdelivr.net/gh/twitter/[email protected]/assets/svg/$hex.svg"; // SVG Twemoji CDN URL
    $output .= "<img src='$twemojiUrl' alt='$char' class='twemoji' style='width: 1em; height: 1em;' />";
} else {
    $output .= htmlspecialchars($char); // Non-emoji characters stay the same
}
}
$text = $output;
function emojiToHexForTwemoji($emoji) {
    $hex = '';
    $emojiLength = mb_strlen($emoji, 'UTF-8');
    for ($i = 0; $i < $emojiLength; $i++) {
        $char = mb_substr($emoji, $i, 1, 'UTF-8');
        $hex .= '-' . strtolower(dechex(mb_ord($char)));
    }
    return trim($hex, '-');
}
© www.soinside.com 2019 - 2024. All rights reserved.