使用phpdocx损坏.DOCX下载(Corrupted .docx download using

2019-07-29 11:59发布

我有在我们使用phpdocx亲生成模板在一个.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伸出援手更多的经验?

编辑:嗯,我觉得自己像个白痴。 向下缩小问题的文件输出的代码部分之后,我终于打开文件中的十六进制编辑器,发现问题是该文件后,成功输出的是HTML到年底的web前端将追加启动该DOCX文件制作一个“损坏”的文件。 这一条线后,立即unlink()固定整个事情:

exit;

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

Answer 1:

缩小的问题降到了文件输出的代码部分之后,我终于打开文件中的十六进制编辑器,发现问题是该文件后,成功输出的是HTML到底web前端将追加启动该DOCX文件制作一个“损坏”的文件。 这一条线后,立即unlink()固定整个事情:

exit;


Answer 2:

这是困难的,而不直接进入模板文件查明,但这里有一些指针,其中的模板引擎往往会失败:

  • 尝试登录你的PHP变量安慰: print print_r($this->rec->variable_name, true); 然后检查,以确保所有的变量都是字符串,并且没有为NULL。
  • 检查你的模板文件,并确保样式(例如字体类型,字体大小等),在每个模板变量是一致的。 换句话说,确保不存在变数,其中一半的变量是不同的风格,以可变的其余部分。 这种特殊的微妙之处是很容易的在模板文件中介绍,一般修复它的最简单的方法就是简单删除和重写每个模板变量。

最后,尝试调用时去掉“HTML”参数addTemplateVariable方法,看看是否有差别。 如果你没有实际使用HTML,那么就在路过的“HTML”参数没有任何意义。 相反,如果你使用的HTML,那么损坏的文件可能是不正确的HTML结构的情况下,导致微软的Word来标志的文档损坏。



文章来源: Corrupted .docx download using phpdocx
标签: php docx phpdocx