FPDFパッケージのエンコーディングをutf-8に設定する方法を知っている人はいますか?または、少なくともギリシャ文字をサポートするISO-8859-7(ギリシャ語)に対してですか?
基本的にギリシャ文字を含むPDFファイルを作成したいと思います。
どんな提案も役に立ちます。ジョージ
回答:
UTF-8エンコーディングを使用しないでください。標準のFPDFフォントは、ISO-8859-1またはWindows-1252を使用します。ISO-8859-1への変換は次のように実行できますutf8_decode()
。
$str = utf8_decode($str);
ただし、ユーロなどの一部の文字は正しく翻訳されません。iconv拡張機能が利用可能な場合、それを行う正しい方法は次のとおりです。
$str = iconv('UTF-8', 'windows-1252', $str);
tFPDFと呼ばれるFPDFの公式UTF-8バージョンもありますhttp://www.fpdf.org/en/script/script92.php
元のFPDFから簡単に切り替えることができます。上記のリンクの例または私のコードに示されているように、Unicodeフォントも使用していることを確認してください。
<?php
//this is a UTF-8 file, we won't need any encode/decode/iconv workarounds
//define the path to the .ttf files you want to use
define('FPDF_FONTPATH',"../fonts/");
require('tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
// Add Unicode fonts (.ttf files)
$fontName = 'Helvetica';
$pdf->AddFont($fontName,'','HelveticaNeue LightCond.ttf',true);
$pdf->AddFont($fontName,'B','HelveticaNeue MediumCond.ttf',true);
//now use the Unicode font in bold
$pdf->SetFont($fontName,'B',12);
//anything else is identical to the old FPDF, just use Write(),Cell(),MultiCell()...
//without any encoding trouble
$pdf->Cell(100,20, "Some UTF-8 String");
//...
?>
どこでもutf8_decode()をスパムする代わりにこれを使用する方がはるかにエレガントだと思います。また、AddFont()で直接.ttfファイルを使用できることも利点です。
ここでの他の答えは、問題を回避または回避するための単なる方法であり、UTF-8を回避することは、最新のプロジェクトにとって現実的な選択肢ではありません。
FPDFをベースにしたmPDFやTCPDF(およびその他)のような代替手段もありますが、高度な機能を提供し、UTF-8をサポートし、HTMLコードを解釈できます(もちろん、HTMLをPDFに変換する直接的な方法がないため制限されます)。ほとんどのFPDFコードはこれらのライブラリで直接使用できるため、コードの移行は非常に簡単です。
この問題には本当に簡単な解決策があります。
ファイルfpdf.phpで、次の行に移動します。
if($txt!=='')
{
私のバージョンのfpdfでは648行目です。次のコード行を挿入します。
$txt = iconv('utf-8', 'cp1252', $txt);
(コード行の上)
if($align=='R')
これはすべてのドイツ語の特殊文字で機能し、ギリシャ語の特殊文字でも機能するはずです。それ以外の場合は、cp1252を必要なそれぞれのアルファベットに置き換えるだけです。ここでサポートされているすべての文字を確認できます:http://en.wikipedia.org/wiki/Windows-1252
私はここで解決策を見ました:http://fudforum.org/forum/index.php? t = msg&goto = 167345元の作者がutfと8の間にダッシュを挿入するのを忘れたので、上記のサンプルコードを使用してください。
上記がお役に立てば幸いです。
ダーン
最初にフォントを生成する必要があります。MakeFont
FPDFパッケージに含まれているユーティリティを使用する必要があります。Linuxでは、デモの少し拡張されたスクリプトを使用しました。
<?php
// Generation of font definition file for tutorial 7
require('../makefont/makefont.php');
$dir = opendir('/usr/share/fonts/truetype/ttf-dejavu/');
while (($relativeName = readdir($dir)) !== false) {
if ($relativeName == '..' || $relativeName == '.')
continue;
MakeFont("/usr/share/fonts/truetype/ttf-dejavu/$relativeName",'ISO-8859-2');
}
?>
次に、生成されたファイルをfont
Webのディレクトリにコピーし、これを使用しました。
$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Buňka jedna'),1);
(私はテーブルで作業していました。)それは私の言語で機能しました(BuňkajednaはCell oneのチェコ語です)。チェコ語は中央ヨーロッパ言語、ISO-8859-2にも属しています。残念ながら、FPDFのユーザーはUTF-8エンコーディングの利点を失うことを余儀なくされています。これをPDFで取得することはできません。
Městečko Fruens Bøge
デンマークの手紙はø
なりř
ISO-8859-2で。
解決策の提案:ギリシャ語のフォントを入手し、適切なエンコーディング(ISO-8859-7)を使用iconv
してフォントを生成し、フォントが生成されたものと同じターゲットエンコーディングで使用する必要があります。
この答えは私にはうまくいきませんでした、私は文字列に対してもhtmlデコードを実行する必要がありました。見る
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
小道具はFPDFのhtml_entity_decodeからemfiに移動します(tFPDF拡張を使用)
FPDFを拡張するクラスを作成し、これを追加できます。
class utfFPDF extends FPDF {
function Cell($w, $h=0, $txt="", $border=0, $ln=0, $align='', $fill=false, $link='')
{
if (!empty($txt)){
if (mb_detect_encoding($txt, 'UTF-8', false)){
$txt = iconv('UTF-8', 'ISO-8859-5', $txt);
}
}
parent::Cell($w, $h, $txt, $border, $ln, $align, $fill, $link);
}
}
TFPDFに切り替えていない人のためにこれに答えたかった理由(フレームワークの統合など)で。
移動先:http://www.fpdf.org/makefont/index.php
使う .ttf
言語と互換性のあるフォントを。ご使用の言語に適したエンコード番号を選択してください。ファイルをダウンロードして、現在のFPDFフォントディレクトリに貼り付けます。
これを使用して、新しいフォントをアクティブにします。 $pdf->AddFont($font_name,'','Your_Font_Here.php');
そうすれば$pdf->SetFont
普通に使えます。
フォント自体で、iconvを使用してUTF-8に変換します。したがって、たとえばヘブライ語を使用している場合は、そうしますiconv('UTF-8', 'windows-1255', $first_name)
。
言語エンコーディングをWindowsエンコーディング番号に置き換えてください。
右から左の場合、簡単な修正はのようなことstrrev(iconv('UTF-8', 'windows-1255', $first_name))
です。
中国語、日本語、ロシア語などをサポートするPDFをFPDFで作成するにはどうすればよいですか?
(以下で使用されているコードのスナップショット)
問題の概要、解決策、動作するコードを含むgithubプロジェクト、および期待される結果のPDFを含むオンラインの例を提供したいと思います。
問題 :
実際には、使用しているUTF-8文字をサポートするフォントが必要です。
IEは、単にHelveticaを使用して、日本語を表示しようとしても機能しません。Font Forgeまたはその他のフォントツールを使用している場合は、フォントの漢字までスクロールして、それらが空白であることを確認できます。
Googleには、すべての言語を含むフォント(Noto font)があり、20 MBです。これは通常、テキストのサイズのいくつかの要因です。したがって、多くのフォントがすべての言語をカバーしない理由がわかります。
ソリューション :
私は、日本語と中国語用のrounded-mgenplus-20140828.ttfおよびZCOOL_QingKe_HuangYou.ttfフォントパックを使用しています。これらはオープンソースであり、多くのオープンソースプロジェクトで見つけることができます。tFPDF自体、またはその新しい継承クラスで、のようにclass HTMLtoPDF extends tFPDF {...}
、これを行います...
$this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
$this->SetFont('japanese', '', 14);
$this->Write(14, '日本語');
それ以上のものではないはずです!
GitHubのコードパッケージ:
https://github.com/HoldOffHunger/php-html-to-pdf
働く、日本語のオンラインデモ:
子孫のために。
Linuxマシンのfpdfにロシア語を追加する方法:
1)http://www.fpdf.org/makefont/にアクセスし、ISO-8859-5エンコーディングを使用してttfフォント(AerialRegular.ttfなど)を2つのファイルに変換します:AerialRegular.phpとAerialRegular.z
2)これら2つのファイルをfpdf / fontディレクトリに置きます
3)コードで使用します。
$pdf = new \FPDI();
$pdf->AddFont('ArialMT','','ArialRegular.php');
$pdf->AddPage();
$tplIdx = $pdf->importPage(1);
$pdf->useTemplate($tplIdx, 0, 0, 211, 297); //width and height in mms
$pdf->SetFont('ArialMT','',35);
$pdf->SetTextColor(255,0,0);
$fullName = iconv('UTF-8', 'ISO-8859-5', 'Алексей');
$pdf->SetXY(60, 54);
$pdf->Write(0, $fullName);
このiconvソリューションの代わりに:
$str = iconv('UTF-8', 'windows-1252', $str);
次を使用できます。
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
UFDPFと呼ばれるFPDFの拡張機能があります http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/
しかし、私見ですが、クラスを変更できる場合は、mpdfを使用することをお勧めします。
ギリシャ語でうまくいくかどうかはわかりませんが、ブラジルポルトガル語の文字でも同じ問題が発生し、解決策はhtmlエンティティを使用することでした。基本的に2つのケースがありました。
これらのために、私は最初にそれをhtmlエンティティにエンコードしhtmlentities()
、次にそれらをにデコードしましたiso-8859-1
。例:
$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
これらのために、私はただhtmlentities()
声をかけたままにしました。例:
$s = html_entity_decode("Treasurer/Trésorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
次に$s
、次の例のように、FPDFに渡しました。
$pdf->Cell(100, 20, $s, 0, 0, 'L');
注:ENT_COMPAT | ENT_HTML401
は、http://php.net/manual/en/function.html-entity-decode.phpのように、パラメーター#2の標準値です。
お役に立てば幸いです。
私はこの質問が古いことを知っていますが、私の答えは他の答えで解決策を見つけられなかった人々を助けると思います。そのため、私の問題は、PDFにクロアチア語の文字を表示できないことでした。まず、FPDFを使用しましたが、Unicodeをサポートしていないと思います。最後に、私の問題を解決したのは、UnicodeをサポートするFPDFのバージョンであるtFPDFです。これは私のために働いた例です:
require('tFPDF/tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
$pdf->AddFont('DejaVu', 'B', 'DejaVuSansCondensed-Bold.ttf', true);
$pdf->SetFont('DejaVu','',14);
$txt = 'čćžšđČĆŽŠĐ';
$pdf->Write(8,$txt);
$pdf->Output();