Назад | Перейти на главную страницу

Серверная печать в PDF файла HTML в / tmp?

Я работаю над проектом, в котором нам нужна последовательная печать определенных страниц, и для этого созданы PDF-файлы. Покупатели также хотят иметь несколько локальных копий, так что это будет двукратным выигрышем. С печатью все становится очень опасно в том, где заканчиваются разрывы страниц и как на вещи влияют отступы.

Что я хочу сделать:

  1. Пользователь просматривает страницу
  2. Пользователь запрашивает PDF-файл
  3. PHP генерирует HTML-файл, в значительной степени сайт без оболочки и плюс CSS.
  4. PHP сохраняет это в /tmp/foobar.html
  5. PHP выполняет команду, которая печатает в PDF, аналогично firefox --display=:1 -print /tmp/foobar.html -printmode pdf -printfile /tmp/foobar.pdf
  6. PHP загружает этот PDF-файл в Amazon S3 для постоянного хранения, добавляет в нашу базу данных для дальнейшего использования.

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

Я установил Firefox на свой сервер и Xvfb. Я пробовал настроить Xvfb как виртуальный дисплей и запустить на нем Firefox, но получаю Xlib: extension "RANDR" missing on display ":1". Неважно что я делаю. Вероятно, он настроен неправильно, я безуспешно пытался добавить это расширение при запуске нового экрана. Я не уверен, что поступлю правильно. Если Firefox и Xvfb - правильный путь, как правильно заставить их разговаривать друг с другом? Есть еще зависимости? Я подробно остановлюсь на этом, если окажется, что это правильный путь.

Чего я не хочу делать:

Нет собственных преобразователей PHP - много вложенных таблиц в этом HTML, много чисел с плавающей запятой, много всего, что родной PHP не работает. Все 3 пробовал уже.

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

TL: DR; Я пытаюсь выполнить печать в формате PDF с помощью Firefox, запущенного на сервере без дисплея, чтобы обеспечить стабильную печать. Я пробовал Xvfb и почти сдался. Если это правильный способ, как мне настроить Xvfb? В противном случае, как еще я мог бы это сделать?

Используйте безголовый рендерер, например PhantomJS или wkhtmltopdf.