最新のTCPDFバージョン(5.9)を使用しています。しかし、エンコーディングにはいくつかの奇妙な問題があります。ąčęėįšųūž のようなリトアニア語の記号が必要です。しかし、それを手に入れるのはごくわずかです。その他は?????のように残ります それで、私は何をすべきですか?デフォルトの times フォントを使用します (TCPDF のダウンロードに付属しています)。
どんな助けでも大歓迎です。
TCPDF は utf8 では非常にトリッキーです。目的を達成する最善の方法は、生成された PDF ファイル自体にフォントを埋め込むことです。TCPDF パッケージの freeserif フォントを使用できます。これには、すべての utf8 シンボルが含まれており、任意の言語の任意の文字が表示されますが、出力ファイルに ~700kb が追加されます。ファイル サイズが問題にならない場合は、これが必要なシンボルを取得する最も簡単な方法です。
必要な文字を含む独自のフォントを作成して埋め込むこともできます。普遍的でサイズを小さく保つことはおそらく最良の解決策ですが、より複雑です。
または、システムから取得したコア フォントを中継し、見つからない場合は代替フォントに置き換えることもできます。これにより、出力ファイルが非常に軽くなりますが、エキゾチックな文字を取得するためにフォントのサブセット化が必要になります。個人的にはこれで成功していないので、フォントを埋め込むことが最善の解決策であり、たまたまより普遍的である.
CPDFコアフォントに含まれているフォントがあります-dejavusans、それはすべてのリトアニア文字を表示します。以下を追加するだけです。
$pdf->setHeaderFont(Array('dejavusans', '', 10, '', false));
$pdf->setFooterFont(Array('dejavusans', '', 8, '', false));
$pdf->SetFont('dejavusans', '', 10, '', false);
$unicode
TCPDF コンストラクターのパラメーターを に設定しfalse
、$encoding
パラメーターを'ISO-8859-1'
または他の文字マップに設定します。
これはあなたを助けるでしょう:
UTF-8 ユニコードのデフォルト:
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
ヨーロッパ文字セットのコンストラクターの例:
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);
デフォルトの Helvetica フォントを使用してルーマニア語のテキストをレンダリングしようとしたときに、これと同じ状況を発見しました。いくつかの調査を行ったところ、tcpdf ライブラリはデフォルトのフォント (「コア」フォントと呼ばれる) を Latin1 文字として扱うことがわかったので、UTF-8 エンコーディングを使用して unicode フラグを設定するように指示しても、テキストは文字通り翻訳されます。レンダリングする前に、Latin1 に相当します。ライブラリのデフォルトの動作は、Latin1 の同等物が見つかった場合、同等物を見つけることができる各文字を翻訳することです。それ以外の場合、文字は「?」として翻訳されます。
これは、次のメソッドチェーンの TCPDF クラス内にあります:
Write()
-> Cell()
-> getCellCode()
-> _escapetext()
.
内部で_escapetext()
は$this->isunicode
、選択したフォントをチェックしてから、そのタイプがcore|TrueType|Type1であるかどうかを確認しています。そうであれば、UTF8ToLatin1()
メソッドを介して文字列を「ラテン語化」します。これが「?」の場所です。翻訳が行われています。
私の推奨は、あなたが求めているデフォルトのフォントに似たカスタム Unicode フォント (Deja Vu Sans など) を使用することです。それは私の現在の状況ではうまくいきました。
データベースから Karnātakaのような文字を読み取り、このkarn?takaのよう に表示するのに問題があります。これは望ましくないので、次のことを行います。
接続の文字セットを定義します ( mysql_set_charset()
):
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("database_name", $con) or die(mysql_error());
mysql_set_charset('utf8',$con);
$pdf->SetFont('DejaVuSerif', '', 10);
の代わりに使用 $pdf->SetFont('helvetica', 'B', 12);
IIRC では、ここで説明されているように、新しいフォントを作成するときにエンコーディングを定義できます。それ以外の場合は、フォントの作成時に定義されたエンコーディングを使用する必要があります。TCPDF に同梱されているフォントはすべて WinAnsiEncoding を使用しているようです... 別名コード ページ 1252 です。
不格好ですが、効果的です。
デフォルトの TCPDF パッケージではdejavusansとfreeserifがテストされており、両方のフォントがリトアニア文字で動作します。ロシア語の文字もいくつか入力しましたが、それらも機能しました。このコードを使用してテストしました:
$this->pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$this->pdf->AddPage();
$this->pdf->SetFont('dejavusans', 'B', 20); // UTF8 fonts with lithuanian support: freeserif, dejavusans
$this->pdf->Write(0, 'ąžūčšęėųįĄŽŪČŠĘĖŲĮ Превед Кросавчег!', '', 0, 'C', true, 0, false, false, 0);
dejavusansフォントを使用すると、ロシア語とラトビア語の両方の文字で問題なく機能しました。
私にとっては、フォントの問題でした。このフォントを使用するtimes
と、ローカルのマルチバイト文字が正しく表示されませんでした。私がそれを変更したとき、freeserif
彼らは正常に動作していました:)
$fontname = $pdf->addTTFfont('C:\xampp\htdocs\copyshop\fonts\07-TH-Sarabun-PSK\THSarabun.ttf', 'TrueTypeUnicode', '', 32);
$pdf->SetFont($fontname, '', 16,'',FALSE); //Working
これには、パラメーター TCPDF コンストラクターの次のコードを使用します。
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);
それはあなたを助けるでしょう。