web-dev-qa-db-ja.com

PHPWordで生成された.docxからPDFを生成

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に変換しようとすると、ファイルのロード中に次の例外が発生します

致命的なエラー:「セクションにPreserveTextを追加できません」というメッセージが表示されるキャッチされていない例外「BadMethodCallException」

いくつかの調査の後、他にもいくつかこのバグがあることがわかりました( phpWord-セクションにPreserveTextを追加できません

[〜#〜]編集[〜#〜]

さらに調べてみたところ、Exceptionは、ドキュメントにmail merge fieldsが含まれている場合にのみ発生することがわかりました。それらを削除すると、Exceptionは表示されなくなりますが、変換されたPDFファイルは恐ろしく見えます。すべてのスタイル情報が失われ、結果を使用することができないため、代替の必要性が残ります。



PDFを生成する別の方法を使用することを考えましたが、4つの方法しか見つけることができませんでした。

  1. OpenOfficeを使用-サーバーにソフトウェアをインストールできないため、不可能です。また、前述の方法で here も機能しませんでした。私のホスティング業者( Strato )は、OSとしてSunOSを使用しており、これにはLinuxが必要です。
  2. phpdocxを使用している-予算がなく、デモでPDFを作成できない
  3. 使用 PHPLiveDocx-これは機能しますが、1日あたり250文書、1時間あたり20文書という制限があるため、変換を変換する必要があります一度に300ドキュメント、おそらく1日に複数回
  4. PHP-Digital-Format-Convertを使用-出力はPHPWordtcpdf、ただし画像が欠落しているためまだ使用できず、ほとんどの(すべてではない)スタイル

PDFを生成する5番目の方法はありますか?または、生成されたPDFドキュメントを美しく見せるための解決策はありますか?

12
Pinguin895

保存する前にPDFファイルのリンクを解除しようとしています。また、PDFではなく、DOCXドキュメントのリンクを解除する必要があります。

これを試して。

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

私は Gears/pdf を使用して、phpwordで生成されたdocxファイルをPDFに変換しました。

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

これを試して:

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