Специальные символы в FPDF с PHP

У меня есть веб-форма, которую могут заполнять пользователи, и этот контент заполняет PDF с помощью FPDF и PHP. Когда пользователь вводит слово с апострофом, перед ним в PDF-файле появляется косая черта.

Точно так же специальные символы, такие как символы товарных знаков, кодируются неправильно.

В часто задаваемых вопросах FPDF говорится об использовании:

$str = utf8_decode($str);

Но я просто не уверен, как применить это ко всему PDF. Я пытаюсь думать об этом, как если бы это была HTML-страница, но это не помогает.

Любые идеи?


person Carson    schedule 18.08.2010    source источник


Ответы (9)


Выяснил это, выполнив следующие действия (pagesubtitle — это имя текстового поля в форме):

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

Затем распечатайте его:

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

Это позволит удалить любые нежелательные косые черты после апострофов, а также использовать функцию iconv для печати специальных символов, таких как ™

person Carson    schedule 25.08.2010

Все вышеперечисленное не сработало для меня, но я заставил это работать.

Мне удалось сделать это «варварским способом», просто переведя каждый странный символ в его значение URL. Затем просто расшифруйте URL-адрес и вуаля!

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;
}

И, конечно же, я вызываю функцию

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

Вывод:

Диас, Мирколес, Сабадо, Мирколес

person Oscar Bout    schedule 02.11.2012
comment
Вы можете указать массивы str_replace в качестве параметров. - person ; 19.01.2015
comment
Я понимаю, что в любом случае это массовый взлом, но может быть чище, по крайней мере, до return urldecode($word); в конце вашей функции em. В любом случае, это сработало, когда ничто другое не сработало, так что огромное спасибо! :) - person John; 18.04.2016
comment
круто, это работает :).. Также может быть полезно вернуть urldecode($word) в функцию em :).. Большое спасибо! - person Andrei Todorut; 22.06.2017
comment
Лучшее решение этой проблемы! - person Vipul Hadiya; 24.12.2017

ни одно из вышеперечисленных решений не сработало для меня, поэтому я решил проблему следующим образом:

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

Прежде чем пытаться использовать вышеуказанные строки, сделайте следующее:

Скопируйте из c:/Windows/Fonts/Arial.ttf в папку /tutorial FPDF.

Отредактируйте содержимое makefont.php

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

Выполнить makefont.php

Скопируйте следующие файлы в папку /font FPDF: arial.php arial.ttf arial.z

Наконец, определите «папку шрифтов». Откройте fpdf.php (основной файл библиотеки) и добавьте:

define('FPDF_FONTPATH','font');

У меня PDF работает со всеми специальными символами, я считаю, что проблема была в самом шрифте Arial, который изначально использует FPDF. Он должен работать и с другими шрифтами, если они поддерживают ваши символы. Удачи!

person tomazahlin    schedule 15.11.2013
comment
Я знаю, что это очень старо, но все же - большое спасибо! Кажется, это правильное решение этой проблемы. Я также создаю (или конвертирую) шрифт ttf для FPDF с cp1250, и теперь каждый символ отображается правильно. Хороший! - person beeef; 05.08.2020

Ни один из вышеперечисленных не решил мою проблему. Я решил это следующим образом:

setlocale(LC_CTYPE, 'en_US');

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

Надеюсь, вы будете полезны.

Ссылка: Ссылка

person alamincse07    schedule 03.06.2017
comment
Действительно, здорово. Это то, что я искал 3 часа. - person Vipul Hadiya; 24.12.2017

Ниже работает для меня (с использованием 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));

person Jaspal Saini    schedule 07.09.2018
comment
Добро пожаловать в СО! При предоставлении кода в качестве ответа полезно объяснить, как ваш код решает проблему ОП :) - person Joel; 07.09.2018

Этот класс представляет собой модифицированную версию FPDF, в которую добавлена ​​поддержка UTF-8. Более того, он встраивает только необходимые части шрифтов, которые используются в документе, что делает размер файла намного меньше, чем если бы были встроены целые шрифты. Эти функции изначально были разработаны для проекта mPDF.

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

person Pascalmh    schedule 17.10.2014

Я использовал это, так как $str = preg_replace('/[^A-Za-z0-9_-]/','', $str); для меня было достаточно, я удаляю не буквенно-цифровые символы

person Uriel Reina Abadía    schedule 24.09.2020

Это помогло мне: iconv(UTF-8, ISO-8859-1//TRANSLIT//IGNORE, your-text-var-here)

person jdisla    schedule 16.03.2021

Попробуйте эту простую функцию: utf8_encode($txt). Меня устраивает.

person Sergio Lopez Loya    schedule 31.05.2016