【问题标题】:Tcpdf issue with display hindi language font显示印地语字体的 Tcpdf 问题
【发布时间】:2016-12-29 11:45:45
【问题描述】:

我正在使用 Tcpdf PHP 库来生成 PDF。我在生成的 PDF 中显示印地语字体时遇到问题。我拥有诸如字体字符标准等所有内容。但是我生成的 PDF 包含 ?????? 而不是印地语字体。请看看我在这里包含了我的代码。

<?php
//============================================================+
// File name   : example_001.php
// Begin       : 2008-03-04
// Last Update : 2013-05-14
//
// Description : Example 001 for TCPDF class
//               Default Header and Footer
//
// Author: Nicola Asuni
//
// (c) Copyright:
//               Nicola Asuni
//               Tecnick.com LTD
//               www.tecnick.com
//               info@tecnick.com
//============================================================+

/**
 * Creates an example PDF TEST document using TCPDF
 * @package com.tecnick.tcpdf
 * @abstract TCPDF - Example: Default Header and Footer
 * @author Nicola Asuni
 * @since 2008-03-04
 */

// Include the main TCPDF library (search for installation path).
require_once('tcpdf_include.php');

// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Nicola Asuni');
$pdf->SetTitle('TCPDF Example 001');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');

// set default header data
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
$pdf->setFooterData(array(0,64,0), array(0,64,128));

// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

// set default monospaced font
//$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);



TCPDF_FONTS::addTTFfont('../fonts/Devanagari/Devanagari.ttf', 'TrueTypeUnicode', "", 32);
// ---------------------------------------------------------

// set default font subsetting mode
$pdf->setFontSubsetting(true);

// Set font
// dejavusans is a UTF-8 Unicode font, if you only need to
// print standard ASCII chars, you can use core fonts like
// helvetica or times to reduce file size.
$pdf->SetFont('Devanagari', '', 14, '', true);

// Add a page
// This method has several options, check the source code documentation for more information.
$pdf->AddPage();

// set text shadow effect
$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));

// Set some content to print
$html = "प्रविष्टि कर कुल बिक्री मूल्य वेट के साथ
भार(ग्रा) टिन मात्रा(सं) भुगतान का प्रकार विवरण जारीकर्ता कार्ड";

// Print text using writeHTMLCell()
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);

// ---------------------------------------------------------

// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output('example_001.pdf', 'I');

//============================================================+
// END OF FILE
//============================================================+

请帮助解决我的问题。

【问题讨论】:

  • 你确定那个字体叫做“梵文”吗?我的印象是它被称为“梵文新”...
  • 我使用了我认为正确的方法来调用字体?如果我错了,请帮我纠正我的东西
  • @arkascha 已尝试使用“Devanagari New”,但出现错误未找到字体
  • 好的,所以很可能您以正确的方式引用了字体。奇怪,因为对我来说它有一个不同的名字。但无论如何...接下来是确保您实际使用的是 unicode 字符串编码。
  • 我还添加了这个:$pdf->writeHTMLCell(0, 0, '', '', utf8_encode($html), 0, 1, 0, true, '', true);还是不行

标签: php utf-8 character-encoding tcpdf


【解决方案1】:
$pdf->SetFont('mangal', '', 10);

您需要使用以下链接将 ttf 转换为 tcpdf 字体

http://fonts.snm-portal.com/

