Description
( This was all working with v0.12, however we upgraded our server to PHP 7, and as a result, had to update phpword to v0.13. Since we use a later Zend Framework, I also had to fork and modify the phpword repo to not require specific zendframework/zendframework: 2.4
but instead zendframework/zendframework: ^2
)
I have a .docx file that I've created that has several ${xxx}
phpword placeholders in it. With the upgrade to phpword v0.13, saving the files is now corrupting them. Trying to open the document complains of a mismatched tag (xml below), and even after correcting the mismatch, the document itself still has malformed formatting from the original.
Code for template variable swapping:
$template = new PhpWord\TemplateProcessor($this->templatePath);
foreach ($this->transposeVars() as $key => $value) {
$template->setValue($key, $value);
}
$template->saveAs($fileName);
Original document.xml
<wps:txbx><w:txbxContent><w:p w:rsidR="00B47627" w:rsidRPr="00905ACC" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="52"/><w:szCs w:val="52"/></w:rPr></w:pPr><w:r w:rsidRPr="00905ACC"><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="52"/><w:szCs w:val="52"/></w:rPr><w:t>{{$pub</w:t></w:r><w:r w:rsidR="00643EFB"><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="52"/><w:szCs w:val="52"/></w:rPr><w:t xml:space="preserve"> </w:t></w:r><w:r w:rsidRPr="00905ACC"><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="52"/><w:szCs w:val="52"/></w:rPr><w:t>}}</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>My Company</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:ind w:right="45"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>My Division</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>My Address</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>My Address 2</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRPr="004167CD" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr></w:p></w:txbxContent></wps:txbx>
Corrupted after saving document.xml
(notice the mismatched <wps:txbx>
tag, as well as for some reason repeating and concatenating text earlier on in the xml.
<wps:txbx><w:txbxContent><w:p w:rsidR="00B47627" w:rsidRPr="00905ACC" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="52"/><w:szCs w:val="52"/></w:rPr></w:pPr><w:r w:rsidRPr="00905ACC"><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="52"/><w:szCs w:val="52"/></w:rPr><w:t>{{$pub }}My CompanyMy DivisionMy AddressMy Address 2{{$pub }}</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>My Company</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:ind w:right="45"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>My Division</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>My Address</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>My Address 2</w:t></w:r></w:p><w:p w:rsidR="00B47627" w:rsidRPr="004167CD" w:rsidRDefault="00B47627" w:rsidP="00B47627"><w:pPr><w:spacing w:after="0"/><w:rPr><w:rFonts w:ascii="Open Sans" w:hAnsi="Open Sans" w:cs="Open Sans"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:pPr></w:p></w:txbxContent></v:textbox>
Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.