PHPWord + dompdf Невозможно загрузить библиотеку рендеринга PDF и проблемы с dompdf_config.inc.php

Я использую PHPWord (https://github.com/PHPOffice/PHPWord) для создания Microsoft Файл Word (.docx), который я сохраняю в своей системе. Это работает отлично и, как и ожидалось. Я также хочу сохранить версию этого файла для Adobe Acrobat (.pdf) в своей системе. Для этого я полагаюсь на PHPWord в сочетании с dompdf (https://github.com/dompdf/dompdf). Вот тут и начинаются проблемы.

Мой PHP-код выглядит следующим образом:

// first, save the completed .docx file that I've generated
$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "Word2007");
$objWriter->save($path_docx);

// second, set PHPWord PDF rendering variables
\PhpOffice\PhpWord\Settings::setPdfRendererPath("/var/www/html/vendor/dompdf/dompdf");
\PhpOffice\PhpWord\Settings::setPdfRendererName("DomPDF");

// third, load the .docx file which we just saved above
$phpWord = \PhpOffice\PhpWord\IOFactory::load($path_docx);  

// fourth, save the new PDF file to the location of choice
$xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "PDF");
$xmlWriter->save("/var/www/html/export/my-pdf-version-of-the-file.pdf");

Когда я запускаю код выше, я получаю следующую ошибку:

Неустранимая ошибка: необработанное исключение «PhpOffice\PhpWord\Exception\Exception» с сообщением «Невозможно загрузить библиотеку визуализации PDF» в /var/www/html/vendor/phpoffice/phpword/src/PhpWord/Writer /PDF/AbstractRenderer.php:94 Трассировка стека: #0 /var/www/html/vendor/phpoffice/phpword/src/PhpWord/Writer/PDF.php(65): PhpOffice\PhpWord\Writer\PDF\AbstractRenderer-> __construct(Object(PhpOffice\PhpWord\PhpWord)) #1 /var/www/html/vendor/phpoffice/phpword/src/PhpWord/IOFactory.php(44): PhpOffice\PhpWord\Writer\PDF->__construct(Object( PhpOffice\PhpWord\PhpWord)) #2 /var/www/html/assets/core/phpword.php(593): PhpOffice\PhpWord\IOFactory::createWriter(Object(PhpOffice\PhpWord\PhpWord), 'PDF') # 3 /var/www/html/export/index.php(94): exportOutline(Array) #4 {main} добавлено в /var/www/html/vendor/phpoffice/phpword/src/PhpWord/Writer/ PDF/AbstractRenderer.php в строке 94

Я начал искать в Google подобные ошибки и наткнулся на этот пост о переполнении стека: PHPWord в PDF не может загрузить библиотеку. Они предложили отредактировать некоторый код в файле "/var/www/html/vendor/phpoffice/phpword/src/PhpWord/Writer/PDF/AbstractRenderer.php". Фрагмент кода, на который ссылается этот пост, выглядит следующим образом:

public function __construct(PhpWord $phpWord)
{
    parent::__construct($phpWord);
    $includeFile = Settings::getPdfRendererPath() . '/' . $this->includeFile;
    if (file_exists($includeFile)) {
        /** @noinspection PhpIncludeInspection Dynamic includes */
        require_once $includeFile;
    } else {            
        debug($includeFile);
        // @codeCoverageIgnoreStart
        // Can't find any test case. Uncomment when found.
        throw new Exception('Unable to load PDF Rendering library');
        // @codeCoverageIgnoreEnd
    }
}

Они предложили мне избавиться от этой части кода, которая появляется на 4-й строке выше:

. '/' . $this->includeFile

Однако когда я реализовал это решение, оно не решило мою проблему. Разочарованный, я посмотрел на значение, сгенерированное для $includeFile в этом фрагменте кода. Для меня значение было "/var/www/html/vendor/dompdf/dompdf/dompdf_config.inc.php". Как только я увидел, что он пытается включить файл с именем «dompdf_config.inc.php», я искал этот файл в своем каталоге. Его не было ни в указанном месте, ни где-либо в моей системе!

В этот момент я снова начал искать в Google это имя файла и остановился на этом сообщении Stack Overflow: Я не могу найти dompdf_config.inc.php или dompdf_config.custom.inc.php для установки DOMPDF_UNICODE_ENABLED true. Этот пост предполагает, что dompdf 0.7.0 больше не полагается на этот файл конфигурации. В этот момент я начинаю думать, что текущая версия PHPWord (которую я использую), основанная на dompdf, не была обновлена ​​для поддержки текущей версии dompdf (которую я использую). Я просто не знаю.

Мои вопросы:

  1. Может ли кто-нибудь подтвердить, правда ли, что текущая версия PHPWord плохо работает с текущей версией dompdf?
  2. Если текущая версия обоих должна работать вместе, то что я делаю неправильно и как это исправить?

Заранее благодарим вас за всю вашу помощь!

Примечание: я должен отметить, что я включил PHPWord и dompdf в свой проект через композитор; поэтому все соответствующие файлы находятся в "/var/www/html/vendor", как и следовало ожидать. Кроме того, я не могу полагаться ни на TCPDF, ни на MPDF (которые являются альтернативными механизмами рендеринга PDF), потому что они генерируют файлы, которые не соответствуют требованиям форматирования, которые мне нужны для моего проекта.


person Art Geigel    schedule 11.11.2016    source источник
comment
Вы указываете dompdf в файле composer.json или позволяете Composer обрабатывать зависимости? Последняя версия PHPWord указывает dompdf 0.6.x в качестве зависимости.   -  person BrianS    schedule 11.11.2016
comment
Я указал это в composer.json, который, в свою очередь, автоматически обрабатывает необходимые зависимости. Нет? Обратите внимание, что включение PHPWord в composer.json не приводит к автоматическому извлечению dompdf, поскольку это необязательная зависимость. Как вы думаете, проблема может быть в том, что у меня установлен dompdf 0.7.0 вместо 0.6.*? Я попробую 0.6.* позже, когда буду за компьютером.   -  person Art Geigel    schedule 12.11.2016
comment
Хотя dompdf указан в свойстве require-dev, это разрешается только для корневого файла composer.json. Если никакие другие пакеты не требуют dompdf, и вы указываете библиотеку в своем собственном composer.json, вам определенно следует использовать 0.6.2.   -  person BrianS    schedule 13.11.2016
comment
Наконец-то я заставил dompdf работать, как только указал 0.6.* в composer. К сожалению, PDF-версия файла не включает НИ ОДНОГО форматирования, которое я определил в результирующей версии .docx, сгенерированной PHPWord. В PDF-файле нет маркеров, отступов и стилей окраски. Я думаю, что на данный момент мне просто нужно купить phpdocx. Не могу поверить, что нет генератора PDF, который может соблюдать стили, указанные в PHPWord.   -  person Art Geigel    schedule 14.11.2016
comment
Я не использовал библиотеку PHPWord, поэтому не могу точно сказать, что происходит. Dompdf должен уметь обрабатывать такие стили. Ссылка на таблицу стилей может быть неточной в зависимости от того, как dompdf переводит информацию о пути.   -  person BrianS    schedule 15.11.2016