Dokumentum template-be ágyazása php-vel
2022-05-24T15:27:21+02:00
2022-05-24T15:27:29+02:00
2022-06-29T08:07:40+02:00
Lowclick
Sziasztok, 

találtam egy php kódot a neten, ami tökéletesen elvégzi egy word.doc-ban lévő tartalom( Doc1.docx)  beágyazását egy másik word.doc -ban készült template-be (Doc2.docx), de sajnos a Doc1 formázásai az egyesített céldokumentumban  (MergeResult.docx) elvesznek

Alább bemásolom a kódot, ami elvégzi az egyesítést. Meg tudnátok mondani, hol kellene módosítani, hogy a formázásokat is megtartsa a céldoksiban?

A kód:
<?php
$templateFile  = "Doc2.docx";
$generatedFile = "Doc1.docx";
$targetFile    = "MergeResult.docx";
 
// copy template to target
copy($templateFile, $targetFile);
 
// open target
$targetZip = new \ZipArchive();
$targetZip->open($targetFile);
$targetDocument = $targetZip->getFromName('word/document.xml');
$targetDom      = new DOMDocument();
$targetDom->loadXML($targetDocument);
$targetXPath = new \DOMXPath($targetDom);
$targetXPath->registerNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
 
// open source
$sourceZip = new \ZipArchive();
$sourceZip->open($generatedFile);
$sourceDocument = $sourceZip->getFromName('word/document.xml');
$sourceDom      = new DOMDocument();
$sourceDom->loadXML($sourceDocument);
$sourceXPath = new \DOMXPath($sourceDom);
$sourceXPath->registerNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
 
/** @var DOMNode $replacementMarkerNode node containing the replacement marker $CONTENT$ */
$replacementMarkerNode = $targetXPath->query('//w:p[contains(translate(normalize-space(), " ", ""),"$CONTENT$")]')[0];
 
// insert source nodes before the replacement marker
$sourceNodes = $sourceXPath->query('//w:document/w:body/*[not(self::w:sectPr)]');
 
foreach ($sourceNodes as $sourceNode) {
    $imported = $replacementMarkerNode->ownerDocument->importNode($sourceNode, true);
    $inserted = $replacementMarkerNode->parentNode->insertBefore($imported, $replacementMarkerNode);
}
 
// remove $replacementMarkerNode from the target DOM
$replacementMarkerNode->parentNode->removeChild($replacementMarkerNode);
 
// save target
$targetZip->addFromString('word/document.xml', $targetDom->saveXML());
$targetZip->close();

echo "A dokumentum elkészült. <a href=MergeResult.docx>ITT LETÖLTHETŐ</a>";

?>
Mutasd a teljes hozzászólást!

abcd