如何使用 PHPOffice 从 Word 转换为 PDF
How to convert a PDF from Word with PHPOffice
我没有任何计划如何通过 PHPOffice 库将数据库中的字符串 (blob) Word 文档转换为 PDF。
概念:
- 我从数据库中获取一个现有的 word 文档作为字符串
- 通过 PHPOffice 库的构造函数或函数传递字符串。
- 然后通过另一个函数获取 PDF 作为字符串
- 最后输出带
Content-Type: application/pdf
的字符串给用户
编号。 1和4我已经实现了。但我不知道如何完成 nr. 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";
}
在尝试了 PhpOffice 库中的一些函数后,我终于找到了解决方案。
所以对于self的库,你不能直接从字符串加载和保存到字符串。您当前必须创建文件。
//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 or the website 下载文件并将其加载到文件夹中即可。
当然,最终这可能不是最好的解决方案,但对我来说,它只是一个word文档的预览。
所以这个脚本也受到以下两个链接的启发:
可以输出到字符串
ob_start();
$xmlWriter->save('php://output');
return ob_get_clean();
我没有任何计划如何通过 PHPOffice 库将数据库中的字符串 (blob) Word 文档转换为 PDF。
概念:
- 我从数据库中获取一个现有的 word 文档作为字符串
- 通过 PHPOffice 库的构造函数或函数传递字符串。
- 然后通过另一个函数获取 PDF 作为字符串
- 最后输出带
Content-Type: application/pdf
的字符串给用户
编号。 1和4我已经实现了。但我不知道如何完成 nr. 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";
}
在尝试了 PhpOffice 库中的一些函数后,我终于找到了解决方案。
所以对于self的库,你不能直接从字符串加载和保存到字符串。您当前必须创建文件。
//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 or the website 下载文件并将其加载到文件夹中即可。
当然,最终这可能不是最好的解决方案,但对我来说,它只是一个word文档的预览。
所以这个脚本也受到以下两个链接的启发:
可以输出到字符串
ob_start();
$xmlWriter->save('php://output');
return ob_get_clean();