Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Special Characters in FPDF with PHP

I have a web form that users can fill out and that content fills up a PDF with FPDF and PHP. When a user enters a word with an apostrophe, a slash appears before it on the PDF.

Similarly, special characters like trademark symbols are encoded wrong.

The FPDF FAQs say to use:

$str = utf8_decode($str);

But I'm just not sure how to apply that to the whole PDF. I'm trying to think about it as if it was an HTML page but that isn't helping.

Any ideas?

like image 267
Carson Avatar asked Aug 18 '10 16:08

Carson


People also ask

What is use of FPDF in PHP?

FPDF is a PHP class which allows generating PDF files with PHP code. It is free to use and it does not require any API keys. FPDF stands for Free PDF. It means that any kind of modification can be done in PDF files.

What is FPDF error?

The FPDF Error Message will point you to the PHP Line that is sending some content. If you get no hint what File & Line send some content you probably have an encoding mismatch in your include / require Files.


9 Answers

Figured this out by doing the following (pagesubtitle is the name of the text field in the form):

$reportSubtitle = stripslashes($_POST['pagesubtitle']);
$reportSubtitle = iconv('UTF-8', 'windows-1252', $reportSubtitle);

Then print it out:

$pdf->Write (6, $reportSubtitle);

This will remove any unwanted slashes following apostrophes, as well as use the 'iconv' function to print special characters such as ™

like image 188
Carson Avatar answered Sep 29 '22 16:09

Carson


All of the above did not work for me, but I did get it to work.

I managed to do it "the barbarian way" by just translating every weird character to its url value. Then simply decode the url and voila!

function em($word) {

    $word = str_replace("@","%40",$word);
    $word = str_replace("`","%60",$word);
    $word = str_replace("¢","%A2",$word);
    $word = str_replace("£","%A3",$word);
    $word = str_replace("¥","%A5",$word);
    $word = str_replace("|","%A6",$word);
    $word = str_replace("«","%AB",$word);
    $word = str_replace("¬","%AC",$word);
    $word = str_replace("¯","%AD",$word);
    $word = str_replace("º","%B0",$word);
    $word = str_replace("±","%B1",$word);
    $word = str_replace("ª","%B2",$word);
    $word = str_replace("µ","%B5",$word);
    $word = str_replace("»","%BB",$word);
    $word = str_replace("¼","%BC",$word);
    $word = str_replace("½","%BD",$word);
    $word = str_replace("¿","%BF",$word);
    $word = str_replace("À","%C0",$word);
    $word = str_replace("Á","%C1",$word);
    $word = str_replace("Â","%C2",$word);
    $word = str_replace("Ã","%C3",$word);
    $word = str_replace("Ä","%C4",$word);
    $word = str_replace("Å","%C5",$word);
    $word = str_replace("Æ","%C6",$word);
    $word = str_replace("Ç","%C7",$word);
    $word = str_replace("È","%C8",$word);
    $word = str_replace("É","%C9",$word);
    $word = str_replace("Ê","%CA",$word);
    $word = str_replace("Ë","%CB",$word);
    $word = str_replace("Ì","%CC",$word);
    $word = str_replace("Í","%CD",$word);
    $word = str_replace("Î","%CE",$word);
    $word = str_replace("Ï","%CF",$word);
    $word = str_replace("Ð","%D0",$word);
    $word = str_replace("Ñ","%D1",$word);
    $word = str_replace("Ò","%D2",$word);
    $word = str_replace("Ó","%D3",$word);
    $word = str_replace("Ô","%D4",$word);
    $word = str_replace("Õ","%D5",$word);
    $word = str_replace("Ö","%D6",$word);
    $word = str_replace("Ø","%D8",$word);
    $word = str_replace("Ù","%D9",$word);
    $word = str_replace("Ú","%DA",$word);
    $word = str_replace("Û","%DB",$word);
    $word = str_replace("Ü","%DC",$word);
    $word = str_replace("Ý","%DD",$word);
    $word = str_replace("Þ","%DE",$word);
    $word = str_replace("ß","%DF",$word);
    $word = str_replace("à","%E0",$word);
    $word = str_replace("á","%E1",$word);
    $word = str_replace("â","%E2",$word);
    $word = str_replace("ã","%E3",$word);
    $word = str_replace("ä","%E4",$word);
    $word = str_replace("å","%E5",$word);
    $word = str_replace("æ","%E6",$word);
    $word = str_replace("ç","%E7",$word);
    $word = str_replace("è","%E8",$word);
    $word = str_replace("é","%E9",$word);
    $word = str_replace("ê","%EA",$word);
    $word = str_replace("ë","%EB",$word);
    $word = str_replace("ì","%EC",$word);
    $word = str_replace("í","%ED",$word);
    $word = str_replace("î","%EE",$word);
    $word = str_replace("ï","%EF",$word);
    $word = str_replace("ð","%F0",$word);
    $word = str_replace("ñ","%F1",$word);
    $word = str_replace("ò","%F2",$word);
    $word = str_replace("ó","%F3",$word);
    $word = str_replace("ô","%F4",$word);
    $word = str_replace("õ","%F5",$word);
    $word = str_replace("ö","%F6",$word);
    $word = str_replace("÷","%F7",$word);
    $word = str_replace("ø","%F8",$word);
    $word = str_replace("ù","%F9",$word);
    $word = str_replace("ú","%FA",$word);
    $word = str_replace("û","%FB",$word);
    $word = str_replace("ü","%FC",$word);
    $word = str_replace("ý","%FD",$word);
    $word = str_replace("þ","%FE",$word);
    $word = str_replace("ÿ","%FF",$word);
    return $word;
}

