Czy ktoś wie jak ustawić kodowanie w pakiecie FPDF na utf-8? Lub przynajmniej ISO-8859-7 (grecki), który obsługuje greckie znaki?
Zasadniczo chcę utworzyć plik pdf zawierający greckie znaki.
Wszelkie sugestie byłyby pomocne. Jerzy
Czy ktoś wie jak ustawić kodowanie w pakiecie FPDF na utf-8? Lub przynajmniej ISO-8859-7 (grecki), który obsługuje greckie znaki?
Zasadniczo chcę utworzyć plik pdf zawierający greckie znaki.
Wszelkie sugestie byłyby pomocne. Jerzy
Odpowiedzi:
Nie używaj kodowania UTF-8. Standardowe czcionki FPDF używają ISO-8859-1 lub Windows-1252. Możliwe jest wykonanie konwersji do ISO-8859-1 z utf8_decode()
:
$str = utf8_decode($str);
Jednak niektóre znaki, takie jak Euro, nie zostaną poprawnie przetłumaczone. Jeśli rozszerzenie iconv jest dostępne, właściwy sposób jest następujący:
$str = iconv('UTF-8', 'windows-1252', $str);
Istnieje również oficjalna wersja FPDF UTF-8 o nazwie tFPDF http://www.fpdf.org/en/script/script92.php
Możesz łatwo przełączyć się z oryginalnego FPDF, po prostu upewnij się, że używasz również czcionki Unicode, jak pokazano w przykładzie w powyższym linku lub moim kodzie:
<?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");
//...
?>
Myślę, że bardziej eleganckie jest używanie tego zamiast rozsyłania wszędzie utf8_decode (), a możliwość używania plików .ttf bezpośrednio w AddFont () jest również zaletą.
Każda inna odpowiedź to tylko sposób na uniknięcie lub obejście problemu, a unikanie UTF-8 nie jest prawdziwą opcją dla aktualnego projektu.
Istnieją również alternatywy, takie jak mPDF lub TCPDF (i inne), które opierają się na FPDF, ale oferują zaawansowane funkcje, obsługują UTF-8 i mogą interpretować kod HTML (oczywiście ograniczone, ponieważ nie ma bezpośredniego sposobu konwersji HTML do PDF). Większość kodu FPDF może być używana bezpośrednio w tych bibliotekach, więc migracja kodu jest dość łatwa.
istnieje naprawdę proste rozwiązanie tego problemu.
W pliku fpdf.php przejdź do wiersza, który mówi:
if($txt!=='')
{
To wiersz 648 w mojej wersji fpdf. Wstaw następujący wiersz kodu:
$txt = iconv('utf-8', 'cp1252', $txt);
(nad linią kodu)
if($align=='R')
Działa to dla wszystkich niemieckich znaków specjalnych i powinno również działać dla greckich znaków specjalnych. W przeciwnym razie po prostu zamień cp1252 na odpowiedni alfabet, którego potrzebujesz. Możesz zobaczyć wszystkie obsługiwane znaki tutaj: http://en.wikipedia.org/wiki/Windows-1252
Widziałem rozwiązanie tutaj: http://fudforum.org/forum/index.php?t=msg&goto=167345 Proszę użyć mojego przykładowego kodu powyżej, ponieważ oryginalny autor zapomniał wstawić myślnik między utf a 8.
Mam nadzieję, że powyższe było pomocne.
Daan
Najpierw musisz wygenerować czcionkę. Należy użyć MakeFont
narzędzia zawartego w pakiecie FPDF. Użyłem w Linuksie tego nieco rozszerzonego skryptu z wersji demonstracyjnej:
<?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');
}
?>
Następnie skopiowałem wygenerowane pliki do font
katalogu mojej sieci i użyłem tego:
$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Buňka jedna'),1);
(Pracowałem na stole). To działało w moim języku ( Buňka jedna to czes. Cell one ). Język czeski należy do języków środkowoeuropejskich, również ISO-8859-2. Niestety, użytkownik FPDF jest zmuszony do utraty zalet kodowania UTF-8. Nie możesz tego dostać w swoim pliku PDF:
Městečko Fruens Bøge
Duńska litera ø
staje się ř
ISO-8859-2.
Sugestia rozwiązania: Musisz zdobyć czcionkę grecką, wygenerować czcionkę za pomocą odpowiedniego kodowania (ISO-8859-7) i używać iconv
tego samego kodowania docelowego, z którym została wygenerowana czcionka.
Istnieje rozszerzenie FPDF o nazwie mPDF, które zezwala na czcionki Unicode.
Ta odpowiedź nie zadziałała dla mnie, musiałem również uruchomić dekodowanie html na łańcuchu. Widzieć
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
Rekwizyty trafiają do emfi z html_entity_decode w FPDF (przy użyciu rozszerzenia tFPDF)
Żadne z powyższych rozwiązań nie zadziała.
Spróbuj tego:
function filter_html($value){
$value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
return $value;
}
Możesz utworzyć klasę rozszerzającą FPDF i dodać to:
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);
}
}
Chciałem odpowiedzieć na to pytanie każdemu, kto nie przeszedł na TFPDF z jakiegokolwiek powodu (integracja frameworka itp.)
Idź do: http://www.fpdf.org/makefont/index.php
Użyj .ttf
kompatybilnej czcionki dla języka, którego chcesz używać. Upewnij się, że wybrałeś numer kodowania odpowiedni dla Twojego języka. Pobierz pliki i wklej je do bieżącego katalogu czcionek FPDF.
Użyj tego, aby aktywować nową czcionkę: $pdf->AddFont($font_name,'','Your_Font_Here.php');
Wtedy możesz $pdf->SetFont
normalnie używać .
Na samej czcionce użyj iconv, aby przekonwertować na UTF-8. Więc jeśli na przykład używasz hebrajskiego, zrobisz to iconv('UTF-8', 'windows-1255', $first_name)
.
Zastąp numer kodowania systemu Windows kodowaniem swojego języka.
W przypadku strony od prawej do lewej szybką naprawą jest zrobienie czegoś takiego strrev(iconv('UTF-8', 'windows-1255', $first_name))
.
po prostu wyedytuj komórkę funkcji w pliku fpdf.php, poszukaj linii, która wygląda następująco
function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{
po znalezieniu linii
napisz po {
,
$txt = utf8_decode($txt);
zapisz plik i gotowe, akcenty i kodowanie utf8 będą działać :)
Jak utworzyć pliki PDF w FPDF, które obsługują język chiński, japoński, rosyjski itp.?
(migawki używanego kodu poniżej)
Chciałbym podać: podsumowanie problemu, rozwiązanie, projekt github z działającym kodem oraz przykład online z oczekiwanym, wynikowym plikiem PDF.
Problem :
W rzeczywistości potrzebujesz czcionki, która obsługuje używane znaki UTF-8.
IE, samo używanie Helvetica i próba wyświetlenia japońskiego nie zadziała. Jeśli używasz Font Forge lub innego narzędzia do obsługi czcionek, możesz przewinąć do chińskich znaków czcionki i sprawdzić, czy są puste.
Google ma czcionkę (czcionkę Noto ), która zawiera wszystkie języki i jest to 20 MB, co zwykle stanowi kilka czynników wielkości tekstu. Możesz więc zobaczyć, dlaczego wiele czcionek po prostu nie obejmuje wszystkich języków.
Rozwiązanie :
Używam pakietów czcionek rounded-mgenplus-20140828.ttf i ZCOOL_QingKe_HuangYou.ttf dla języka japońskiego i chińskiego, które są open source i można je znaleźć w wielu projektach open source. W samym tFPDF lub nowej jego klasie dziedziczącej, na przykład class HTMLtoPDF extends tFPDF {...}
, zrobisz to ...
$this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
$this->SetFont('japanese', '', 14);
$this->Write(14, '日本語');
Nie powinno być nic więcej!
Pakiet kodu na GitHub:
https://github.com/HoldOffHunger/php-html-to-pdf
Działa, Demo online języka japońskiego:
Dla potomstwa.
Jak udało mi się dodać język rosyjski do fpdf na moim komputerze z systemem Linux:
1) Przejdź do http://www.fpdf.org/makefont/ i przekonwertuj swoją czcionkę ttf (na przykład AerialRegular.ttf) do 2 plików przy użyciu kodowania ISO-8859-5 : AerialRegular.php i AerialRegular.z
2) Umieść te 2 pliki w fpdf / font katalogu
3) Użyj go w swoim kodzie:
$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);
Zamiast tego rozwiązania iconv:
$str = iconv('UTF-8', 'windows-1252', $str);
Możesz użyć następujących:
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
Zobacz: Jak przekonwertować znaki Windows-1252 na wartości w php?
Istnieje rozszerzenie FPDF o nazwie UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/
Ale, imho, lepiej jest używać mpdf, jeśli możesz zmienić klasę.
Używam FPDF dla ASP, a funkcja iconv nie jest dostępna. Wydaje się to dziwne, ponieważ rozwiązałem problem UTF-8, dodając fałszywy obraz (jpeg 1x1px) do pliku PDF, zaraz po funkcji AddPage ():
pdf.Image "images/fpdf.jpg",0,0,1
W ten sposób znaki akcentowane są poprawnie dodawane do mojego pliku PDF, nie pytaj mnie dlaczego, ale to działa.
Nie jestem pewien, czy to wystarczy dla greckiego, ale miałem ten sam problem ze znakami brazylijskiego portugalskiego i moim rozwiązaniem było użycie encji html. Miałem w zasadzie dwa przypadki:
W tym celu najpierw zakodowałem go do jednostek html, htmlentities()
a następnie zdekodowałem do iso-8859-1
. Przykład:
$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
W tym celu po prostu htmlentities()
zawołałem. Przykład:
$s = html_entity_decode("Treasurer/Trésorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
Następnie przeszedłem $s
do FPDF, jak w tym przykładzie:
$pdf->Cell(100, 20, $s, 0, 0, 'L');
Uwaga: ENT_COMPAT | ENT_HTML401
to standardowa wartość parametru nr 2, jak w http://php.net/manual/en/function.html-entity-decode.php
Mam nadzieję, że to pomoże.
Wiem, że to stare pytanie, ale myślę, że moja odpowiedź pomogłaby tym, którzy nie znaleźli rozwiązania w innych odpowiedziach. Mój problem polegał na tym, że nie mogłem wyświetlić chorwackich znaków w moim pliku PDF. Po pierwsze, użyłem FPDF, ale myślę, że nie obsługuje Unicode. Wreszcie, tym, co rozwiązało mój problem, jest tFPDF, czyli wersja FPDF obsługująca Unicode. Oto przykład, który zadziałał dla mnie:
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();