使用PHP在docx文档

时间:2016-07-02 13:15:04

标签: php str-replace docx

我正在尝试搜索并替换Microsoft Word docx文档。我遇到的奇怪问题是,在7个发布的变量中,1和5不会替换。在检查Chrome工具时,它们都会显示在已发布的表单数据中。这些名字也拼写正确。

为了解释这段代码,我打开一个模板文档,将其复制到另一个名称(将被下载的命名文件),替换document.xml中的文本,然后替换页脚中的文本。然后我关闭文件并下载它。它下载,除了vars $ pname和$ hca2name不替换文档内部。所有其他变量都已正确更换。

非常感谢任何想法。谢谢。这是代码:

<?php
$pname = (string) $_POST['pname'];
$countyres = (string) $_POST['countyres'];
$a1name = (string) $_POST['a1name'];
$a2name = (string) $_POST['a2name'];
$hca1name = (string) $_POST['hca1name'];
$hca2name = (string) $_POST['hca2name'];
$atty = (string) $_POST['atty'];
$countyres = (string) $_POST['countyres'];
$fn = 'POA-'.$pname.'.docx';
$s = "docs_archive/PA-poas2no.docx";
$wordDoc = "POA-".$pname.".docx";
copy($s, $wordDoc);
$zip = new ZipArchive;
//This is the main document in a .docx file.
$fileToModify = 'word/document.xml';
if ($zip->open($wordDoc) === TRUE) {
    //Read contents into memory
    $oldContents = $zip->getFromName($fileToModify);
    //Modify contents:
    $newContents = str_replace('{pname}', $pname, $oldContents);
    $newContents = str_replace('{a1name}', $a1name, $newContents);
    $newContents = str_replace('{a2name}', $a2name, $newContents);
    $newContents = str_replace('{hca1name}', $hca1name, $newContents);
    $newContents = str_replace('{hca2name}', $hca2name, $newContents);
    $newContents = str_replace('{atty}', $atty, $newContents);
    $newContents = str_replace('{countyres}', $countyres, $newContents);
    //Delete the old...
    $zip->deleteName($fileToModify);
    //Write the new...
    $zip->addFromString($fileToModify, $newContents);
    //Open Footer and change vars there
    $ft = 'word/footer1.xml';
    $oldft = $zip->getFromName($ft);
    $newft = str_replace('{pname}', $pname, $oldft);
    $zip->deleteName($ft);
    $zip->addFromString($ft, $newft);
    $zip->close();
header('Content-Description: File Transfer');
header("Content-Type: application/force-download");
header('Content-Type: application/msword');
header('Content-Disposition: attachment; filename="'.$fn.'"');
header('Content-Transfer-Encoding: binary');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
readfile($fn);
unlink($fn);
exit();
}
?>

2 个答案:

答案 0 :(得分:0)

为了让任何未来读者遇到类似问题的好处,当我在压缩的docx文件中分析document.xml文件时,我的变量名称通常不是连续的而不是{pname}它将被分隔到{pname

打开主文档模板,进入文件,检查文档,检查问题。这将允许您清理文件并删除大部分插入的xml,我认为这是一些文档跟踪数据。

它对我有用。

答案 1 :(得分:0)

是的,请检查您的document.xml和footer1.xml文件。您的字段应该是连续的,但是当文件下载未以Word形式打开时,我的代码有一个问题。