#php #symfony #phpword
#php #symfony #phpword
Вопрос:
В моем проекте Symfony я хочу загрузить html-шаблон в формате PDF и docx.
использование docx — PHPOffice PHPWord PHPWord;
использование PDF — PDFBuilder;
шаг
- Сохраните HTML в таблице с идентификатором шаблона.
- Получите содержимое html с идентификатором шаблона.
- Один и тот же шаблон html должен иметь возможность экспортировать как docx и pdf.
- Верните содержимое документа контроллеру в качестве ответа на вложение.
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')
, ваши контроллеры должны расширять абстрактный контроллер