TCPDF(PHP)生成PDF文件时德语特殊字符显示异常问题问询
问题描述
我在使用PHP的TCPDF类库生成PDF文件时,德语字符无法正常显示,使用的代码如下:
<?php // Load autoloader (using Composer) require __DIR__ . '/vendor/autoload.php'; $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->SetPrintHeader(false); $pdf->AddPage(); // create some HTML content $html = '<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> Die angeführten Preise sind Fixpreise für eine schlüsselfertige Ausführung gemäß Leistungsbeschreibung und Ausstattungsliste und gelten bei einem Vertragsabschluss bis 31.12.2021.<br/> Die m²-Angaben sind Cirka-Maße. Geringfügige Abweichungen sind möglich und auf Grundrissvarianten oder technische Änderungen, behördliche Vorschriften etc. zurückzuführen.<br/> In den oben genannten Preisen sind sämtliche in vorliegender Preisliste angeführten Kaufnebenkosten (mit Ausnahme der Beglaubigungskosten und Barauslagen im Zusammenhang mit der Eintragung im Grundbuch) enthalten, der Verkauf erfolgt provisionsfrei direkt vom Bauträger. Kosten im Zusammenhang mit der Finanzierung (insbesondere auch Kosten für die Bankgarantie) sind von der Käuferseite zu tragen. </body> </html>'; $pdf->writeHTML(utf8_encode($html), true, false, true, false, ''); $pdf->lastPage(); $lastPage = $pdf->getPage(); $pdf->Output('generated.pdf', 'I');
生成的PDF文件显示效果如下:
对应的原始HTML页面中所有字符显示均正常,效果如下:
解决方案
- 移除重复转码逻辑
$html本身已经是UTF-8编码,utf8_encode()仅适用于将ISO-8859-1编码的内容转换为UTF-8,对已经是UTF-8的内容调用该函数会导致编码异常,直接触发德语特殊字符乱码。直接将writeHTML方法的第一个参数改为$html即可。 - 设置支持Unicode的字体
TCPDF默认字体可能未包含德语变音符号、ß等特殊字符的字形,需要在添加页面前设置支持西欧字符的Unicode字体,比如TCPDF默认自带的dejavusans字体,对欧洲语言字符兼容性极好。
修改后的完整代码
<?php // 加载Composer自动加载文件 require __DIR__ . '/vendor/autoload.php'; // 初始化TCPDF时已开启UTF-8支持,参数配置正确 $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->SetPrintHeader(false); // 设置支持德语特殊字符的字体,字号可根据需求调整 $pdf->SetFont('dejavusans', '', 10); $pdf->AddPage(); // HTML内容保持不变,本身已是UTF-8编码,lang属性改为de为可选优化项 $html = '<!DOCTYPE html> <html lang="de"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> Die angeführten Preise sind Fixpreise für eine schlüsselfertige Ausführung gemäß Leistungsbeschreibung und Ausstattungsliste und gelten bei einem Vertragsabschluss bis 31.12.2021.<br/> Die m²-Angaben sind Cirka-Maße. Geringfügige Abweichungen sind möglich und auf Grundrissvarianten oder technische Änderungen, behördliche Vorschriften etc. zurückzuführen.<br/> In den oben genannten Preisen sind sämtliche in vorliegender Preisliste angeführten Kaufnebenkosten (mit Ausnahme der Beglaubigungskosten und Barauslagen im Zusammenhang mit der Eintragung im Grundbuch) enthalten, der Verkauf erfolgt provisionsfrei direkt vom Bauträger. Kosten im Zusammenhang mit der Finanzierung (insbesondere auch Kosten für die Bankgarantie) sind von der Käuferseite zu tragen. </body> </html>'; // 移除utf8_encode调用 $pdf->writeHTML($html, true, false, true, false, ''); $pdf->lastPage(); $lastPage = $pdf->getPage(); $pdf->Output('generated.pdf', 'I');
内容的提问来源于stack exchange,提问作者Danyal Sandeelo
相关产品推荐
相关产品推荐

