Вопрос по php – Поврежденная загрузка .docx с использованием phpdocx

0

У меня есть проект, в котором мы используем phpdocx pro для создания файла .docx в шаблонах from. Я могу получить данные в шаблон достаточно легко, однако, когда файл загружается и открывается в MS Word 2010, программа сообщает, что файл не может быть открыт из-за проблем с содержимым, подробности "Файл поврежден и не может быть открыт ". Word может исправить документ, однако проблема остается, что он не должен быть поврежден в первую очередь.

Вот как я создаю документ:

function generateUnitDesign(){
  if($this->populateRecords()){
      require_once dirname(__FILE__).'/phpdocx/classes/CreateDocx.inc';
      $filename = 'UnitDesignTemplate-'.str_replace(' ', '', $this->rec->title);
      //Create Document
      $document = new CreateDocx();
      $document->addTemplate(dirname(__FILE__).'/templates/unitdesigntemplate.docx');

      // Fill in text fields
      $document->addTemplateVariable('TITLE', $this->rec->title);
      $document->addTemplateVariable('CHALLENGE', $this->rec->challenge, 'html');
      $document->addTemplateVariable('HOOK', $this->rec->hook, 'html');
      $document->addTemplateVariable('RESEARCH', $this->rec->research, 'html');
      $document->addTemplateVariable('AUDIENCE', $this->rec->audience, 'html');
      $document->addTemplateVariable('SUMMARY', $this->rec->project_brief, 'html');
      $document->addTemplateVariable('RESOURCES', $this->rec->resources, 'html');
      $document->addTemplateVariable('REQUIREMENTS', $this->rec->requirements, 'html');
      $document->addTemplateVariable('SCAFFOLDING', $this->rec->scaffolding, 'html');

      $document->createDocx($filename);
      unset($document);
      header("Content-Type: application/vnd.ms-word");
      header("Content-Length: ".filesize($filename.'.docx'));
      header('Content-Disposition: attachment; filename='.$filename.'.docx');
      header('Content-Transfer-Encoding: binary');
      ob_clean();
      flush();
      readfile($filename.'.docx');
      unlink($filename.'.docx');
  }
}

Первоначально я пытался использовать ихcreateDocxAndDownload() функция, чтобы получить файл, но он оставил бы копию файла .docx на сервере, что не было идеальным. Я что-то пропустил? Есть ли кто-то с большим опытом работы с phpdocx, чтобы протянуть руку?

Edit: Ну, я чувствую себя идиотом. После сужения проблемы до части кода, которая выводит файл, я, наконец, открыл файл в редакторе HEX и обнаружил, что проблема заключается в том, что после успешного вывода файла веб-интерфейс добавит начало HTML-кода в файл. конец файла docx "испортил" файл. Эта строка сразу послеunlink() исправил все это:

exit;

Pekka: Если вы хотите ответить на этот вопрос новой информацией, я приму ваш ответ.

Ты заглянул в файл? Бьюсь об заклад, он содержит сообщение об ошибке PHP Pekka 웃
@ Pekka Нет ошибок ... только верхняя часть HTML-кода, добавляемого в файл. Justin Pearce

Ваш Ответ

2   ответа
2

которая выводит файл, я наконец открыл файл в HEX-редакторе и обнаружил, что проблема в том, что после успешного вывода файла веб-интерфейс добавит начало его HTML в конец файла docx, создающий «поврежденный» файл. Эта строка сразу послеunlink() все исправил:

exit;
1

но вот некоторые указатели, где часто не работают движки шаблонов:

Попробуйте записать все ваши переменные PHP в консоль:print print_r($this->rec->variable_name, true);, а затем убедитесь, что все ваши переменные являются строками и что ни одна из них не равна NUL Проверьте ваш файл шаблона и убедитесь, что стиль (т. Е. Тип шрифта, размер шрифта и т. Д.) Согласован в каждой переменной шаблона. Другими словами, убедитесь, что нет переменных, половина из которых имеет стиль, отличный от остальной переменной. Эту особую тонкость очень легко ввести в файл шаблона, и, как правило, самый простой способ исправить это - просто удалить и переписать каждую переменную шаблона.

Наконец, попробуйте удалить параметр 'html' при вызовеaddTemplateVariable метод и посмотреть, имеет ли это значение. Если вы на самом деле не используете HTML, тогда нет смысла передавать параметр html. И наоборот, если вы используете HTML, то поврежденный файл может иметь место неправильно структурированного HTML, в результате чего Microsoft Word помечает документ как поврежденный.

Я попробовал это, но обнаружил, что проблема не в части кода docx, а в выводе кода. Justin Pearce

Похожие вопросы