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