Как содержимое HTML возвращается в качестве ответа на вложение для загрузки pdf и docx

#php #symfony #phpword

#php #symfony #phpword

Вопрос:

В моем проекте Symfony я хочу загрузить html-шаблон в формате PDF и docx.

использование docx — PHPOffice PHPWord PHPWord;

использование PDF — PDFBuilder;

шаг

  1. Сохраните HTML в таблице с идентификатором шаблона.
  2. Получите содержимое html с идентификатором шаблона.
  3. Один и тот же шаблон html должен иметь возможность экспортировать как docx и pdf.
  4. Верните содержимое документа контроллеру в качестве ответа на вложение.

1 и 2 шага для понимания процесса, мой вопрос связан с 3 и 4

У меня есть

  • Родительский класс — DocumentExporter
  • Дочерний класс — DocxExporter amp; PDFExporter

В дочернем классе есть 3 функции

  • DocxExporter -> getDocxBuilder, getDocx, exportDocument
  • PDFExporter -> getPdfBuilder, getPDF, exportDocument

    в DocxExporter;

     const DEFAULT_HEADER = 'application/octet-stream';
    
    protected function getDocx($content, array $sectionStyle) {
    
      $section = $this->getDocxBuilder()->addSection($sectionStyle);
      $content = preg_replace("/<tables(. ?)>(. ?)</table>/is",
          "<table style="border: 6px #000000 solid;">$2</table>", $content);
      $content = str_replace("<p><div style=' page-break-after:always !important;'></div></p>",
          "<pagebreak></pagebreak>", $content);
      $content = str_replace("amp;nbsp", " ", $content);
    
      Html::addHtml($section, $content, false, false);
    
      header('Content-Type: ' . self::DEFAULT_HEADER);
      header('Content-Disposition: attachment;filename="' . $this->getExportFileName() . '.docx"');
    
      $objWriter = IOFactory::createWriter($this->docxBuilder, 'Word2007');
      $objWriter->save('php://output');}
     

в PDFExporter;

    const DEFAULT_HEADER = 'application/pdf';

   protected function getPDF($content, $pageParamArray): AttachmentResponse {
    $this->pdfBuilder = $this->getPdfBuilder();
    $this->pdfBuilder->setPageOptions($pageParamArray);
    $pdf = $this->pdfBuilder->createPDFData(null, null, $content);
    $response = new AttachmentResponse(['data' => $pdf]);
    $response->setContentType(self::DEFAULT_HEADER);
    $response->setAttachmentName(parent::getExportFileName() . '.pdf');

    return $response;   }
 

Я попытался, чтобы функция getDocx также возвращала AttachmentResponse, как это делает PDFExporterclass . но не удалось определить правильный способ получить тот же ответ. на данный момент в конечной точке я получаю ответ на вложение и null отдельно для pdf и docx. как я могу изменить функцию docx, чтобы возвращать ответ на вложение.

Комментарии:

1. возможно, языковой барьер, но я пока не понимаю, чего вы пытаетесь достичь, поэтому я вхожу в темноту. На мой взгляд, ваши экспортеры должны возвращать НЕ ответы, а либо имя файла, либо поток. При этом ответ всегда может быть только одним. «Вложение», вероятно, вводит в заблуждение, поскольку вложение будет содержимым ответа . в электронных письмах все по-другому, когда у вас может быть несколько вложений в теле письма. в Интернете вам нужно либо сделать несколько запросов для нескольких файлов, либо вернуть zip-файл с содержимым внутри.

2. в docx exporter могу ли я получить содержимое страницы без использования $objWriter-> save(‘php: // output’); с помощью $objWriter-> save(‘php: // memory’); ничего не возвращая

3. разве вы не можете просто записать это во временный файл или что-то в этом роде? в любом случае… теоретически, после написания php://memory вам должна быть возможность чтения php://memory , по крайней мере, если я правильно понимаю руководство по php. однако php://memory его нельзя использовать повторно, согласно примеру 5 php.net/manual/en / … и я предполагаю, что -> сохранить закроет поток … ; o / Я бы предложил просто использовать временный файл или даже создать собственную оболочку потока

4. в $objWriter-> save(‘php: // output’); затем в функции сохранения создается временный файл. на самом деле я хочу вернуть файл, но с приведенным выше кодом при обновлении браузера он загружает файл. Я думаю, что я должен получить этот временный файл или я должен создать временный файл. можете ли вы помочь мне создать временный файл и вернуть этот файл.

5. php.net/manual/en/function.tempnam.php php.net/manual/en/function.sys-get-temp-dir.php для письма. чтобы создать ответ, как и раньше, вы можете использовать функцию AbstractController file return $this->file($tmpFilename, 'filenameTheUserSees.pdf') , ваши контроллеры должны расширять абстрактный контроллер