У меня странная и противоречивая проблема с PhantomJs. Я застрял в этом со вчерашнего дня, и я не могу думать прямо сейчас!
Я искал, написал код, но пока что по сути не получилось …
Немного контекста:
Как создаются отчеты:
Где проблема?
Текст в сгенерированных отчетах пустой, если на упрощенном китайском. Но это влияет только на китайские иероглифы, а не цифры. Вот образец PDF того, что я пытаюсь описать.
Я мог убедиться, что отчеты для других доступных языков работали хорошо (английский, французский, немецкий).
Что делает это противоречивым?
При попытке отладки я сбросил командную строку, сгенерированную PHP, и попробовал ее из моего приглашения SSH; и это сработало! Все символы были напечатаны, кроме китайских.
Как образец концепции, я пытался «печатать в PDF» внешние страницы через CLI, как случайные страницы википедии на упрощенном китайском, и все работало хорошо.
Кроме того, при проверке PDF-файла я вижу, что шрифт (-ы), встроенные в ошибочные отчеты, являются настройками сервера по умолчанию (семейство Nimbus Sans), которые не поддерживают упрощенный китайский.
Однако в «хороших» отчетах используются шрифты, поддерживающие упрощенный китайский (SimSun, который я установил у себя дома — например. ~/.fonts/
— и добавлен в fontconfig
кеш с fc-cache -vf
).
Что я пробовал
exec
/shell_exec
;@font-face
(в файле HTML, затем во внешнем файле CSS) с локальными файлами шрифтовЯ мог бы пропустить некоторые эксперименты, не стесняйтесь, чтобы я разработал! Я думаю, что нет готового решения, но я надеюсь, что смогу собрать хотя бы несколько новых идей по этому вопросу.
Изменить: как выглядит командная строка:
Как написано выше, PHP генерирует командную строку PhantomJS и выполняет ее; он всегда использует абсолютные пути. Когда я тестирую преобразование PDF из приглашения SSH, оно всегда основывается на результатах PHP.
/home/lucio/my/app/path/Printer/PhantomJs/bin/phantomjs --ignore-ssl-errors=true --load-images=true --local-to-remote-url-access=true --web-security=false --ssl-protocol=tlsv1 --output-encoding=utf8 /home/lucio/my/app/path/Printer/PhantomJs/bin/generate-pdf.js /home/lucio/my/app/path/storage/tmp/1426973396.html /home/lucio/my/app/path/storage/tmp/1426973396.pdf
Несоответствие предполагает, что это проблема пути.
Убедитесь, что вы используете одну и ту же версию phantomjs, если у вас установлено несколько версий. Вы можете использовать абсолютные пути для этого или проверить which phantomjs
из командной строки и Laravel.
Убедитесь, что вы используете один и тот же путь в обоих. Вы можете получить полный путь, используя echo $PATH
в командной строке. Затем вы должны скопировать этот путь и добавить его к своей команде в Laravel: export PATH=<copied path>; phantomjs ...
,
Итак, после игры с фантомами и некоторыми шрифтами CJK я исправил свою проблему. Тем не мение, это не полная победа, так как я понятия не имею, почему это исправлено и в чем проблема …
Вот список вещей, которые, кажется, одновременно помогли решить эту проблему:
@font-face
, Объявление шрифта напрямую вводится в представление внутри <style></style>
и после внешней таблицы стилей.@font-face
это Noto Sans CJK Упрощенный китайский, в формате OTF (любезно предоставлено Google). Шрифт не установленная на стороне сервера; это доступно только с другими активами.<base>
тег в <head>
В разделе приводится базовый URL-адрес всех активов вызова.Например.
<!-- Directly after <head>: -->
<base href="https://lucio.domain.info">
<!-- other meta declarations & co -->
{{ HTML::style('/assets/css/reportcards/chinese.css') }}
<style>
@font-face {
font-family:"NotoSans";
src: url('/assets/fonts/Source_han_sans/NotoSansCJKsc-Regular.otf') format('opentype');
font-style: normal;
font-weight:300;
}
</style>
У меня была похожая проблема в Ubuntu 16.04, и я решил ее, установив Noto как пакет
sudo apt-get install fonts-noto