我有一个项目,我们使用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:如果你想用新信息回答这个问题,我会接受你的回答。
答案 0 :(得分:2)
将问题缩小到输出文件的代码部分后,我终于在HEX编辑器中打开文件,发现问题是文件输出成功后,Web前端将附加HTML的开头到docx文件的末尾制作一个'损坏的'文件。在unlink()
修复整件事之后的这一行:
exit;
答案 1 :(得分:1)
如果不直接访问模板文件,这很难确定,但这里有一些模板引擎经常失败的指针:
print print_r($this->rec->variable_name, true);
,然后检查以确保所有变量都是字符串,并且没有任何变量为NULL。最后,尝试在调用addTemplateVariable
方法时删除'html'参数,看看是否会产生影响。如果你实际上没有使用HTML,那么传递'html'参数是没有意义的。相反,如果您使用的是HTML,则损坏的文件可能是HTML结构不正确的情况,导致Microsoft Word将文档标记为已损坏。