使用 phpdocx 下载.docx损坏



我有一个项目,我们正在使用 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文件的副本,这并不理想。我错过了什么吗?有没有更有经验的人来帮忙?

编辑:好吧,我觉得自己像个白痴。在将问题缩小到输出文件的代码部分后,我终于在十六进制编辑器中打开了该文件,发现问题是在文件成功输出后,Web 前端会将其 HTML 的开头附加到 docx 文件的末尾,从而生成"损坏"的文件。紧随unlink()之后的这一行修复了整个事情:

exit;

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

在将

问题缩小到输出文件的代码部分后,我终于在十六进制编辑器中打开了该文件,发现问题是在文件成功输出后,Web 前端会将其 HTML 的开头附加到 docx 文件的末尾,从而生成"损坏"的文件。紧接着unlink()的这一行修复了整个事情:

exit;

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

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

最后,尝试在调用 addTemplateVariable 方法时删除"html"参数,看看这是否有区别。如果您实际上没有使用 HTML,那么传递"html"参数就没有意义了。相反,如果您使用的是 HTML,则损坏的文件可能是结构不正确的 HTML 的情况,从而导致 Word Microsoft将文档标记为损坏。

相关内容

  • 没有找到相关文章

最新更新