Mã hóa FPDF utf-8 (CÁCH LÀM)


80

Có ai biết cách đặt mã hóa trong gói FPDF thành utf-8 không? Hoặc ít nhất là ISO-8859-7 (tiếng Hy Lạp) hỗ trợ các ký tự tiếng Hy Lạp?

Về cơ bản, tôi muốn tạo một tệp pdf chứa các ký tự Hy Lạp.

Bất kỳ đề xuất sẽ giúp đỡ. George


Nếu bạn muốn sử dụng nhiều ngôn ngữ hơn, bạn cần UTF8, vì vậy bạn có thể sử dụng tFPDF. Hãy xem gói soạn nhạc .
robsch

Câu trả lời:


116

Không sử dụng mã hóa UTF-8. Phông chữ FPDF tiêu chuẩn sử dụng ISO-8859-1 hoặc Windows-1252. Có thể thực hiện chuyển đổi sang ISO-8859-1 với utf8_decode(): $str = utf8_decode($str); Nhưng một số ký tự như Euro sẽ không được dịch chính xác. Nếu tiện ích mở rộng iconv khả dụng, cách thực hiện đúng là như sau: $str = iconv('UTF-8', 'windows-1252', $str);


22
Tôi không nghĩ rằng điều này sẽ giúp ích. Câu trả lời của bạn giải thích cách tạo tệp PDF với mã hóa ISO-8859-1 hoặc windows-1252, nhưng những mã hóa này sẽ không hoạt động đối với các ngôn ngữ không phải là tiếng Latinh. Chưa kể đến việc xuất ra các văn bản đa ngôn ngữ (đa tập lệnh).
Томица Кораћ

3
@Rafiq: không sử dụng FPDF "cũ" mà sử dụng tFPDF Phiên bản UTF8 mới hơn làm postet trong Câu trả lời của tôi.
Tarsis

1
Lưu ý: Khi sử dụng ISO-8859-1, ký tự € sẽ không hoạt động (không có dấu Euro trong bộ ký tự, hãy sử dụng ISO-8859-15 để thay thế).
BurninLeo

1
@BurninLeo: ISO-8859-15 cũng không khá hơn là bao, tất cả các Mã hóa đó đều có cùng giới hạn Ký tự, vì vậy -15 có € nhưng do đó thiếu ´ hoặc ½. Giải pháp thực sự duy nhất là sử dụng UTF-8 thay vì tránh nó - như trong câu trả lời của tôi.
Tarsis

3
tFPDF không hỗ trợ unicode nhưng nó đã không được cập nhật trong 3 năm, trong đó FPDF đã được cập nhật gần đây hơn khiến tFPDF lỗi thời. Hãy ghi nhớ điều đó khi sử dụng tFPDF.
Agilis

38

Ngoài ra còn có một Phiên bản UTF-8 chính thức của FPDF được gọi là tFPDF http://www.fpdf.org/en/script/script92.php

Bạn có thể dễ dàng chuyển từ FPDF ban đầu, chỉ cần đảm bảo rằng bạn cũng sử dụng Phông chữ unicode như được hiển thị trong ví dụ trong liên kết ở trên hoặc mã của tôi:

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

//...
?>

Tôi nghĩ rằng sẽ tốt hơn nhiều khi sử dụng điều này thay vì gửi thư rác utf8_decode () ở khắp mọi nơi và khả năng sử dụng tệp .ttf trực tiếp trong AddFont () cũng là một điểm thuận lợi.

Bất kỳ câu trả lời nào khác ở đây chỉ là một cách để tránh hoặc giải quyết vấn đề, và tránh UTF-8 không phải là lựa chọn thực sự cho một dự án cập nhật.

Ngoài ra còn có các lựa chọn thay thế như mPDF hoặc TCPDF (và các lựa chọn khác) dựa trên FPDF nhưng cung cấp các chức năng nâng cao, có Hỗ trợ UTF-8 và có thể diễn giải Mã HTML (tất nhiên là có giới hạn vì không có cách trực tiếp để chuyển đổi HTML sang PDF). Hầu hết mã FPDF có thể được sử dụng trực tiếp trong các thư viện đó, vì vậy việc di chuyển mã khá dễ dàng.

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


