【问题标题】:Generate PDF from .docx generated by PHPWord从 PHPWord 生成的 .docx 生成 PDF
【发布时间】:2016-01-10 02:39:23
【问题描述】:

我正在使用PHPWord 从模板创建.docx 文件。它工作正常,但现在我想将生成的文件转换为PDF

首先我尝试将tcpdfPHPWord 结合使用

$wordPdf = \PhpOffice\PhpWord\IOFactory::load($filename.".docx");

\PhpOffice\PhpWord\Settings::setPdfRendererPath(dirname(__FILE__)."/../../Office/tcpdf");
\PhpOffice\PhpWord\Settings::setPdfRendererName('TCPDF');

$pdfWriter = \PhpOffice\PhpWord\IOFactory::createWriter($wordPdf , 'PDF');
if (file_exists($filename.".pdf")) unlink($filename.".pdf");
$pdfWriter->save($filename.".pdf");  

但是当我尝试加载文件以将其转换为 PDF 时,加载文件时出现以下异常

致命错误:未捕获的异常“BadMethodCallException”带有消息“无法在部分中添加 PreserveText。”

经过一番研究,我发现其他一些人也有这个错误(phpWord - Cannot add PreserveText in Section

编辑

在尝试了更多之后,我发现Exception 仅在我的文档中有一些mail merge fields 时出现。一旦我删除了它们,Exception 就不再出现,但转换后的PDF 文件看起来很糟糕。所有样式信息都消失了,我无法使用结果,所以需要替代品。



我想过用另一种方式来生成 PDF,但我只能找到 4 种方式:

  1. 使用OpenOffice - 不可能,因为我无法在服务器上安装任何软件。同样采用here 提到的方式也不起作用,因为我的主机 (Strato) 使用 SunOS 作为操作系统,这需要 Linux
  2. 使用phpdocx - 我没有任何预算支付它,演示无法创建 PDF
  3. 使用PHPLiveDocx - 这可行,但有每天 250 个文档和每小时 20 个文档的限制,我必须一次转换大约 300 个文档,甚至一天可以转换多次
  4. 使用PHP-Digital-Format-Convert - 输出看起来比使用PHPWordtcpdf 更好,但仍然无法使用,因为缺少图像,并且大多数(不是全部!)样式

是否有第 5 种生成 PDF 的方法?或者有什么办法可以让生成的 PDF 文档好看吗?

【问题讨论】:

  • 体面的 PDF 输出可能需要您创建第二个模板(您已经有了一个 MSWord 模板,接下来您需要一个 PDF 模板将您的源文档带到 tcpdf 想要的输入)。
  • @Rob_M 是的,我已经考虑过创建一个 HTML 模板,因为有一些库可以将 HTML 转换为 PDF,但是我有很多不同的模板,所以要创建一个相当多的工作他们并重写我用内容填充它们的方式,所以我希望有另一种更简单的方法......
  • 此链接可能有帮助:github.com/PHPOffice/PHPWord/issues/311
  • PHPWord 应该可以完成这项工作,就像提到的@hasan.hameed 一样。由于您无法安装其他软件,因此不应该有任何其他选项可以将其转换为美观的 PDF。我的另一个想法是使用 Imagick,但这需要 soffice 二进制文件,它不应该安装在 Strato...

标签: php pdf docx phpword


【解决方案1】:

我使用Gears/pdf将phpword生成的docx文件转换为PDF:

$success = Gears\Pdf::convert(
            'file_path/file_name.docx',
            'file_path/file_name.pdf');

【讨论】:

    【解决方案2】:

    您尝试在保存 PDF 文件之前取消链接,并且您还必须取消链接 DOCX 文档,而不是 PDF 文件。

    试试这个。

    $pdfWriter = \PhpOffice\PhpWord\IOFactory::createWriter($wordPdf , 'PDF');    
    $pdfWriter->save($filename.".pdf");
    unlink($wordPdf);
    

    【讨论】:

      【解决方案3】:

      我不认为我是正确的.. 您将文档另存为 HTML 内容

      $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'HTML');

      在阅读 HTML 文件内容后,借助 mPDF 或 tcPdf 或 fpdf 将内容写入 PDF 文件。

      【讨论】:

        【解决方案4】:

        试试这个:

        // get the name of the input PDF
        $inputFile = "C:\\PHP\\Test1.docx";
        
        // get the name of the output MS-WORD file
        $outputFile = "C:\\PHP\\Test1.pdf";
        
        try
            {
            $oLoader = new COM("easyPDF.Loader.8");
            $oPrinter = $oLoader->LoadObject("easyPDF.Printer.8");
            $oPrintJob = $oPrinter->PrintJob;
            $oPrintJob->PrintOut ($inputFile, $outputFile);
            print "Success";
            }
        
        
        catch(com_exception $e)
            {
            Print "error code".$e->getcode(). "\n";
            print $e->getMessage();
            }
        

        【讨论】:

          猜你喜欢
          • 2021-10-30
          • 1970-01-01
          • 1970-01-01
          • 2020-10-07
          • 2023-03-22
          • 1970-01-01
          • 2012-05-12
          • 2021-05-10
          • 2013-07-04
          相关资源
          最近更新 更多