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

У меня есть проект, в котором мы используем 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, чтобы протянуть руку помощи?

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

exit;

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


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


Ответы (2)


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

exit;
person Justin Pearce    schedule 01.06.2012

Это трудно определить без прямого доступа к файлу шаблона, но вот некоторые указатели, где механизмы шаблонов часто терпят неудачу:

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

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

person Richard Keller    schedule 21.05.2012
comment
Я попробовал это, но обнаружил, что проблема была не в части кода docx, а в выводе кода. - person Justin Pearce; 22.05.2012