使用phpdocx损坏的.docx下载

时间:2012-05-21 22:49:44

标签: php docx phpdocx

我有一个项目,我们使用phpdocx pro在from模板中生成.docx文件。我可以很容易地将数据输入到模板中,但是当在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编辑器中打开文件,发现问题是文件输出成功后,Web前端会将其开头的HTML附加到结尾处。 docx文件制作'损坏的'文件。在unlink()修复整件事之后的这一行:

exit;

Pekka:如果你想用新信息回答这个问题,我会接受你的回答。

2 个答案:

答案 0 :(得分:2)

将问题缩小到输出文件的代码部分后,我终于在HEX编辑器中打开文件,发现问题是文件输出成功后,Web前端将附加HTML的开头到docx文件的末尾制作一个'损坏的'文件。在unlink()修复整件事之后的这一行:

exit;

答案 1 :(得分:1)

如果不直接访问模板文件,这很难确定,但这里有一些模板引擎经常失败的指针:

  • 尝试将所有PHP变量记录到控制台:print print_r($this->rec->variable_name, true);,然后检查以确保所有变量都是字符串,并且没有任何变量为NULL。
  • 检查模板文件并确保每个模板变量中的样式(即字体类型,字体大小等)一致。换句话说,确保没有变量,其中变量的一半与变量的其余部分的样式不同。这个特殊的细微之处很容易在模板文件中引入,通常最简单的方法就是简单地删除和重写每个模板变量。

最后,尝试在调用addTemplateVariable方法时删除'html'参数,看看是否会产生影响。如果你实际上没有使用HTML,那么传递'html'参数是没有意义的。相反,如果您使用的是HTML,则损坏的文件可能是HTML结构不正确的情况,导致Microsoft Word将文档标记为已损坏。