1
Không có giải pháp giải mã và biểu tượng nào phù hợp với các ký tự đặc biệt hơn (♠ ♥ ☺äκόσμος). Nhưng nếu bạn chỉ thay thế fpdf.php của mình bằng tệp tpdf.php, tất cả chỉ bắt đầu hoạt động và các tệp của bạn nhỏ hơn như một phần thưởng bổ sung. Sửa chữa tuyệt vời.
Sebastian

1
FPDF và tFPDF có phải là chi nhánh riêng biệt không? Có ai biết lý do tại sao tFPDF ẩn rất tốt trên trang FPDF không? Có bất kỳ nhược điểm nào, người ta nên biết trước khi chuyển đổi?
BurninLeo

1
Tôi chắc chắn tại sao họ không đặt nó làm Phiên bản FPDF mặc định, nhưng nó được liên kết trực tiếp trên trang chính fpdf.org và như đã đề cập ở đó, các tính năng của tFPDF ban đầu được phát triển cho mPDF. Tôi đã sử dụng tFPDF cho rất nhiều tệp PDF trong môi trường hiệu quả và tôi nghĩ rằng ngoài UTF-8 và những thay đổi về phông chữ thì nó giống nhau 100%. Không bao giờ có bất kỳ vấn đề.
Tarsis

1
tFPDF là một tập lệnh hoặc một phần mở rộng của FPDF. Nó được coi là lỗi thời (Cập nhật 3 năm trước) vì FPDF đã được cập nhật gần đây hơn. Tác giả của tFPDF không duy trì nó và GitHub được liên kết với tFPDF chưa được động đến. Xem: github.com/rev42/tfpdf
Agilis

Miễn là bạn không cần thêm chức năng, tôi không thấy Vấn đề ở đó, btw, bản cập nhật cuối cùng (nhỏ) chỉ cách đây 4 tháng - vẫn tốt hơn là không hỗ trợ UTF-8. Dù bằng cách nào tôi cũng sẽ cung cấp trước TCPDF hoặc mPDF, cả hai đều dựa trên FPDF nhưng cung cấp các chức năng nâng cao và cũng hỗ trợ HTML Code.
Tarsis

28

có một giải pháp thực sự đơn giản cho vấn đề này.

Trong tệp fpdf.php, hãy chuyển đến dòng có nội dung:

if($txt!=='')
{

Đó là dòng 648 trong phiên bản fpdf của tôi. Chèn dòng mã sau:

$txt = iconv('utf-8', 'cp1252', $txt);

(phía trên dòng mã)

if($align=='R')

Điều này hoạt động cho tất cả các ký tự đặc biệt của Đức và cũng sẽ hoạt động đối với các ký tự đặc biệt của Hy Lạp. Nếu không, chỉ cần thay thế cp1252 bằng bảng chữ cái tương ứng mà bạn yêu cầu. Bạn có thể xem tất cả các ký tự được hỗ trợ tại đây: http://en.wikipedia.org/wiki/Windows-1252

Tôi đã thấy giải pháp ở đây: http://fudforum.org/forum/index.php?t=msg&goto=167345 Vui lòng sử dụng mã ví dụ của tôi ở trên, vì tác giả gốc đã quên chèn dấu gạch ngang giữa utf và 8.

Hy vọng ở trên là hữu ích.

Daan


Tuyệt vời, điều này vẫn hoạt động hoặc cần thiết sau khi cập nhật FPDF lên phiên bản hỗ trợ PHP7 để hiển thị các ký tự đặc biệt một cách chính xác.
Aren

1
Lệnh này phù hợp với tôi, $ txt = iconv ('utf-8', 'cp1252', $ txt); Thks
Patrick Arguello

Chỉ là giải pháp đơn giản tuyệt vời. Sad nó được giấu đi ở một nơi ít người biết về stackoverflow :)
Pieter-Jan Casteels

