wkhtmltopdf — проблема с кодировкой

Я использую wkhtmltopdf для экспорта html-страниц в pdf, но, похоже, у него проблема с чешскими символами... Я загружаю весь html в переменную, затем меняю кодировку и запускаю wkhtmltopdf следующим образом:

$html = ob_get_clean();
$html = iconv("UTF-8","Windows-1250", $html);
file_put_contents('../export.php', $html);

$commandString = WKHTML_LIB.'http://www.estiroad.com/export.php sestava.pdf';
exec($commandString);

Файл .html имеет правильную кодировку, но даже когда я устанавливаю параметр --encoding windows-1250 в командную строку, он просто не работает... Спасибо за любые идеи...

РЕДАКТИРОВАТЬ: Я решил проблему! Загвоздка была в константе WKHTML_LIB, которую я определил в начале страницы:

define('WKHTML_LIB', "../wkhtmltopdf/wkhtmltopdf-amd64");

Я просто написал путь непосредственно к exec(); команда, и теперь она работает даже с флагами. Извините, что побеспокоил вас такой мелочью... Теперь строка $commandString выглядит так:

$commandString = '"../wkhtmltopdf/wkhtmltopdf-amd64" --print-media-type --page-size A4 -R     50 --encoding windows-1250 --header-html header.html --margin-top 10mm --margin-bottom 10mm --margin-left 10mm --margin-right 10mm http://www.estiroad.com/export.php sestava.pdf';

person Michal S    schedule 08.08.2012    source источник
comment
Должен ли быть пробел перед http? WKHTML_LIB.' http:/   -  person Cups    schedule 08.08.2012
comment
Не должен, но не влияет, есть он или нет.. Команда выполняется без проблем, pdf сгенерировался, но неправильно закодирован.... Например, вместо ř стоит ø...   -  person Michal S    schedule 08.08.2012
comment
Если вы решили проблему, сделайте ее фактическим ответом. Не добавляйте [решено] к заголовку.   -  person Bart    schedule 31.08.2012


Ответы (4)


Для дальнейшего использования:

У меня была такая же проблема с немецкими умляутами.

Как только я добавил

<meta charset="UTF-8" />

на html-страницу проблема была решена.

Это, конечно, предполагает, что ваша страница обслуживается как utf-8.

person Marcel Burkhard    schedule 27.06.2014
comment
Так счастлив, что это первое, что я прочитал, решая свою проблему: D - person joevallender; 02.02.2018

Я решил проблему! Загвоздка была в константе WKHTML_LIB, которую я определил в начале страницы:

define('WKHTML_LIB', "../wkhtmltopdf/wkhtmltopdf-amd64");

Я просто написал путь непосредственно к exec(); команда, и теперь она работает даже с флагами. Извините, что побеспокоил вас такой мелочью... Теперь строка $commandString выглядит так:

$commandString = '"../wkhtmltopdf/wkhtmltopdf-amd64" --print-media-type --page-size A4 -R     50 --encoding windows-1250 --header-html header.html --margin-top 10mm --margin-bottom 10mm --margin-left 10mm --margin-right 10mm http://www.estiroad.com/export.php sestava.pdf';
person Michal S    schedule 04.09.2012
comment
Возможно, в исходном решении отсутствовали кавычки внутри кавычек, поэтому они появляются при вставке в командную строку. Например, «какой-то путь с пробелами и прочим». - person userfuser; 30.04.2014

Раньше у меня была похожая проблема с wkhtmltopdf, когда китайские иероглифы не отображались должным образом. Я решил проблему, установив соответствующие китайские шрифты.

Вам не нужно устанавливать какие-либо чешские шрифты, чтобы символы отображались правильно? Поскольку я не знаком с чешскими иероглифами/шрифтами, я не уверен, применимо ли это. Надеюсь это поможет.

