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
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
Câu trả lời:
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);
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.
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
Bạn cần tạo một phông chữ trước. Bạn phải sử dụng MakeFont
tiệ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 font
thư 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 jedna là tiế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 iconv
với cùng một mã hóa đích như phông chữ đã được tạo.
Có một phần mở rộng của FPDF được gọi là mPDF cho phép các phông chữ Unicode.
Câu trả lời này không phù hợp với tôi, tôi cũng cần chạy giải mã html trên chuỗi. Xem
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
Đạo cụ chuyển đến emfi từ html_entity_decode trong FPDF (sử dụng phần mở rộng tFPDF)
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;
}
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);
}
}
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 .ttf
phô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->SetFont
bì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))
.
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 :)
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 đề :
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:
Đố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);
Thay vì giải pháp iconv này:
$str = iconv('UTF-8', 'windows-1252', $str);
Bạn có thể sử dụng như sau:
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
Xem: Làm thế nào để chuyển đổi các ký tự Windows-1252 thành các giá trị trong php?
Có một phần mở rộng cho FPDF được gọi là UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/
Nhưng, imho, tốt hơn là sử dụng mpdf nếu bạn có thể đổi lớp.
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.
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:
Đố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');
Đố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ésorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
Sau đó, tôi đã chuyển $s
cho FPDF, như trong ví dụ này:
$pdf->Cell(100, 20, $s, 0, 0, 'L');
Lưu ý: ENT_COMPAT | ENT_HTML401
là 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.
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();