Điều này đã thay đổi điều gì đó với khoảng cách của tôi - một số dòng bị ngắt trước đó. Nhưng ít nhất nó có vẻ hoạt động - trước đây chữ Thổ Nhĩ Kỳ không có tác dụng gì đối với tôi, thì giờ ít nhất tôi đã thấy được điều gì đó.
Cold_Class

9

Bạn cần tạo một phông chữ trước. Bạn phải sử dụng MakeFonttiện ích có trong gói FPDF. Tôi đã sử dụng tập lệnh mở rộng một chút trên Linux này từ bản demo:

<?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');
}
?>

Sau đó, tôi sao chép các tệp đã tạo vào fontthư mục trên web của mình và sử dụng:

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

(Tôi đang làm việc trên bàn.) Điều đó phù hợp với ngôn ngữ của tôi ( Buňka jednatiếng séc cho Ô một ). Tiếng Séc thuộc về các ngôn ngữ trung Âu, cũng là ngôn ngữ ISO-8859-2. Đáng tiếc, người sử dụng FPDF buộc phải mất đi lợi thế của mã hóa UTF-8. Bạn không thể lấy nó trong tệp PDF của mình:

Městečko Fruens Bøge

Chữ cái Đan Mạch øtrở thành řtrong ISO-8859-2.

Gợi ý giải pháp: Bạn cần có một phông chữ Hy Lạp, tạo phông chữ bằng cách sử dụng mã hóa thích hợp (ISO-8859-7) và sử dụng iconvvới cùng một mã hóa đích như phông chữ đã được tạo.




4

Không có giải pháp nào ở trên sẽ hoạt động.

Thử cái này:

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

4

Bạn có thể tạo một lớp để mở rộng FPDF và thêm lớp này:

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

Tôi muốn trả lời điều này cho bất kỳ ai chưa chuyển sang TFPDF vì bất kỳ lý do gì (tích hợp khung, v.v.)

Truy cập: http://www.fpdf.org/makefont/index.php

Sử dụng .ttfphông chữ tương thích cho ngôn ngữ bạn muốn sử dụng. Đảm bảo chọn số mã hóa phù hợp với ngôn ngữ của bạn. Tải xuống các tệp và dán chúng vào thư mục phông chữ FPDF hiện tại của bạn.

Sử dụng cái này để kích hoạt phông chữ mới: $pdf->AddFont($font_name,'','Your_Font_Here.php');

Sau đó, bạn có thể sử dụng $pdf->SetFontbình thường.

Trên chính phông chữ, sử dụng iconv để chuyển đổi thành UTF-8. Vì vậy, nếu ví dụ bạn đang sử dụng tiếng Do Thái, bạn sẽ làm iconv('UTF-8', 'windows-1255', $first_name).

Thay thế số mã hóa cửa sổ cho mã hóa ngôn ngữ của bạn.

Đối với từ phải sang trái, một bản sửa lỗi nhanh đang thực hiện một số việc như strrev(iconv('UTF-8', 'windows-1255', $first_name)).


4

chỉ cần chỉnh sửa ô chức năng trong tệp fpdf.php, tìm dòng trông giống như thế này

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

sau khi tìm thấy dòng

viết sau {,

$txt = utf8_decode($txt);

lưu tệp và sẵn sàng, dấu và mã hóa utf8 sẽ hoạt động :)


3

Làm cách nào để tạo tệp PDF trong FPDF hỗ trợ tiếng Trung, tiếng Nhật, tiếng Nga, v.v.?

(ảnh chụp nhanh mã đang sử dụng bên dưới)

Tôi muốn cung cấp: bản tóm tắt vấn đề, giải pháp, một dự án github với mã làm việc và một ví dụ trực tuyến với tệp PDF kết quả, mong đợi.

Vấn đề :

  1. Như lời của Tarsis, hãy hoán đổi FPDF thành TFPDF.
  2. Bạn thực sự cần một phông chữ hỗ trợ các ký tự UTF-8 mà bạn đang sử dụng.

    IE, chỉ sử dụng Helvetica và cố gắng hiển thị tiếng Nhật sẽ không hoạt động. Nếu bạn sử dụng Font Forge, hoặc một số công cụ phông chữ khác, bạn có thể cuộn đến các ký tự tiếng Trung của phông chữ và thấy chúng trống.

    Google có một phông chữ (phông chữ Noto ) chứa tất cả các ngôn ngữ và nó là 20mb, thường là một số yếu tố kích thước văn bản của bạn. Vì vậy, bạn có thể thấy tại sao nhiều phông chữ đơn giản không bao gồm mọi ngôn ngữ.