And of course me calling the function

$weirdword = "Días, Miércoles, Sábado,miércoles"; //Some spanish days
$weirdword = em($weirdword);
$weirdword = urldecode($weirdword);
echo $weirdword;

Giving output:

Días, Miércoles, Sábado,miércoles

like image 32
Oscar Bout Avatar answered Sep 29 '22 16:09

Oscar Bout


None of above had solved my problem. I had solved it by the following way:

setlocale(LC_CTYPE, 'en_US');

$value = iconv('UTF-8', 'ASCII//TRANSLIT', $value);
$fpdf->Cell(140, 6, $value, 1);

Hope you will be helpful.

Reference: Link

like image 44
MH2K9 Avatar answered Sep 29 '22 16:09

MH2K9


none of above solutions worked for me, so I solved the problem like this:

$this->AddFont('Arial','','arial.php');
$this->SetFont('Arial','',12);
$this->Cell(0,5,iconv("UTF-8", "CP1250//TRANSLIT", $string),0,1,'L');

Before trying the above lines, do the following:

Copy from c:/Windows/Fonts/Arial.ttf to the /tutorial folder of FPDF.

Edit the content of makefont.php

require('../makefont/makefont.php');
MakeFont('arial.ttf','cp1250');

Execute makefont.php

Copy the following files to the /font folder of FPDF: arial.php arial.ttf arial.z

Finally, define the "font folder". Open fpdf.php (main library file) and add:

define('FPDF_FONTPATH','font');

The PDF works for me with all special characters, I believe it was the problem in the Arial font itself, which FPDF originally uses. It should work with other fonts aswell, if they support your characters. Good luck!

like image 24
tomazahlin Avatar answered Sep 27 '22 16:09

tomazahlin


Below works for me (Using FPDF):