person Leon Chung    schedule 08.08.2012
comment
Я думаю, что это не поможет... Почти каждый шрифт, который я установил, поддерживает чешские символы, и, кроме того, это не решит проблему, если удаленный пользователь захочет отобразить pdf... :/ - person Michal S; 08.08.2012
comment
Кстати: специальные чешские символы: ť, ď, ň, ó, ě, š, č, ř, ž, ý, á, í, é, ú, ů. - person Michal S; 08.08.2012
comment
Есть ли причина, по которой вам нужно было преобразовать кодировку из UTF-8 в Windows-1250? Кроме того, возможно, попробуйте использовать iconv с //IGNORE, добавленным к параметру out_charset. Возможно, также попробуйте mb_convert_encoding. - person Leon Chung; 08.08.2012
comment
Когда я оставляю его в UTF-8, он также показывает неправильные символы. Win1250 - единственная кодировка, которая показала мне html-страницу в правильных символах. - person Michal S; 08.08.2012
comment
Я считаю, что //TRANSLIT больше подходит для моего комментария выше. Но поскольку он правильно отображается в вашем браузере, я думаю, это не проблема с кодировкой. - person Leon Chung; 08.08.2012
comment
К сожалению, IGNORE и TRANSLIT, похоже, не действуют :( - person Michal S; 08.08.2012

Только что я сделал тест с этими персонажами, которые вы предоставили, и они отлично работают для меня. Win7, wkhtmltopdf 0.11.0 rc2. Работает с обложкой, оглавлением, закладками, контентом и заголовками. Также протестировано с корейскими и китайскими иероглифами, и даже они работают.

PDF Создан с использованием (расположение файлов удалено) --print-media-type --page-size A5 --header-html header.html --footer-html footer.html --margin-bottom 10mm --margin-top 10mm --margin-left 10mm --margin-right 10mm cover cover.html toc --xsl-style-sheet tocfile.xsl temp.html temp.pdf

temp.html является крайне недопустимым XHTML, первая строка говорит <?xml version="1.0" encoding="iso-8859-1"?>. Файл temp.html был записан на диск с помощью C# с использованием UTF-8, и он работает. Я действительно предлагаю использовать UTF-8 везде, где это возможно.

Снимок экрана сгенерированного PDF

person Joel Peltonen    schedule 08.08.2012
comment
Я попробовал вашу команду, но она просто не сработает :(( Это похоже на то, что добавленные параметры были проигнорированы... даже если я изменю, например, значение margin-top, это не повлияет. - person Michal S; 08.08.2012
comment
Хм, я только что проверил еще раз и изменил поле с 10 мм до 20 мм, и это сработало. Не могли бы вы где-нибудь опубликовать содержимое $commandString и свой исходный HTML, чтобы я мог протестировать именно ваши материалы? Одна вещь, которую можно попробовать, — это использовать wkhtmltopdf напрямую, а не из php. Если вы можете дать источник и точную команду, я попытаюсь воспроизвести проблему здесь. - person Joel Peltonen; 08.08.2012
comment
Теперь я попытался запустить его напрямую, и флаги работают, даже работает кодировка ... Любая идея, как я могу заставить его работать с PHP? Я не могу запустить его напрямую, потому что мне нужно, чтобы каждый пользователь мог генерировать pdf одним щелчком мыши, а не загружать wkhtml... - person Michal S; 08.08.2012
comment
Я давно не занимался PHP, поэтому на данный момент у меня нет сервера разработки для PHP (в основном я занимаюсь C#), но я могу проверить позже, когда у меня будет время, но, по крайней мере, проблема с кодировкой работает :) Есть аналогичные проблемы на SO, где люди пытаются получить wkhtmltopdf, которые вы, возможно, захотите проверить. Кажется, заставить PHP+wkhtmltopdf работать сложно, поэтому, если у меня будет время, я могу попытаться выяснить, смогу ли я это сделать. - person Joel Peltonen; 08.08.2012
comment
Хорошо, я буду с нетерпением ждать этого :) Действительно, с тех пор, как я использую эту программу, нет ни одного шага, где бы я не столкнулся с какой-либо проблемой :( - person Michal S; 08.08.2012