【讨论】:

    【解决方案2】:

    试试这个:

    $pdf->writeHTMLCell(0, 0, '', '', utf8_encode($html), 0, 1, 0, true, '', true);
    

    【讨论】:

    • 输出是:????????? ?? ??? ??? ??? ??? ?? ??? ???(????)??? ??????(??)?????? ?? ??? ??? ?????? ?????
    【解决方案3】:
    <?php
    //============================================================+
    // File name   : example_001.php
    // Begin       : 2008-03-04
    // Last Update : 2013-05-14
    //
    // Description : Example 001 for TCPDF class
    //               Default Header and Footer
    //
    // Author: Nicola Asuni
    //
    // (c) Copyright:
    //               Nicola Asuni
    //               Tecnick.com LTD
    //               www.tecnick.com
    //               info@tecnick.com
    //============================================================+
    
    /**
     * Creates an example PDF TEST document using TCPDF
     * @package com.tecnick.tcpdf
     * @abstract TCPDF - Example: Default Header and Footer
     * @author Nicola Asuni
     * @since 2008-03-04
     */
    
    // Include the main TCPDF library (search for installation path).
    require_once('TCPDF/tcpdf.php');
    
    // create new PDF document
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    
    // set document information
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor('Nicola Asuni');
    $pdf->SetTitle('TCPDF Example 001');
    $pdf->SetSubject('TCPDF Tutorial');
    $pdf->SetKeywords('TCPDF, PDF, example, test, guide');
    
    // set default header data
    $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
    $pdf->setFooterData(array(0,64,0), array(0,64,128));
    
    // set header and footer fonts
    $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
    $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
    
    // set default monospaced font
    //$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
    
    // set margins
    $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
    $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
    $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
    
    // set auto page breaks
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
    
    // set image scale factor
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
    
    
    
    // TCPDF_FONTS::addTTFfont('../fonts/Devanagari/Devanagari.ttf', 'TrueTypeUnicode', "", 32);
    // ---------------------------------------------------------
    
    // set default font subsetting mode
    $pdf->setFontSubsetting(true);
    
    // Set font
    
    $pdf->SetFont('freesans', '', 10);
    
    
    // MAKE ARRAY WITH UTF LANGUAGE IDENTIFIER
    $lg = Array();
    $lg['a_meta_charset'] = 'UTF-8';
    $lg['a_meta_dir'] = 'ltr';
    $lg['a_meta_language'] = 'hi'; // I think you can change this to HI or IN for hindi
    $lg['w_page'] = 'page';
    
    // CHANGE SETTINGS IN TCPDF
    $pdf->setLanguageArray($lg);
    
    
    
    // Add a page
    // This method has several options, check the source code documentation for more information.
    $pdf->AddPage();
    
    // set text shadow effect
    $pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));
    
    // Set some content to print
    $html = '<!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta http-equiv="Content-Language" content="hi">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
    
    </body>
    </html>
    <p lang="hi">
    
        प्रविष्टि कर कुल बिक्री मूल्य वेट के साथ
    भार(ग्रा) टिन मात्रा(सं) भुगतान का प्रकार विवरण जारीकर्ता कार्ड 
    </p>';
    
    // Print text using writeHTMLCell()
    $pdf->WriteHTML($html, true, 0, true, 0);
    
    // ---------------------------------------------------------
    
    // Close and output PDF document
    // This method has several options, check the source code documentation for more information.
    $pdf->Output('example_001.pdf', 'I');
    
    //============================================================+
    // END OF FILE
    //============================================================+
    

    【讨论】:

    • 不幸的是,我们在这个解决方案中遇到了一些问题:尝试写出“सिक्किम”、“महिलाओं”这样的词。您将在 PDF 中看到不正确的表示。知道为什么?
    【解决方案4】:

    使用以下代码并执行...

    <?php
    require_once 'tcpdf/tcpdf.php';
    $pdf=new TCPDF('p','mm','A4',TRUE,'UTF-8',false);
    $pdf->setPrintHeader(FALSE);
    $pdf->setPrintFooter(FALSE);
    $pdf->AddPage();
    $pdf->SetFont('Helvetica','',24);
    $pdf->Cell(190,10,'Unicode Test',0,1,'C');
    $pdf->SetFont('freesans','',24);
    $pdf->Cell(190,10,'Hindi Sans : आपका स्वागत है',0,1);
    $pdf->SetFont('freeserif','',24);
    $txt="एवेंजर्स एंडगेम";
    $pdf->MultiCell(190,10,$txt,0,1);
    $pdf->SetFillColor(255, 235, 235);
    $pdf->Output();
    

    【讨论】:

      【解决方案5】:

      杀死我 2 天后,我发现 TCPDF 缺乏对开放类型布局 (OTL) 的支持

      因此,不要在 TCPDF 上浪费时间打印印地语句子。 https://github.com/tecnickcom/TCPDF/issues/199

      要正确解析印地语/天城文字体以支持字形替换 (GSUB) 表和 GPOS — 需要字形定位表。

      例如:正确:संग्रह TCPDF 将输出:संग्ररह

      您可以通过使用支持开放式布局 (OTL) 的库来节省您的时间,例如:MPDF

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 2017-12-01
        • 2012-11-11
        • 2010-11-08
        • 1970-01-01
        • 2020-12-06
        • 2013-05-24
        • 1970-01-01
        • 2012-09-04
        相关资源
        最近更新 更多