我正在尝试使用 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();
我也尝试过不同的字体。但对我不起作用。有人可以在这方面帮助我吗?
遗憾的是,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 代码。也不能保证它也可以打印表情符号。
您可以将表情符号替换为 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, '-');
}