Как конвертировать PDF из Word с помощью PHPOffice
У меня нет никакого плана, как я могу преобразовать документ Word, который у меня есть в виде строки (blob) из моей базы данных, в PDF через библиотеку PHPOffice.
Концепция:
- Я выбираю существующий документ Word как строку из базы данных.
- Передайте строку через конструктор или функцию из библиотеки PHPOffice.
- Затем получить через другую функцию PDF в виде строки
- И последний вывод строки с
Content-Type: application/pdf
пользователю.
Nr. 1 и 4 я уже реализовал. Но я не знаю, как этого добиться. 2 и 3. Кто-нибудь может мне помочь?
Код:
//DB-Connection, Composer autoload, ...
$id = htmlspecialchars(trim($_REQUEST["id"]));
$get_data = $con->query("SELECT * FROM word_documents WHERE id='$id'"); //Get the blob
$data = $get_data->fetch();
if ($get_data->rowCount() == 1) {
header("Content-Type: application/pdf");
header("Content-Disposition: inline; filename=" . $data["name"]);
//TODO: Print the PDF as an string
} else {
echo "File not found";
}
2 ответа
После того, как я попробовал некоторые функции из библиотеки PhpOffice, я наконец нашел решение.
Так что с библиотекой в самом себе, вы не можете загрузить и сохранить ее непосредственно из строки в строку. Вы должны создавать файлы в настоящее время.
//Set header to show as PDF
header("Content-Type: application/pdf");
header("Content-Disposition: inline; filename=" . $data["name"]);
//Create a temporary file for Word
$temp = tmpfile();
fwrite($temp, $data["data"]); //Write the data in the file
$uri = stream_get_meta_data($temp)["uri"]; //Get the location of the temp file
//Convert the docx file in to an PhpWord Object
$doc = PhpOffice\PhpWord\IOFactory::load($uri);
//Set the PDF Engine Renderer Path. Many engines are supported (TCPDF, DOMPDF, ...).
\PhpOffice\PhpWord\Settings::setPdfRendererPath("path/to/tcpdf");
\PhpOffice\PhpWord\Settings::setPdfRendererName('TCPDF');
//Create a writer, which converts the PhpWord Object into an PDF
$xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($doc, 'PDF');
//Create again an temp file for the new generated PDF.
$pdf_temp = tmpfile();
$pdf_uri = stream_get_meta_data($pdf_temp)["uri"];
//Save the PDF to the path
$xmlWriter->save($pdf_uri);
//Now print the file from the temp path.
echo file_get_contents($pdf_uri);
Я выбираю движок TCPDF, потому что его было очень легко установить. Просто загрузите файлы из Git Repository или с веб-сайта и загрузите их в папку.
Конечно, в конечном итоге это может быть не лучшим решением, но для меня это всего лишь предварительный просмотр текстового документа.
Так что этот сценарий был вдохновлен следующими двумя ссылками:
Вы можете вывести в строку
ob_start();
$xmlWriter->save('php://output');
return ob_get_clean();