PHP - Laravel - 将.docx文件转换为PDF格式

11
如何使用PHP Laravel将文档(docx)转换为PDF格式?
在进行转换之前,我使用PHPWord来设置变量,然后希望将其保存或转换为PDF。

1
据我所知,LibreOffice是唯一的选择,因为它对Word文件有很好的支持;我在我的一个副业项目中已经做过了,也许我很快就会开源它。 - Ahmad
4个回答

0

您需要在服务器上安装unoconv。

此外,需要在服务器上获得运行exec()的权限。

  1. 安装unoconv

sudo apt-get install unoconv

  1. 添加以下行以将所需的docx文件转换为pdf。

exec("doc2pdf sample-file.docx sample-file.pdf");


0

详细摘要:

  • 初始设置:首先通过Composer安装所需的软件包——PHPWord用于DOCX文件操作和Dompdf用于PDF转换。

  • 创建或操作DOCX文件:使用PHPWord库创建新的DOCX文件或操作现有的DOCX文件。保存这个中间的DOCX文件。

  • DOCX转HTML:使用PHPWord将DOCX文件转换为HTML文件,这将作为PDF转换的中间步骤。

  • HTML转PDF:使用Dompdf库将中间的HTML文件转换为PDF文件。保存这个PDF文件。

  • Laravel集成:将整个过程集成到Laravel应用程序中,将代码封装到控制器方法中,并将其链接到路由。

步骤1:安装所需的软件包

首先,确保您已安装PHPWord。如果没有安装,可以通过Composer进行安装:

composer require phpoffice/phpword

对于PDF转换,您可以使用Dompdf。同样安装它:
composer require dompdf/dompdf

第二步:使用PHPWord创建一个DOCX文件
假设您已经在使用PHPWord进行.docx文件操作,您可以像这样创建或加载一个现有的.docx文件:
use PhpOffice\PhpWord\PhpWord;

$phpWord = new PhpWord();
$section = $phpWord->addSection();
$section->addText('Hello, world!');

// Save DOCX file
$writer = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$writer->save('helloWorld.docx');

第三步:将DOCX文件转换为PDF
使用Dompdf将.docx文件转换为.pdf文件。
use Dompdf\Dompdf;

// Load .docx file content
$phpWord = \PhpOffice\PhpWord\IOFactory::load('helloWorld.docx');

// Save the document as HTML
$writer = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'HTML');
$writer->save('helloWorld.html');

// Convert HTML to PDF using Dompdf
$dompdf = new Dompdf();
$dompdf->loadHtml(file_get_contents('helloWorld.html'));

$dompdf->setPaper('A4', 'portrait');
$dompdf->render();

// Save the PDF
$output = $dompdf->output();
file_put_contents('helloWorld.pdf', $output);

步骤4:集成到Laravel中

将上述代码放置在一个Laravel控制器方法中:

public function convertDocxToPdf()
{
// Your PHPWord and Dompdf code here
}

然后将一个URL路由到这个控制器方法。

批评和改进建议

  • .docx转换为.html可能对于复杂文档来说不是完美的。为了更准确,考虑使用wkhtmltopdf
  • 这只是一个基本的例子;考虑添加异常处理和验证以实现更强大的解决方案。
  • 在处理机密数据和保存临时.html.pdf文件时要小心。确保临时位置的安全性,并在使用后删除文件。

注意:此解决方案尚未完全测试,仅供参考。在实施到生产环境之前,请进行充分测试。

我在phpWord上尝试了templateProcess。它可以导出一个完美的Word文件,我尝试将其转换为PDF,除了PDF中的页眉和页脚无法显示外,其他都正常工作。 - undefined

-1
你可以使用PHPWord库来读取.docx文件的内容,然后使用另一个库,比如Dompdf或mPDF将内容转换为.pdf文件。 以下是一个示例:
use PhpOffice\PhpWord\IOFactory;
use Dompdf\Dompdf;

$phpWord = IOFactory::load('path/to/file.docx');

$dompdf = new Dompdf();
$dompdf->loadHtml($phpWord->saveHTML());
$dompdf->render();
$dompdf->stream();

你也可以使用像 "phpoffice/phpword" 和 "barryvdh/laravel-dompdf" 这样的包

composer require phpoffice/phpword
composer require barryvdh/laravel-dompdf

然后在控制器中使用它们将docx转换为pdf

use PhpOffice\PhpWord\PhpWord;
use Barryvdh\DomPDF\Facade as PDF;

$phpWord = new PhpWord();
$phpWord->loadTemplate('path/to/file.docx');

$pdf = PDF::loadView('view', compact('phpWord'))->save('path/to/file.pdf');

-2
您还可以使用像 "phpoffice/phpword" 和 "barryvdh/laravel-dompdf" 这样的包。
  composer require barryvdh/laravel-dompdf  
  composer require phpoffice/phpword

在config/app.php中注册服务提供者 要注册服务提供者,请打开config/app.php文件。并在'providers'数组的末尾添加以下行:
'providers' => [
 .....
 Barryvdh\DomPDF\ServiceProvider::class,
]

此外,在最后将以下行添加到'aliases'数组中。您可以使用任何别名,就像我们使用了‘PDF’一样,但您也可以使用别名如‘DoPDF’、‘myPDF’、‘PF’等。
'aliases' => [
 .....
 'PDF' => Barryvdh\DomPDF\Facade::class,
]

然后在控制器中使用它们将docx转换为pdf。
use PDF;
public function convertWordToPDF()
    {
            /* Set the PDF Engine Renderer Path */
        $domPdfPath = base_path('vendor/dompdf/dompdf');
        \PhpOffice\PhpWord\Settings::setPdfRendererPath($domPdfPath);
        \PhpOffice\PhpWord\Settings::setPdfRendererName('DomPDF');
         
        //Load word file
        $Content = \PhpOffice\PhpWord\IOFactory::load(public_path('result.docx')); 
 
        //Save it into PDF
        $PDFWriter = \PhpOffice\PhpWord\IOFactory::createWriter($Content,'PDF');
        $PDFWriter->save(public_path('new-result.pdf')); 
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接