Нет преобразования при преобразовании DOCX в PDF

Я пытаюсь преобразовать файл DOCX в PDF с помощью PHPWord. Когда я выполняю скрипт, похоже, что некоторые элементы стиля не конвертируются. В файле DOCX у меня есть одно изображение, две таблицы с границей 1px и скрытыми границами, и я использую вкладки.

Когда я выполняю скрипт, я получаю файл PDF без изображения, все вкладки заменяются пробелом, а все таблицы имеют границу 3 пикселя.

Кто-то знает, почему я скучаю по этим стилям?

Вот мой сценарий:

while ($data2 = mysql_fetch_array($rsSql)){
  $countLines=$countLines+1;
  $templateProcessor->setValue('quantity#'.$countLines, $data2['quantity']);
  $templateProcessor->setValue('name#'.$countLines, $data2['name']);
  $templateProcessor->setValue('price#'.$countLines, "€ " .$data2['price'] ."");
}

\PhpOffice\PhpWord\Settings::setPdfRenderer('./dompdf');
\PhpOffice\PhpWord\Settings::setPdfRendererPath('./dompdf');
\PhpOffice\PhpWord\Settings::setPdfRendererName('DOMPDF');

$temp_file = tempnam(sys_get_temp_dir(), 'Word');
\$templateProcessor->saveAS($temp_file);

$phpWord = \PhpOffice\PhpWord\IOFactory::load($temp_file); 

$xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord , 'PDF');
$xmlWriter->save('result.pdf');  

header("Content-type:application/pdf");
header("Content-Disposition:attachment;filename='result.pdf'");
readfile("result.pdf");

1 ответ

Решение

После просмотра исходного кода кажется, что PHPWord ранее конвертировал документ в представление HTML, а затем позволил сохранить его в PDF с помощью dompdf, другого конвертера.

Вот что подтверждает открытый номер 1139, кроме того, он касается отсутствующих стилей:

Используемые писатели PDF принимают вывод HTML, в котором также отсутствует стиль. Классы определяются в <style> тег, но они просто не используются.

Также последнее сообщение добавляет:

Это все еще кажется проблемой. Выводы html и pdf не повторяют некоторые стили в docx (верхний / нижний колонтитулы).

Что касается проблемы с границами, другой вопрос SO показывает аналогичную проблему в конвертации HTML -> PDF. Решение состояло в том, чтобы отредактировать стиль CSS, который вы, очевидно, не сможете выполнить в своем примере кода, если не перейдете к предварительному преобразованию в HTML.

В заключение, вы не можете решить вашу проблему в краткосрочной перспективе. Если вы не являетесь частью команды разработчиков, вы можете отправлять им отчеты об ошибках (а не в dompdf, поскольку это конвертер HTML-в-PDF и они выходят за рамки). Github позволяет добавлять файлы DOCX в отчет о проблеме.

альтернативы

Вы можете проверить вопрос SO 204860 о библиотеке редактирования PDF на стороне сервера. Ниже представлены две альтернативы: одна - бесплатное программное обеспечение, другая - с закрытым исходным кодом и по цене.

LibreOffice

Другой способ - использовать LibreOffice в режиме без головы (выполнение командной строки без интерфейса):

libreoffice --headless --convert-to pdf <filename_to_convert>

Оболочка PHP для LibreOffice, Office Converter также доступна здесь, если вы не хотите использовать libreoffice через exec(),

Проверьте, будет ли преобразование LibreOffice соответствовать вашим потребностям (оно может не охватывать все случаи, но удовлетворяет вашим требованиям).

Aspose

Лучший конвертер, который я когда-либо использовал на работе, - это Aspose, API, охватывающий документы с пакетом Aspose.Words, рабочие листы с Aspose.Cells, презентации с Aspose.Slides и так далее. Но это закрытый исходный код и довольно дорогой (и вы будете платить за обновления, если вы хотите их после истечения срока действия лицензии).

Есть способ использовать его в PHP через Java (Aspose. Words и Aspose. Cells) или.NET (Aspose. Words, похоже, идет с Aspose. Cells).

Другие вопросы по тегам