FPDF utf-8エンコーディング(HOW-TO)


80

FPDFパッケージのエンコーディングをutf-8に設定する方法を知っている人はいますか?または、少なくともギリシャ文字をサポートするISO-8859-7(ギリシャ語)に対してですか?

基本的にギリシャ文字を含むPDFファイルを作成したいと思います。

どんな提案も役に立ちます。ジョージ


より多くの言語を使用したい場合はUTF8が必要なので、tFPDFを使用できます。見てい作曲パッケージを
robsch 2018

回答:


116

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);


22
これは役に立たないと思います。あなたの答えは、ISO-8859-1またはwindows-1252エンコーディングでPDFを生成する方法を説明していますが、これらのエンコーディングは非ラテン語では機能しません。多言語(マルチスクリプト)テキストの出力は言うまでもありません。
ТомицаКораћ

3
@Rafiq:「古い」FPDFを使用しないでください。ただし、新しいUTF8バージョンtFPDFを私の回答のpostetとして使用してください。
タルシシュ2015年

1
注:ISO-8859-1を使用する場合、€文字は機能しません(文字セットにユーロ記号がない場合は、代わりにISO-8859-15を使用してください)。
BurninLeo 2015

1
@BurninLeo:ISO-8859-15はそれほど良くはありません。これらのエンコーディングはすべて同じ文字数の制限があるため、-15には€がありますが、 ´または½がありません。私の答えに示されているように、唯一の実際の解決策は、UTF-8を回避する代わりに使用することです。
タルシシュ2016年

3
tFPDFはUnicodeをサポートしていますが、3年間更新されていません。一方、FPDFは最近更新されたため、tFPDFは古くなっています。tFPDFを使用するときは、このことに注意してください。
アギリス2016

38

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コードはこれらのライブラリで直接使用できるため、コードの移行は非常に簡単です。

https://github.com/mpdf/mpdf http://www.tcpdf.org/


1
iconvおよびdecodeソリューションはいずれも、より例外的な文字(♠♥☺äκόσμος)では機能しません。しかし、fpdf.phpをtpdf.phpファイルに置き換えるだけで、すべてが機能し始め、追加のボーナスとしてファイルが小さくなります。素晴らしい修正。
セバスチャン

1
FPDFとtFPDFは別々のブランチですか?tFPDFがFPDFページにうまく隠されている理由を誰かが知っていますか?切り替え前に知っておくべき欠点はありますか?
BurninLeo 2016年

1
なぜデフォルトのFPDFバージョンにならなかったのかは確かですが、メインページfpdf.orgに直接リンクされており、前述のように、tFPDFの機能は元々mPDF用に開発されました。私は生産的な環境で多くのPDFにtFPDFを使用しましたが、UTF-8とフォントの変更を除けば、100%同じだと思います。問題はありませんでした。
タルシシュ2016年

1
tFPDFはスクリプト、またはFPDFの拡張です。FPDFが最近更新されたため、古くなった(3年前に更新された)と見なされます。tFPDFの作成者はそれを維持しておらず、tFPDFに関連付けられているGitHubには触れていません。参照:github.com/rev42/tfpdf
Agilis

より多くの機能が必要ない限り、問題は発生しませんが、最後の(マイナーな)更新はわずか4か月前でしたが、UTF-8をサポートしないよりも優れています。いずれにせよ、私はTCPDFまたはmPDFを好みます。これらは両方とも、FPDFに基づいていますが、高度な機能を提供し、HTMLコードもサポートしています。
タルシシュ2016

28

この問題には本当に簡単な解決策があります。

ファイル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の間にダッシュを挿入するのを忘れたので、上記のサンプルコードを使用してください。

上記がお役に立てば幸いです。

ダーン


完璧です。これは、FPDFをPHP7をサポートするバージョンに更新して特殊文字を正しく表示した後も、まだ機能しているか、必要です。
アレン2016

1
このコマンドは私のために働きます、$ txt = iconv( 'utf-8'、 'cp1252'、$ txt); Thks
パトリック・アルゲロ

ただ驚くべきsimpelソリューション。悲しいことに、stackoverflowのあいまいな場所に隠れています:)
Pieter-JanCasteels20年

これは私の間隔で何かを変えました-いくつかの行は今早く壊れます。しかし、少なくともそれは機能しているようです-トルコ語の文字が私にとってまったく機能しなくなる前は、少なくとも今は何かが見えます。
Cold_Class

9

最初にフォントを生成する必要があります。MakeFontFPDFパッケージに含まれているユーティリティを使用する必要があります。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');
}
?>

次に、生成されたファイルをfontWebのディレクトリにコピーし、これを使用しました。

$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Buňka jedna'),1);

(私はテーブルで作業していました。)それは私の言語で機能しました(BuňkajednaCell oneのチェコ語です)。チェコ語は中央ヨーロッパ言語、ISO-8859-2にも属しています。残念ながら、FPDFのユーザーはUTF-8エンコーディングの利点を失うことを余儀なくされています。これをPDFで取得することはできません。

Městečko Fruens Bøge

デンマークの手紙はøなりřISO-8859-2で。

解決策の提案:ギリシャ語のフォントを入手し、適切なエンコーディング(ISO-8859-7)を使用iconvしてフォントを生成し、フォントが生成されたものと同じターゲットエンコーディングで使用する必要があります。




4

上記の解決策はどれも機能しません。

これを試して:

function filter_html($value){
    $value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
    return $value;
}

4

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);

} 

}


4

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))です。


4

fpdf.phpファイルの関数セルを編集して、次のような行を探します。

function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{ 

行を見つけた後

の後に書く{

$txt = utf8_decode($txt);

ファイルを保存して準備ができたら、アクセントとutf8エンコーディングが機能します:)


3

中国語、日本語、ロシア語などをサポートするPDFをFPDFで作成するにはどうすればよいですか?

(以下で使用されているコードのスナップショット)

問題の概要、解決策、動作するコードを含むgithubプロジェクト、および期待される結果のPDFを含むオンラインの例を提供したいと思います。

問題 :

  1. Tarsisが述べているように、FPDFをTFPDFに交換します。
  2. 実際には、使用している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

働く、日本語のオンラインデモ:

https://www.earthfluent.com/privacy.pdf?language=ja


1

子孫のために。

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);



0

この関数をテキストに適用できます:

 $yourtext = iconv('UTF-8', 'windows-1252', $yourtext);

ありがとう


0

ASPにFPDFを使用していますが、iconv機能を使用できません。AddPage()関数の直後に偽の画像(1x1px jpeg)をpdfに追加することで、UTF-8の問題を解決したのは奇妙に思えます。

pdf.Image "images/fpdf.jpg",0,0,1

このようにして、アクセント付きの文字がPDFに正しく追加されます。理由は聞かないでください。ただし、機能します。


0

ギリシャ語でうまくいくかどうかはわかりませんが、ブラジルポルトガル語の文字でも同じ問題が発生し、解決策はhtmlエンティティを使用することでした。基本的に2つのケースがありました。

  1. 文字列にはUTF-8文字を含めることができます。

これらのために、私は最初にそれをhtmlエンティティにエンコードしhtmlentities()、次にそれらをにデコードしましたiso-8859-1。例:

$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
  1. htmlエンティティの文字列を修正しました:

これらのために、私はただhtmlentities()声をかけたままにしました。例:

$s = html_entity_decode("Treasurer/Tr&eacute;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の標準値です。

お役に立てば幸いです。


0

私はこの質問が古いことを知っていますが、私の答えは他の答えで解決策を見つけられなかった人々を助けると思います。そのため、私の問題は、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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.