Как я могу преобразовать docx в pdf с помощью механизма шаблонов phpWord?

Я сделал быстрый контроллер, чтобы проверить, как я могу преобразовать шаблон docx в pdf после замены значений заполнителей. .Docx:

https://drive.google.com/file/d/14-Nh0L-R7ulHgpmTN5s-T0PilwWSsE7L/view?usp=sharing

И я использую следующий код laravel, чтобы преобразовать его из шаблона docx в pdf


namespace App\Controllers\Services;

use App\Controllers\BaseController;
use Illuminate\Support\Facades\Response;

use PhpOffice\PhpWord\TemplateProcessor;
use PhpOffice\PhpWord\PhpWord;

class Contract extends BaseController
{
    public function getContract()
    {
        $file = storage_path()."/contracts/contract.docx";
        $tmpFile = storage_path()."/contracts/output.pdf";

        $template = new TemplateProcessor($file);
        $template->setValue('COMP_NAME',"LOREM IPSUM INC");
        $template->setValue('ADDRESS',"Nowhere Str Tsastikistan");
        $template->saveAs($tmpFile);

        return Response::make("OK");
    }
}

Но код не может создать читаемый PDF-файл: https://drive.google.com/file/d/1wYsVrjwQNMN8r3sWZlOm6x7cNeja3ET0/view?usp=sharing

Ι также пытался создать html, чтобы я мог преобразовать его в pdf: https://drive.google.com/file/d/1wYsVrjwQNMN8r3sWZlOm6x7cNeja3ET0/view?usp=sharing

Но все равно вывод выглядит довольно мусорным.

Поэтому знаете ли вы, как я могу преобразовать шаблон docx в PDF, если да, как я могу использовать файл в памяти вместо файловой системы?


person Dimitrios Desyllas    schedule 17.11.2020    source источник


Ответы (1)


Напрямую нельзя. Вам нужно сначала сохранить его как docx, а затем прочитать его еще раз и сохранить как PDF:

namespace App\Controllers\Services;

use App\Controllers\BaseController;
use Illuminate\Support\Facades\Response;

use PhpOffice\PhpWord\TemplateProcessor;
use PhpOffice\PhpWord\IOFactory;

class Contract extends BaseController
{
    public function getContract()
    {
        $file = storage_path()."/contracts/contract.docx";
        $tmpFile = storage_path()."/contracts/output.pdf";
        $outfile = storage_path()."/contracts/output.docx";

        $template = new TemplateProcessor($file);
        $template->setValue('COMP_NAME',"LOREM IPSUM INC");
        $template->setValue('ADDRESS',"Nowhere Str Tsastikistan");
        $template->saveAs($outfile);

        $phpWord = IOFactory::load($outfile);
        $phpWord->save($tmpFile,'PDF');        

        return Response::make("OK");
    }
}

Решение, которое я не тестировал, заключается в использовании php://temp или php://memory, чтобы избежать ввода-вывода файловой системы.

person Dimitrios Desyllas    schedule 17.11.2020