用PHPWord生成的.docx文件如何生成PDF?

16
我正在使用PHPWord从模板创建.docx文件。虽然它可以正常工作,但现在我想将生成的文件转换为PDF格式。首先我尝试使用tcpdf与PHPWord结合使用。
$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时,加载文件时出现以下异常

Fatal error: Uncaught exception 'BadMethodCallException' with message 'Cannot add PreserveText in Section.'

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

编辑

在尝试了更多后,我发现只有当文档中有一些邮件合并字段时才会出现异常。一旦我将它们删除,异常就不再出现,但转换后的PDF文件看起来很糟糕。所有样式信息都消失了,我无法使用结果,因此需要替代方案。



我考虑使用其他方法来生成PDF,但我只找到了4种方法:

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

是否有第五种生成PDF的方法?或者有没有解决方案使生成的PDF文档看起来更美观?


2
良好的PDF输出可能需要您创建第二个模板(您已经拥有了一个MSWord模板,接下来您将需要一个PDF模板将源文档转换为tcpdf所需的输入)。 - Rob_M
@Rob_M 是的,我已经考虑过创建一个HTML模板,因为有一些库可以将HTML转换为PDF,但是我有很多不同的模板,所以创建它们并重写填充内容的方式需要相当多的工作,所以我希望有另一种更简单的方法... - Pinguin895
这个链接可能会有所帮助: https://github.com/PHPOffice/PHPWord/issues/311 - hasan.hameed
PHPWord应该可以胜任这项工作,就像@hasan.hameed提到的那样。由于您无法安装其他软件,因此没有其他选项将其转换为漂亮的PDF。我想到的另一个方法是使用Imagick,但这需要soffice二进制文件,而这在strato上不应该被安装... - CodeBrauer
4个回答

1
我使用 Gears/pdf将phpword生成的docx文件转换为PDF:
$success = Gears\Pdf::convert(
            'file_path/file_name.docx',
            'file_path/file_name.pdf');

很遗憾,Gears从2022年起不再活跃。 - Antony

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

请尝试这个。

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

0

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

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

之后,您可以读取HTML文件内容,并借助mPDF、tcPdf或fpdf将其写入PDF文件。


0

试试这个:

// 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();
    }

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