2015-03-21 1 views
1

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

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

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

Как генерируются отчеты:

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

В чем проблема?

Текст в сгенерированных отчетах пуст, если используется упрощенный китайский. Но это влияет только на китайские символы, а не на цифры. Here is a PDF sample of what I'm trying to describe.

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

Что делает это непоследовательным?

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

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

То, что я пытался

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

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

Edit: Что командная строка выглядит следующим образом:

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

Как [phantomjs отсутствует скриншот шрифта, коробки оказываемых вместо] (http://stackoverflow.com/questions/15029002/phantomjs-screenshot-font-missing- box-rendered-вместо) или [Phantomjs отображает черные ящики на сайтах Azure] (http://stackoverflow.com/questions/22965791/phantomjs-renders-black-boxes-on-azure-websites)? –

+0

Спасибо за ссылки. Я уже прочитал их, пытаясь исправить мою проблему, и это не помогло. В конце концов, китайского текста просто нет ... – lucio

ответ

0

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

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

  • Я дал еще один выстрел @font-face. Объявление шрифта непосредственно вводится в представление, внутри <style></style>, и после внешней таблицы стилей.
  • Шрифт, импортированный с @font-face, является Noto Sans CJK. Упрощенный китайский, в формате OTF (любезно provided by google). Шрифт не установлен на стороне сервера; он доступен только для других активов.
  • Тег <base> в разделе <head> содержит базовый URL-адрес всех вызовов активов.
  • Не удаляйте статические файлы просмотра html (по какой-либо очевидной причине я боялся, что возник конфликт с одновременным доступом между загрузкой файла html view и 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

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

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

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

+0

Еще раз спасибо за предложение. Я попытаюсь потрогать путь, но tbh, я немного сомневаюсь в этом, потому что для всех моих тестов я всегда использую абсолютные пути (например, '/ 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/приложение/путь/хранение/TMP/1426973396.pdf') – lucio

0

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

sudo apt-get install fonts-noto 
Смежные вопросы