Phantomjs не согласуется в зависимости от того, как это называется

У меня странная и противоречивая проблема с PhantomJs. Я застрял в этом со вчерашнего дня, и я не могу думать прямо сейчас!
Я искал, написал код, но пока что по сути не получилось …

Немного контекста:

  • Приложение, над которым я работаю (с Laravel 4), должно генерировать отчеты в формате PDF. Эти отчеты конвертируются с помощью PhantomJS. До сих пор все работало как задумано.
  • Меня попросили добавить новую языковую поддержку для этого приложения: упрощенный китайский. Все хорошо в браузере.
  • Однако PhantomJS не может генерировать PDF с поддержкой китайского языка.

Как создаются отчеты:

  • Генерация PDF запускается методом контроллера (Laravel).
  • Полное представление (Laravel) сохраняется в виде временного HTML-файла (т.е. PhantomJs будет в основном печатать в PDF локальный файл в этом случае).
  • PHP помогает мне генерировать командную строку PhantomJS и выполняет ее.
  • Ответ контроллера (Laravel) получает PDF-файл и загружает его.

Где проблема?

Текст в сгенерированных отчетах пустой, если на упрощенном китайском. Но это влияет только на китайские иероглифы, а не цифры. Вот образец PDF того, что я пытаюсь описать.

Я мог убедиться, что отчеты для других доступных языков работали хорошо (английский, французский, немецкий).

Что делает это противоречивым?

При попытке отладки я сбросил командную строку, сгенерированную PHP, и попробовал ее из моего приглашения SSH; и это сработало! Все символы были напечатаны, кроме китайских.
Как образец концепции, я пытался «печатать в PDF» внешние страницы через CLI, как случайные страницы википедии на упрощенном китайском, и все работало хорошо.

Кроме того, при проверке PDF-файла я вижу, что шрифт (-ы), встроенные в ошибочные отчеты, являются настройками сервера по умолчанию (семейство Nimbus Sans), которые не поддерживают упрощенный китайский.
Однако в «хороших» отчетах используются шрифты, поддерживающие упрощенный китайский (SimSun, который я установил у себя дома — например. ~/.fonts/ — и добавлен в fontconfig кеш с fc-cache -vf).

Что я пробовал

  • Установите шрифты CJK (см. Выше) на сервере (SimSun, arphic-uming, Source Han Sans, …);
  • оригинальный код PHP использовал пакет Symfony Process, я также пытался кодировать 10-строчные exec/shell_exec ;
  • использование @font-face (в файле HTML, затем во внешнем файле CSS) с локальными файлами шрифтов
  • … поиск с помощью трекера и списка рассылки PhantomJS, Google …

Я мог бы пропустить некоторые эксперименты, не стесняйтесь, чтобы я разработал! Я думаю, что нет готового решения, но я надеюсь, что смогу собрать хотя бы несколько новых идей по этому вопросу.

Изменить: как выглядит командная строка:

Как написано выше, 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

1

Решение

Несоответствие предполагает, что это проблема пути.

  1. Убедитесь, что вы используете одну и ту же версию phantomjs, если у вас установлено несколько версий. Вы можете использовать абсолютные пути для этого или проверить which phantomjs из командной строки и Laravel.

  2. Убедитесь, что вы используете один и тот же путь в обоих. Вы можете получить полный путь, используя echo $PATH в командной строке. Затем вы должны скопировать этот путь и добавить его к своей команде в Laravel: export PATH=<copied path>; phantomjs ...,

0

Другие решения

Итак, после игры с фантомами и некоторыми шрифтами CJK я исправил свою проблему. Тем не мение, это не полная победа, так как я понятия не имею, почему это исправлено и в чем проблема …

Вот список вещей, которые, кажется, одновременно помогли решить эту проблему:

  • Я дал еще один шанс @font-face, Объявление шрифта напрямую вводится в представление внутри <style></style>и после внешней таблицы стилей.
  • Шрифт, импортированный с @font-face это Noto Sans CJK Упрощенный китайский, в формате OTF (любезно предоставлено Google). Шрифт не установленная на стороне сервера; это доступно только с другими активами.
  • <base> тег в <head> В разделе приводится базовый URL-адрес всех активов вызова.
  • Не удаляйте файлы статического представления в формате html (По понятным причинам я боялся, что возник конфликт с одновременным доступом между загрузкой файла представления в формате html и PhantomJS, генерирующим PDF …).

Например.

<!-- 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>
0

У меня была похожая проблема в Ubuntu 16.04, и я решил ее, установив Noto как пакет

sudo apt-get install fonts-noto
0
По вопросам рекламы [email protected]