0

我有一个项目,我们在其中使用 phpdocx pro 在模板中生成 .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:如果你想用新信息来回答这个问题,我会接受你的回答。

4

2 回答 2

2

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

exit;
于 2012-06-01T14:37:18.197 回答
1

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

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

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

于 2012-05-21T23:32:24.310 回答