Giải pháp :

Tôi đang sử dụng gói phông chữ round-mgenplus-20140828.ttf và ZCOOL_QingKe_HuangYou.ttf cho tiếng Nhật và tiếng Trung, là các gói phông chữ mở và có thể được tìm thấy trong nhiều dự án mã nguồn mở. Trong chính tFPDF hoặc một lớp kế thừa mới của nó, chẳng hạn như class HTMLtoPDF extends tFPDF {...}, bạn sẽ làm điều này ...

$this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
$this->SetFont('japanese', '', 14);
$this->Write(14, '日本語');

Không nên gì hơn với nó!

Gói mã trên GitHub:

https://github.com/HoldOffHunger/php-html-to-pdf

Làm việc, Demo trực tuyến của tiếng Nhật:

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


1

Đối với con cái.

Cách tôi quản lý để thêm ngôn ngữ Nga vào fpdf trên máy Linux của mình:

1) Truy cập http://www.fpdf.org/makefont/ và chuyển đổi phông chữ ttf của bạn (ví dụ AerialRegular.ttf) thành 2 tệp bằng cách sử dụng mã hóa ISO-8859-5 : AerialRegular.php và AerialRegular.z

2) Đặt những 2 file vào FPDF / font thư mục

3) Sử dụng nó trong mã của bạn:

$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

Bạn có thể áp dụng chức năng này trên văn bản của mình:

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

Cảm ơn


0

Tôi sử dụng FPDF cho ASP và chức năng iconv không khả dụng. Có vẻ lạ, bởi tôi đã giải quyết vấn đề UTF-8 bằng cách thêm một hình ảnh giả (một jpeg 1x1px) vào pdf, chỉ sau hàm AddPage ():

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

Bằng cách này, các ký tự có dấu được thêm chính xác vào pdf của tôi, đừng hỏi tôi tại sao nhưng nó hoạt động.


0

Không chắc liệu nó có hiệu quả với tiếng Hy Lạp hay không, nhưng tôi đã gặp vấn đề tương tự đối với các ký tự tiếng Bồ Đào Nha ở Brazil và giải pháp của tôi là sử dụng các thực thể html. Về cơ bản tôi đã có hai trường hợp:

  1. Chuỗi có thể chứa các ký tự UTF-8.

Đối với những điều này, đầu tiên tôi mã hóa nó thành các thực thể html htmlentities()và sau đó giải mã chúng thành iso-8859-1. Thí dụ:

$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
  1. Chuỗi cố định với các thực thể html:

Đối với những điều này, tôi chỉ cần htmlentities()gọi ra. Thí dụ:

$s = html_entity_decode("Treasurer/Tr&eacute;sorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');

Sau đó, tôi đã chuyển $scho FPDF, như trong ví dụ này:

$pdf->Cell(100, 20, $s, 0, 0, 'L');

Lưu ý: ENT_COMPAT | ENT_HTML401là giá trị tiêu chuẩn cho tham số # 2, như trong http://php.net/manual/en/ Chức năng.html-entity-decode.php

Hy vọng rằng sẽ giúp.


0

Tôi biết rằng câu hỏi này đã cũ nhưng tôi nghĩ câu trả lời của tôi sẽ giúp ích cho những ai chưa tìm ra giải pháp trong các câu trả lời khác. Vì vậy, vấn đề của tôi là tôi không thể hiển thị các ký tự croatian trong tệp PDF của mình. Thứ nhất, tôi đã sử dụng FPDF nhưng theo tôi, nó không hỗ trợ Unicode. Cuối cùng, điều đã giải quyết được vấn đề của tôi là tFPDF là phiên bản của FPDF hỗ trợ Unicode. Đây là ví dụ phù hợp với tôi:

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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.