web-dev-qa-db-ja.com

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

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

基本的に、ギリシャ文字を含むpdfファイルを作成します。

任意の提案が役立ちます。ジョージ

71
yorgos

UTF-8エンコードを使用しないでください。標準のFPDFフォントはISO-8859-1またはWindows-1252を使用します。 utf8_decode()$str = utf8_decode($str);を使用してISO-8859-1への変換を実行することは可能ですが、ユーロなどの一部の文字は正しく翻訳されません。 iconv拡張が利用可能な場合、それを行う正しい方法は次のとおりです:$str = iconv('UTF-8', 'windows-1252', $str);

101
Michal

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/mpdfhttp://www.tcpdf.org/

33
Tarsis

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

ファイル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。

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

大安

17
Daan

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

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

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

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

Městečko Fruens Bøge

ISO-8859-2では、デンマーク文字øřになります。

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

9
Tomáš K.

この答えは私にとってはうまくいきませんでした。文字列に対してもHTMLデコードを実行する必要がありました。見る

iconv('UTF-8', 'windows-1252', html_entity_decode($str));

小道具は FPDFのhtml_entity_decode(tFPDF拡張を使用) からemfiに移動します

4
Joel Small

クラスを作成して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

Unicodeフォントを許可するmPDFと呼ばれるFPDFの拡張機能があります。

http://www.mpdf1.com/mpdf/index.php

4
Jon Winstanley

上記のソリューションはどれも機能しません。

これを試して:

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

何らかの理由(フレームワークの統合など)で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))のようなことです。

3
rozick

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

(以下で使用中のコードのスナップショット)

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

問題:

  1. Tarsisが述べたように、FPDFをTFPDFに交換します。
  2. 実際には、使用しているUTF-8文字をサポートするフォントが必要です。

    I.E.、単にHelveticaを使用して、日本語を表示しようとしても機能しません。 Font Forgeまたは他のフォントツールを使用している場合は、フォントの中国語文字までスクロールして、それらが空白であることを確認できます。

    Googleには、すべての言語を含むフォント( Notoフォント )があり、20MBです。これは通常、テキストのサイズのいくつかの要因です。したがって、多くのフォントがすべての単一言語をカバーしない理由を理解できます。

ソリューション:

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

2
HoldOffHunger

子孫のために。

Linuxマシンでロシア語をfpdfに追加する方法:

1) http://www.fpdf.org/makefont/ に移動し、ttfフォント(たとえばAerialRegular.ttf)をISO-を使用して2つのファイルに変換します。 8859-5 encoding: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);
1
ryzhak

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

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

行を見つけた後

{の後に書き込み、

$txt = utf8_decode($txt);

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

1
R.Costa

このiconvソリューションの代わりに:

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

次を使用できます。

$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");

参照: Windows-1252文字をphpの値に変換する方法?

1
Theo

私はこの質問が古いことを知っていますが、私の答えは他の答えで解決策を見つけられなかった人々を助けると思います。したがって、私の問題は、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();
0
NutCracker

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

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

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

0
niente1

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

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

ありがとう

0
gounane

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

  1. 文字列mayにはUTF-8文字が含まれます。

これらの場合、最初にhtmlentities()でHTMLエンティティにエンコードし、次に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_HTML401http://php.net/manual/en/function.html-entity-decode.php のように、パラメーター#2の標準値です

お役に立てば幸いです。

0

UFDPFと呼ばれるFPDFの拡張があります http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/

ただし、クラスを変更できる場合は、mpdfを使用することをお勧めします。

0
sr9yar