Как конвертировать PDF из Word с помощью PHPOffice

У меня нет никакого плана, как я могу преобразовать документ Word, который у меня есть в виде строки (blob) из моей базы данных, в PDF через библиотеку PHPOffice.

Концепция:

  1. Я выбираю существующий документ Word как строку из базы данных.
  2. Передайте строку через конструктор или функцию из библиотеки PHPOffice.
  3. Затем получить через другую функцию PDF в виде строки
  4. И последний вывод строки с 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();
Другие вопросы по тегам