I'm writing a PDF exporter for a Slovak web page. My DB is UTF-8 encoding.
Some characters from the DB are converted correctly, some are not, here is the example:
input from DB: ôňúäéíáýážťčššľĽŠČĎŽŇÁÍÚĹŤÉŽŹÝ
output in PDF: ônúäéíáýážtcššlLŠCDŽNÁÍÚLTÉŽ´ZÝ
font used: Helvetica
Basic code for PDF write:
$pdf = new Fpdi('P', 'mm', 'A4');
...
$pdf->SetX(14);
$pdf->write(40, iconv('UTF-8', 'windows-1252//TRANSLIT//IGNORE', $invoiceDetails->getCompanyName()));
...
// return output for preview
return $pdf->Output('I');
I've tried at least 10 encodings but none of them was able to give me all characters.
Thank you for your help.
The standard fonts in FPDF only support cp1252 (aka windows-1252) encoding. So changing the encoding of your text to any other encoding doesn't change a thing.
You should prepare a special font with an ISO-8859-2 encoding and convert your text to this encoding before passing it to the methods of FPDF. The whole font generation process is described here.
Related
I am trying to export to PDF using FPDF and TCPDF php library. I found that the emojis like 😁 😀 💃🏻 ❤️ 🥳 where not converted. Only ️️some rectangle box there in generated pdf. I also tried tfpdf.
$text = "There is my text 😁 , 😀 and emojis 💃🏻 ❤️ 🥳";
require('tfpdf/tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
//Add a Unicode font (uses UTF-8)
$pdf->AddFont('Segoe UI Symbol','','seguisym.ttf',true); // DejaVuSans.ttf
$pdf->SetFont('Segoe UI Symbol','',12);
$pdf->Write(8,$text);
$pdf->Output();
I also tried different font. But didn't work for me. Can any one help me in this regard?
Sadly fPDF, TCPDF nor tFPDF can't print those characters. Issue is, these characters are not part of BMP, they are expressed with surrogate pairs, meaning they behave like multiple characters in UTF-16 (because of that one emoticon is printed as 2 rectangle boxes, not one) and also they have codepoint above 65535. However all mentioned PDF libraries relies on codepoint index being <= 65535 as well as TFontFile class reading TTF files.
You would also need to add TTF file having complete set of Unicode charset, or at least emoticons. Most fonts does not have it. This brings another issue for PDF library, which would probably need to have support for fallback font, which will be used when codepoint is not found in main font (for example you want to print text in Gotham, but since that does not include emoji, use other font for them). Btw for example emoji font "Noto Color Emoji" has 23 MB TTF file. So it gets big easily.
Anyway, all of the above can be added to PDF libraries, but it will require some effort. I am planning to do it for my needs as well sometimes. I think it will take roughly 1 man day.
Alternativelly, you might try something more robust like mPDF, but that library is huge, slow and require complete rewrite of your fPDF code. Also can't guarantee it can print emojis as well.
I have an bosnian string $string = "Saglasno odredbama čl.19 Zakona o udruženjima i Statuta Udruženja računovođa i knjigovođa Srbije URIKS iz Beograda, ul."
I used "Write" function of fpdf http://www.fpdf.org/ but all "č" characters become to "è"
$pdf->Write (6, iconv('UTF-8', 'CP1250//TRANSLIT', "Saglasno odredbama čl.19 Zakona o udruženjima i Statuta Udruženja računovođa i knjigovođa Srbije URIKS iz Beograda, ul."));
How can I fix it? thank so much!
Something like this should work:
require_once 'fpdf181\fpdf.php';
require_once 'fpdf181\makefont\makefont.php';
MakeFont('C:\\Windows\\Fonts\\arial.ttf','cp1252');
$pdf = new FPDF();
$pdf->AddFont('Arial','','Arial.php');
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Write(6,'Saglasno odredbama čl.19 Zakona o udruženjima i Statuta Udruženja računovođa i knjigovođa Srbije URIKS iz Beograda, ul.');
$pdf->Output();
Try to change the encoding to cp1250 or ISO-8859-2.
Source: http://www.fpdf.org/en/tutorial/tuto7.htm
If all this should fail then try to use UTF-8: http://www.fpdf.org/en/script/script92.php
Personally I would not use UTF-8 in my PDFs because the file size will big for me. I use font embedding in this case to avoid a big file size.
The FPDF class can produce documents in many languages other than the Western European ones: Central European, Cyrillic, Greek, Baltic and Thai, provided you own TrueType or Type1 fonts with the desired character set. UTF-8 support is also available.
For the UTF-8 support you have to use tFPDF which is based on FPDF. tFPDF accepts UTF-8 encoded text. Please read all this instructions and then download the ZIP file on the bottom from this site.
Convertation to UTF-8:
You do not need a convertation to UTF-8 if you use instructions above (from link) and load a UTF-8 string from a file like follows:
// this file file must be saved in UTF-8 before:
$str = file_get_contents('Text-saved-in-UTF-8.txt');
In other case:
You have to use mb_convert_encoding and not iconv. For Bosnian (Latin) this is 'iso-8859-2'.
In yor case for:
$mystring = "Saglasno odredbama čl.19 Zakona o udruženjima i Statuta Udruženja računovođa i knjigovođa Srbije URIKS iz Beograda, ul.";
You have to write:
$str = mb_convert_encoding($mystring, 'UTF-8', 'iso-8859-2');
Your PHP file must be saved in iso-8859-2 before (but not in UTF-8).
And then you use this in tFPDF.
Related answer from me: Serbian characters in FPDF
I make a PDF file from PHP.
I use FPDF library. I don't have polish letters in result PDF.
This is my code:
$pdf = new FPDF();
$pdf->AddPage();
$pdf->AddFont('helvetica','',TEMPLATEPATH.'/fonts/helvetica.php');
$pdf->SetFont('helvetica','');
$text = 'WITAJ ŻÓŁĘDZIU';
$pdf->Write(5,$text);
I use this code (I tried to use iconv but it didn't work). My result is:
"Witaj ¿ó³êdziu". What should I do?
Does your PHP script uses UTF-8 ?
FPDF does not natively handle UTF-8, that may explains why you get weird characters.
You can use TCPDF (http://www.tcpdf.org) which handles perfectly UTF-8.
The migration from FPDF to TCPDF is quite easy since it uses the same methods (same methods names, same arguments) as FPDF.
Have you tried UTF-8 encoding $text?
Set your second last line of code to:
$text = utf8_encode('WITAJ ŻÓŁĘDZIU');
I have a problem with lithuanian letters like ąčęėįšųūž. For that reason I use tfpdf and font DejaVu. When I get content from txt file, everything is fine but I give content just simply, then I get "????". Header charset is set utf-8.
ob_start();
require('../fpd/tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
// Add a Unicode font (uses UTF-8)
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
$pdf->SetFont('DejaVu','',10);
// Load a UTF-8 string from a file and print it
$txt = file_get_contents('../fpd/HelloWorld.txt');
$pdf->Write(8,$txt);
$pdf->Ln(10);
$txt1 = "ąčęėįšųž";
$pdf->Write(8,$txt1);
$pdf->Output('filename1.pdf', 'I');
ob_end_flush();
You do not need to set the header to UTF-8 but your editor have to be configured to use UTF-8. To verify that this is the issue, open the PHP file in e.g. Notepad++, click on "Encoding" and check the current encoding. You may convert it to UTF-8 (without BOM!!) in the same step and try again.
I'm generating some order confirmations using FPDF library, which works great. But now I need some Chinese characters in the document. I have searching for many hours by now and have found no workable solution. Is it possible supporting Chinese characters using FPDF or is there an alternative to FPDF which will support it?
All the characters are mixed with regular text and are stored in a MySQL database. The PDF document only show unicode when printing the Chinese characters.
There exist Chinese encoding formats like Big5 or GBK. However, more likely than not, the text you are trying to input is in Unicode. There exists tFPDF, which provides Unicode support. I will test printing the following traditional hanzi: 中國. This means China, for those reading who do not know.
// Remember to copy msjh.ttf to [path to tFPDF]/font/unifont/ directory
// Initialize tFPDF
require('tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
// Add a Unicode font like MSJH
$pdf->AddFont('MSJH','','msjh.ttf',true);
$pdf->SetFont('MSJH','',42);
// Output Chinese string to PDF
$pdf->Text(12,42,"中國");
// Output PDF document
$pdf->Output();
Another alternative is the Code200365k TTF
$pdf->AddFont('Code200365k','','Code200365k.ttf',true);
I use it for Chinese characters only as follows:
if (preg_match("/[\x{4e00}-\x{9fa5}]+/u", $my_value)){
$pdf->SetFont('Code200365k','',12);
}
$pdf->Cell(130,9,$my_value,1,1,'L');
$pdf->SetFont('Arial','',11);