Нет преобразования при преобразовании 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).