function em_jaz($word) {
$word = str_replace('+', ' ', $word);
$word = str_replace("%C3%A9","%E9",$word);          /* é */
$word = str_replace("%C3%A8","%E8",$word);          /* è */
$word = str_replace("%C3%AE","%EE",$word);          /* î */
$word = str_replace("%26rsquo%3B","%27",$word);     /* ' */
$word = str_replace("%C3%89","%C9",$word);          /* É */
$word = str_replace("%C3%8A","%CA",$word);          /* Ê */ 
$word = str_replace("%C3%8B","%CB",$word);          /* Ë */
$word = str_replace("%C3%8C","%CC",$word);          /* Ì */
$word = str_replace("%C3%8D","%CD",$word);          /* Í */
$word = str_replace("%C3%8E","%CE",$word);          /* Î */
$word = str_replace("%C3%8F","%CF",$word);          /* Ï */
$word = str_replace("%C3%90","%D0",$word);          /* Ð */
$word = str_replace("%C3%91","%D1",$word);          /* Ñ */
$word = str_replace("%C3%92","%D2",$word);          /* Ò */
$word = str_replace("%C3%93","%D3",$word);          /* Ó */
$word = str_replace("%C3%94","%D4",$word);          /* Ô */
$word = str_replace("%C3%95","%D5",$word);          /* Õ */
$word = str_replace("%C3%96","%D6",$word);          /* Ö */
$word = str_replace("%C3%98","%D8",$word);          /* Ø */                 
$word = str_replace("%C3%99","%D9",$word);          /* Ù */
$word = str_replace("%C3%9A","%DA",$word);          /* Ú */
$word = str_replace("%C3%9B","%DB",$word);          /* Û */
$word = str_replace("%C3%9C","%DC",$word);          /* Ü */
$word = str_replace("%C3%9D","%DD",$word);          /* Ý */
$word = str_replace("%C3%9E","%DE",$word);          /* Þ */
$word = str_replace("%C3%9F","%DF",$word);          /* ß */
$word = str_replace("%C3%A0","%E0",$word);          /* à */
$word = str_replace("%C3%A1","%E1",$word);          /* á */
$word = str_replace("%C3%A2","%E2",$word);          /* â */
$word = str_replace("%C3%A3","%E3",$word);          /* ã */
$word = str_replace("%C3%A4","%E4",$word);          /* ä */
$word = str_replace("%C3%A5","%E5",$word);          /* å */
$word = str_replace("%C3%A6","%E6",$word);          /* æ */
$word = str_replace("%C3%A7","%E7",$word);          /* ç */
$word = str_replace("%C3%AA","%EA",$word);          /* ê */
$word = str_replace("%C3%AB","%EB",$word);          /* ë */
$word = str_replace("%C3%AC","%EC",$word);          /* ì */
$word = str_replace("%C3%AD","%ED",$word);          /* í */
$word = str_replace("%C3%AF","%EF",$word);          /* ï */
$word = str_replace("%C3%B0","%F0",$word);          /* ð */
$word = str_replace("%C3%B1","%F1",$word);          /* ñ */
$word = str_replace("%C3%B2","%F2",$word);          /* ò */
$word = str_replace("%C3%B3","%F3",$word);          /* ó */
$word = str_replace("%C3%B4","%F4",$word);          /* ô */
$word = str_replace("%C3%B5","%F5",$word);          /* õ */
$word = str_replace("%C3%B6","%F6",$word);          /* ö */
$word = str_replace("%C3%B7","%F7",$word);          /* ÷ */
$word = str_replace("%C3%B8","%F8",$word);          /* ø */
$word = str_replace("%C3%B9","%F9",$word);          /* ù */
$word = str_replace("%C3%BA","%FA",$word);          /* ú */
$word = str_replace("%C3%BB","%FB",$word);          /* û */
$word = str_replace("%C3%BC","%FC",$word);          /* ü */
$word = str_replace("%C3%BD","%FD",$word);          /* ý */
$word = str_replace("%C3%BE","%FE",$word);          /* þ */
$word = str_replace("%C3%BF","%FF",$word);          /* ÿ */ 
$word = str_replace("%40","%40",$word);             /* @ */
$word = str_replace("%60","%60",$word);             /* ` */
$word = str_replace("%C2%A2","%A2",$word);          /* ¢ */
$word = str_replace("%C2%A3","%A3",$word);          /* £ */
$word = str_replace("%C2%A5","%A5",$word);          /* ¥ */
$word = str_replace("%7C","%A6",$word);             /* | */
$word = str_replace("%C2%AB","%AB",$word);          /* « */
$word = str_replace("%C2%AC","%AC",$word);          /* ¬ */
$word = str_replace("%C2%AF","%AD",$word);          /* ¯ */
$word = str_replace("%C2%BA","%B0",$word);          /* º */
$word = str_replace("%C2%B1","%B1",$word);          /* ± */
$word = str_replace("%C2%AA","%B2",$word);          /* ª */
$word = str_replace("%C2%B5","%B5",$word);          /* µ */
$word = str_replace("%C2%BB","%BB",$word);          /* » */
$word = str_replace("%C2%BC","%BC",$word);          /* ¼ */
$word = str_replace("%C2%BD","%BD",$word);          /* ½ */
$word = str_replace("%C2%BF","%BF",$word);          /* ¿ */
$word = str_replace("%C3%80","%C0",$word);          /* À */
$word = str_replace("%C3%81","%C1",$word);          /* Á */
$word = str_replace("%C3%82","%C2",$word);          /* Â */
$word = str_replace("%C3%83","%C3",$word);          /* Ã */
$word = str_replace("%C3%84","%C4",$word);          /* Ä */
$word = str_replace("%C3%85","%C5",$word);          /* Å */
$word = str_replace("%C3%86","%C6",$word);          /* Æ */
$word = str_replace("%C3%87","%C7",$word);          /* Ç */
$word = str_replace("%C3%88","%C8",$word);          `/`* È */
return $word;
}

$content = urlencode($content);

$content = urldecode($pdf->em_jaz($content));

like image 36
Jaspal Saini Avatar answered Sep 28 '22 16:09

Jaspal Saini


This class is a modified version of FPDF that adds UTF-8 support. Moreover, it embeds only the necessary parts of the fonts that are used in the document, making the file size much smaller than if the whole fonts were embedded. These features were originally developed for the mPDF project.

http://fpdf.org/en/script/script92.php

like image 43
Pascalmh Avatar answered Sep 28 '22 16:09

Pascalmh


I have used this as $str = preg_replace('/[^A-Za-z0-9_-]/','', $str); for me has been enough, I eliminate the not alphanumerical characters

like image 40
Uriel Reina Abadía Avatar answered Sep 29 '22 16:09

Uriel Reina Abadía


This did it for me: iconv("UTF-8", "ISO-8859-1//TRANSLIT//IGNORE", your-text-var-here)

like image 21
jdisla Avatar answered Sep 29 '22 16:09

jdisla


Why not use the function PDF recommends?

$text = utf8_decode($text);

It works for me.

like image 30
Neil Bisby Avatar answered Sep 29 '22 16:09

Neil Bisby