【问题标题】:Corrupted .docx download using phpdocx使用 phpdocx 下载损坏的 .docx
【发布时间】:2012-05-21 22:49:44
【问题描述】:

我有一个项目,我们在其中使用 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:如果您想用新信息回答这个问题,我会接受您的回答。

【问题讨论】:

  • 您查看过文件吗?我敢打赌它包含一个 PHP 错误消息
  • @Pekka 没有错误...只是附加到文件的一些 HTML 的顶部。

标签: php docx phpdocx


【解决方案1】:

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

exit;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我试过了,但发现问题不在于代码的 docx 部分,而在于代码的输出。
    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多