简体   繁体   English

PHPWORD 的问题

[英]Issue with PHPWORD

I am using draftjs and phpword.我正在使用 Draftjs 和 phpword。 FRom draftjs had a json objects using that i am constructing a word file. FRom Draftjs 有一个 json 对象,我正在使用它构建一个 word 文件。 After that i am trying to merge the target file and template file which already stored.之后我试图合并已经存储的目标文件和模板文件。 After merge the template using converting both source and target file into XML format by using this writing the target file filled with the contents stored in source document.合并模板后,使用此方法将源文件和目标文件都转换为 XML 格式,目标文件将填充源文档中存储的内容。

I got the unusual XML formatting fromthe source file.我从源文件中得到了不寻常的 XML 格式。

generate.php

<?php
$listFormatNumOL = 1;
$listFormatNumUL = 1;

function makeWordStrings($section, $decoded, $demographics, $calledSnapshot, $tabSize, $defaultIndent){
    $removeBlanks = 0;
    $lineStays = 0;
    $allBlanks = array();
    $blanksCondition = array();
        
    foreach($decoded['blocks'] AS $k=>$v){
        $styles = array();
        $offset = array();
        
        $breakOffset = array();
        $breakOffset[0] = 1;
        $text = $v['text'];
        
        $breakOffset[mb_strlen($text)] = 1;
        foreach($v['inlineStyleRanges'] AS $l=>$m){
            $breakOffset[$m['offset']] = 1;
            $breakOffset[$m['offset'] + $m['length']] = 1;
        }
        
        $breakOffset = array_keys($breakOffset);
        
        sort($breakOffset); 
        
        
        for($i=1; $i<sizeof($breakOffset); $i++){
            foreach($v['inlineStyleRanges'] AS $l=>$m){
                if($m['offset'] <= $breakOffset[$i-1] && ($m['offset']+$m['length']) >= $breakOffset[$i]){
                    if(!isset($styles[$breakOffset[$i-1]]))
                        $styles[$breakOffset[$i-1]] = array();
                    $wer = getStyle($m['style']);
                    $styles[$breakOffset[$i-1]][$wer[0]] = $wer[1];
                    $offset[$breakOffset[$i-1]] = $breakOffset[$i] - $breakOffset[$i-1];
                }
            }
        }
        
        
        ksort($offset);
        
        
        $strarr = array();
        
        if($text == "*****PAGE BREAK - TYPE FROM NEXT LINE*****"){
            $section -> addPageBreak();
            continue;
        }
        if($text == '{{content}}'){
            $newindent = $defaultIndent;
            foreach($v['data'] AS $l=>$m){
                foreach($m AS $x=>$y){
                    if($x == 'indentation')
                        $newindent += intval($y>0?$y:0);
                }
            }
            makeWordStrings($section, $calledSnapshot, $demographics, '', $tabSize, $newindent);
            continue;
        }
        
        
        if(mb_stripos($text, '([[') === 0){
            $removeBlanks = 1;
            $lineStays = 1;
        }
        else if(mb_stripos($text, '[[') === 0){
            $removeBlanks = 1;
        }
        
        
        if(!empty($offset))
        {
            $it = 0;
            
            foreach($offset AS $l=>$m){
                $strarr[$it] = mb_substr($text, $it, $l-$it);
                $strarr[$l] = mb_substr($text, $l, $m);
                $it = $l + $m;
                
            }
            $strarr[$it] = mb_substr($text, $it);
        }
        else{
            $strarr[0] = $text;
        }       
        
        $paragraphStyles = array('lineHeight'=>1, 'indentation'=>array('left'=>intval(ceil($tabSize * $defaultIndent * 15 * 48 / 1.27))));
        foreach($v['data'] AS $l=>$m){
            foreach($m AS $x=>$y){
                if($x == 'lineHeight')
                    $paragraphStyles['lineHeight'] = $y;
                else if($x == 'indentation'){
                    $paragraphStyles['indentation']['left'] = intval(ceil($tabSize * ($y + $defaultIndent) * 15 * 48 / 1.27));
                }
                else if($x == 'hanging'){
                    $paragraphStyles['indentation']['hanging'] = intval(ceil($tabSize * $y * 15 * 48 / 1.27));
                    $paragraphStyles['indentation']['left'] = intval(ceil($tabSize * ($y + $defaultIndent) * 15 * 48 / 1.27));
                }
                else if($x == 'textAlign')
                {
                    switch($y){
                        case 'left':
                            $paragraphStyles['alignment'] = 'left';
                            break;
                        case 'right':
                            $paragraphStyles['alignment'] = 'right';
                            break;
                        case 'center':
                            $paragraphStyles['alignment'] = 'center';
                            break;
                        case 'justify':
                            $paragraphStyles['alignment'] = 'both';
                            break;
                    }
                    
                }
            }
        }
        
        if($lineStays == 1){
            array_push($blanksCondition, convertKeysToValues($text, $demographics)[1]);
            array_push($allBlanks, array($v, $strarr, $paragraphStyles, $offset, $styles));
        }
        else if($removeBlanks == 1){
            $bg = convertKeysToValues($text, $demographics);
            if($bg[1] == 0){
                $section = addToDoc($section, $v, $strarr, $paragraphStyles, $demographics, $offset, $styles, $decoded, $tabSize, $defaultIndent);
            }
        }
        else
            $section = addToDoc($section, $v, $strarr, $paragraphStyles, $demographics, $offset, $styles, $decoded, $tabSize, $defaultIndent);
        
        $removeBlanks = 0;
        
        if(mb_stripos($text, ']])') + 3 == mb_strlen($text)){
            if(!in_array(0, $blanksCondition))
            {
                foreach($allBlanks AS $n=>$m){
                    $section = addToDoc($section, $m[0], array(''), $m[2], $demographics, array(), $m[4], $decoded, $tabSize, $defaultIndent);
                }
            }
            else{
                foreach($allBlanks AS $n=>$m){
                    if($blanksCondition[$n] == 0){
                        $section = addToDoc($section, $m[0], $m[1], $m[2], $demographics, $m[3], $m[4], $decoded, $tabSize, $defaultIndent);
                    }
                }
            }
            
            $lineStays = 0;
            $allBlanks = array();
            $blanksCondition = array();
        }
        
    }
}

function str_split_unicode($str, $l = 0) {
    if ($l > 0) {
        $ret = array();
        $len = mb_strlen($str, "UTF-8");
        for ($i = 0; $i < $len; $i += $l) {
            $ret[] = mb_substr($str, $i, $l, "UTF-8");
        }
        return $ret;
    }
    return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}

function addToDoc($section, $v, $strarr, $paragraphStyles, $demographics, $offset, $styles, $decoded, $tabSize, $defaultIndent){
    global $phpWord;
    global $listFormatNumOL, $listFormatNumUL;
    $moveahead = 1;
    
    $newindent = $defaultIndent;
    foreach($v['data'] AS $l=>$m){
        foreach($m AS $x=>$y){
            if($x == 'indentation')
                $newindent += intval($y>0?$y:0);
        }
    }
    $phpWord->addNumberingStyle(
        'ordered_list-'.$listFormatNumOL,
        array(
            'type'   => 'singleLevel',
            'levels' => array(
                array('format' => 'decimal', 'text' => '%1.', 'left' => 360, 'hanging' => 360, 'tabPos' => 360),
                array('format' => 'upperLetter', 'text' => '%2.', 'left' => 720, 'hanging' => 360, 'tabPos' => 720),
            ),
        )
    );

    $predefinedMultilevel = array('listType' => \PhpOffice\PhpWord\Style\ListItem::TYPE_BULLET_FILLED);
    
    
    
    foreach($v['entityRanges'] AS $t=>$h){
        
        if($decoded['entityMap'][$h['key']]['type'] == 'TABLE')
        {
            $moveahead = 0;
            $tabledata = $decoded['entityMap'][$h['key']]['data'];
            $table = $section->addTable(array('borderSize' => 6, 'borderColor' => '999999', 'indent'=> new PhpOffice\PhpWord\ComplexType\TblWidth(ceil($tabSize * $newindent * 15 * 48 / 1.27)), 'width'=>100*50 - ceil($tabSize * $newindent * 15 * 48 * 20 / (50 * 1.27)), 'unit'=>\PhpOffice\PhpWord\Style\Table::WIDTH_PERCENT, 'layout'=>PhpOffice\PhpWord\Style\Table::LAYOUT_FIXED));
            foreach($tabledata['table'] AS $z=>$p){
                $table->addRow();
                foreach($p AS $t=>$f){
                    $celltr = $table->addCell();
                    $celltr = makeWordStrings($celltr, json_decode($f, true), $demographics, '', $tabSize, 0);
                }
            } 
            
        }
    }
    
    if($moveahead){
        if($v['type'] == 'unstyled'){
            $listFormatNumUL++;
            $listFormatNumOL++;
                    
            if(sizeof($strarr)==1 && $strarr[0]==''){
                $erstyle = array();
                foreach($v['inlineStyleRanges'] AS $l=>$m){
                    $wer = getStyle($m['style']);
                    $erstyle[$wer[0]] = $wer[1];
                }
                if(!empty($erstyle))
                {
                    $section->addTextBreak(1, $erstyle, $paragraphStyles);
                }
                else
                    $section->addTextBreak(1, null, $paragraphStyles);
            }
            else{
                $startOffset = 0;
                
                $comments = array();
                
                foreach($v['entityRanges'] AS $t=>$h){
                    if($decoded['entityMap'][$h['key']]['type'] == 'COMMENT')
                    {
                        $commentdata = $decoded['entityMap'][$h['key']]['data'];
                        foreach($commentdata['comment'] AS $z=>$p){
                            $comm = new \PhpOffice\PhpWord\Element\Comment($p['user'], new \DateTime(), 'my_initials');
                            $comm->addText($p['comment']);
                            array_push($comments, array('start'=>$h['offset'], 'end'=>$h['offset']+$h['length'] - 1, 'comm'=>$comm));
                        }
                        
                    }
                }
                
                $textrun = $section->addTextRun($paragraphStyles);
                
                
                
                $strarr = afterClearingExtraSpaces($strarr, $demographics);
                
                foreach($strarr AS $l=>$m){
                    $democonv = $m;
                    if(mb_strlen($democonv) > 0){                       
                        $supbreak = explode('<sup>', $democonv);
                        if(sizeof($supbreak) > 1){
                            $newst = $styles[$l];
                            $newst['superScript'] = true;
                            $textrun->addText($supbreak[0], $styles[$l], array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                            $textrun->addText($supbreak[1], $newst, array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                            $textrun->addText($supbreak[2], $styles[$l], array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                        }
                        else{
                            $breakstring = str_split_unicode($democonv, 1);
                            
                            $nextcapital = 1;
                            
                            foreach($breakstring AS $z=>$p){
                                if(!isset($offset[$l])){
                                    $retext = xmlEntities($p);
                                    
                                    if($retext == "\n")
                                        $textToComment = $textrun->addTextBreak();
                                    else
                                        $textToComment = $textrun->addText($retext, null, array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                                }
                                else{                                   
                                    $retext = xmlEntities($nextcapital?convertToProperCase($p, $styles[$l]):$p);
                                    
                                    if($retext == "\n")
                                        $textToComment = $textrun->addTextBreak();
                                    else
                                        $textToComment = $textrun->addText($retext, $styles[$l], array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                                }
                                
                                foreach($comments AS $q=>$w){
                                    if($w['start'] == $z+$startOffset+$q)
                                        $w['comm']->setStartElement($textToComment);
                                    if($w['end'] == $z+$startOffset-$q)
                                        $w['comm']->setEndElement($textToComment);
                                }
                                
                                if($p == ' ')
                                    $nextcapital = 1;
                                else
                                    $nextcapital = 0;
                            }
                            
                            $startOffset += sizeof($breakstring);
                        }
                        
                        
                    }
                }
                
                foreach($comments AS $q=>$w){
                    $phpWord->addComment($w['comm']);
                }
            }
        }

        if($v['type'] == 'unordered-list-item'){
            $listFormatNumUL++;
            
            $tempPS = $paragraphStyles;
            unset($tempPS['indentation']);
            
            $listItemRun = $section->addListItemRun($v['depth'], $predefinedMultilevel, $tempPS);
            
            
            if(sizeof($strarr)==1 && $strarr[0]==''){
                $erstyle = array();
                foreach($v['inlineStyleRanges'] AS $l=>$m){
                    $wer = getStyle($m['style']);
                    $erstyle[$wer[0]] = $wer[1];
                }
                if(!empty($erstyle))
                    $listItemRun->addText("", $erstyle);
                else
                    $listItemRun->addText("");
            }
            else{
                $startOffset = 0;
                
                $comments = array();
                
                foreach($v['entityRanges'] AS $t=>$h){
                    if($decoded['entityMap'][$h['key']]['type'] == 'COMMENT')
                    {
                        $commentdata = $decoded['entityMap'][$h['key']]['data'];
                        foreach($commentdata['comment'] AS $z=>$p){
                            $comm = new \PhpOffice\PhpWord\Element\Comment($p['user'], new \DateTime(), 'my_initials');
                            $comm->addText($p['comment']);
                            array_push($comments, array('start'=>$h['offset'], 'end'=>$h['offset']+$h['length'] - 1, 'comm'=>$comm));
                        }
                        
                    }
                }
                $strarr = afterClearingExtraSpaces($strarr, $demographics);
                foreach($strarr AS $l=>$m){
                    $democonv = $m;
                    if(mb_strlen($democonv) > 0){
                    
                        $breakstring = str_split_unicode($democonv, 1);
                        
                        $nextcapital = 1;
                        
                        foreach($breakstring AS $z=>$p){
                        
                            if(!isset($offset[$l])){
                                $retext = xmlEntities($p);
                                
                                if($retext == "\n")
                                    $textToComment = $listItemRun->addTextBreak();
                                else
                                    $textToComment = $listItemRun->addText($retext, null, array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                            }
                            else{
                                $retext = xmlEntities($nextcapital?convertToProperCase($p, $styles[$l]):$p);
                                
                                if($retext == "\n")
                                    $textToComment = $listItemRun->addTextBreak();
                                else
                                    $textToComment = $listItemRun->addText($retext, $styles[$l], array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                            }
                            foreach($comments AS $q=>$w){
                                if($w['start'] == $z+$startOffset+$q)
                                    $w['comm']->setStartElement($textToComment);
                                if($w['end'] == $z+$startOffset-$q)
                                    $w['comm']->setEndElement($textToComment);
                            }
                            
                            if($p == ' ')
                                $nextcapital = 1;
                            else
                                $nextcapital = 0;
                        }
                        
                        $startOffset += sizeof($breakstring);
                    }
                }
                foreach($comments AS $q=>$w){
                    $phpWord->addComment($w['comm']);
                }
            }
            
        }

        if($v['type'] == 'ordered-list-item'){
            
            $listFormatNumUL++;
            $tempPS = $paragraphStyles;
            unset($tempPS['indentation']);
            
            $listItemRun = $section->addListItemRun($v['depth'], 'ordered_list-'.$listFormatNumOL, $tempPS);
            if(sizeof($strarr)==1 && $strarr[0]==''){
                $erstyle = array();
                foreach($v['inlineStyleRanges'] AS $l=>$m){
                    $wer = getStyle($m['style']);
                    $erstyle[$wer[0]] = $wer[1];
                }
                if(!empty($erstyle))
                    $listItemRun->addText("", $erstyle);
                else
                    $listItemRun->addText("");
            }
            else{
                $startOffset = 0;
                
                $comments = array();
                foreach($v['entityRanges'] AS $t=>$h){
                    if($decoded['entityMap'][$h['key']]['type'] == 'COMMENT')
                    {
                        $commentdata = $decoded['entityMap'][$h['key']]['data'];
                        foreach($commentdata['comment'] AS $z=>$p){
                            $comm = new \PhpOffice\PhpWord\Element\Comment($p['user'], new \DateTime(), 'my_initials');
                            $comm->addText($p['comment']);
                            array_push($comments, array('start'=>$h['offset'], 'end'=>$h['offset']+$h['length'] - 1, 'comm'=>$comm));
                        }
                        
                    }
                }
                $strarr = afterClearingExtraSpaces($strarr, $demographics);
                foreach($strarr AS $l=>$m){
                    $democonv = $m;
                    if(mb_strlen($democonv) > 0){
                        $breakstring = str_split_unicode($democonv, 1);
                        
                        $nextcapital = 1;
                        
                        foreach($breakstring AS $z=>$p){
                            if(!isset($offset[$l])){
                                $retext = xmlEntities($p);
                                
                                if($retext == "\n"){
                                    $textToComment = $listItemRun->addTextBreak();
                                
                                }
                                else
                                    $textToComment = $listItemRun->addText($retext, null, array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                                
                            }
                            else{
                                $retext = xmlEntities($nextcapital?convertToProperCase($p, $styles[$l]):$p);
                                
                                if($retext == "\n"){
                                    $textToComment = $listItemRun->addTextBreak();
                                }
                                else
                                    $textToComment = $listItemRun->addText($retext, $styles[$l], array('tabs' => array(new \PhpOffice\PhpWord\Style\Tab('left', 1550))));
                            }
                            foreach($comments AS $q=>$w){
                                if($w['start'] == $z+$startOffset+$q)
                                    $w['comm']->setStartElement($textToComment);
                                if($w['end'] == $z+$startOffset-$q)
                                    $w['comm']->setEndElement($textToComment);
                            }
                            
                            if($p == ' ')
                                $nextcapital = 1;
                            else
                                $nextcapital = 0;
                        }
                        
                        $startOffset += sizeof($breakstring);
                    }
                }
                foreach($comments AS $q=>$w){
                    $phpWord->addComment($w['comm']);
                }
            }
        }
    }
    return $section;
}
$phpWord = null;
function generateTranscriptionTaskWordFile($tid, $storageDirectory, $whichPart, $includeNoName=0){
    global $dbc;
    global $phpWord;
    
    $query = mysqli_query($dbc, "SELECT name, dictator_id FROM task WHERE id=$tid LIMIT 1");
    $filename = null;
    $dict_id = 0;
    while($query && $result = mysqli_fetch_array($query, MYSQLI_ASSOC)){
        $filename = stripcslashes($result['name']);
        $dict_id = mysqli_fetch_array(mysqli_query($dbc, "SELECT name FROM users WHERE id=".$result['dictator_id']." AND users.access IN (2,12) LIMIT 1"), MYSQLI_ASSOC);
        $dict_id = $dict_id['name'];
    }
    
    if($dict_id && mb_strlen($dict_id) > 0){
        if($whichPart == 'ALL')
            $query = mysqli_query($dbc, "SELECT id, file_part_number, snapshot, template_id FROM task_history WHERE id IN (SELECT MAX(id) AS id FROM task_history WHERE task_id=$tid GROUP BY file_part_number)");
        else
            $query = mysqli_query($dbc, "SELECT id, file_part_number, snapshot, template_id FROM task_history WHERE id IN (SELECT MAX(id) AS id FROM task_history WHERE task_id=$tid GROUP BY file_part_number) AND file_part_number IN (".implode(',', $whichPart).")");
        
        $rcnt = 0;
        
        $wordFilesArray = array();
        
        while($query && $result = mysqli_fetch_array($query, MYSQLI_ASSOC))
        {
            $rcnt++;
            if($result['template_id']){
                
                $newquery = mysqli_query($dbc, "SELECT snapshot, header from template_history WHERE template_id=".$result['template_id']." ORDER BY id DESC LIMIT 1");
                $newresult = mysqli_fetch_array($newquery, MYSQLI_ASSOC);
                
                $tabSize = mysqli_fetch_array(mysqli_query($dbc, "SELECT tabsize FROM template WHERE id=".$result['template_id']), MYSQLI_ASSOC)['tabsize'];
                
                $demographics_query = mysqli_query($dbc, "SELECT template_demo_val.value AS value, template_demo.demo_key AS keyu, template_demo.demo_name AS keyn, template_demo.demo_type AS type FROM template_demo_val INNER JOIN template_demo ON template_demo_val.tempdemo_id=template_demo.id WHERE template_demo_val.task_id=$tid AND template_demo_val.part_num=".$result['file_part_number']."");
                
                $demographics = array();
                
                while($demographics_query && $newres = mysqli_fetch_array($demographics_query, MYSQLI_ASSOC)){
                    $demographics[$newres['keyu']] = array('value'=>$newres['value'], 'type'=>$newres['type'], 'name'=>$newres['keyn']);
                }
                
                if(!empty($newresult['header']) && !empty($result['snapshot']))
                {
                    \PhpOffice\PhpWord\Settings::setOutputEscapingEnabled(true);
                    $phpWord = new \PhpOffice\PhpWord\PhpWord();
                    $section = $phpWord->addSection();
                    
                    if(!empty($result['snapshot']))
                    {
                        $decoded = json_decode($result['snapshot'], true);
                        for($i = sizeof($decoded['blocks']) - 1; $i>= 0; $i--){
                            if($decoded['blocks'][$i]['text'] != '')
                                break;
                            else{
                                array_pop($decoded['blocks']);
                            }
                            
                        }
                        makeWordStrings($section, json_decode($result['snapshot'], true), $demographics, $decoded, $tabSize, 0);
                    }
                    
                    $newfilename = $filename;
                    if(mysqli_num_rows($query) > 1){
                        if($result['file_part_number'] > 1)
                            $newfilename .= '_'.(strlen($result['file_part_number']-1)==1?'0'.($result['file_part_number']-1):($result['file_part_number']-1));
                        
                    }
                    $phpWord->save(WITHOUTTEMPLATE."$newfilename.docx", 'Word2007');
                    
                    $templateFile  = TEMPLATES.$newresult['header'];
                    $generatedFile = WITHOUTTEMPLATE."$newfilename.docx";
                    
                    $targetFile    = $storageDirectory.($includeNoName==1?"":"$newfilename.docx");
                    copy($templateFile, $targetFile);
                    $targetZip = new ZipArchive();
                    if ($targetZip->open($targetFile, ZipArchive::CREATE) !== true) {
                        return false;
                    }
                    $targetDocument = $targetZip->getFromName('word/document.xml');
                    $targetRelationsDocument = $targetZip->getFromName('word/_rels/document.xml.rels');
                    $targetCorePropsDocument = $targetZip->getFromName('docProps/core.xml');
                    $targetCustomPropsDocument = $targetZip->getFromName('docProps/custom.xml');
                    $targetContentTypesDocument = $targetZip->getFromName('[Content_Types].xml');
                    $targetContentTypesDocuments = $targetZip->getFromName('word/numbering.xml');
                    
                    $targetDom      = new DOMDocument();
                    $targetDom->loadXML($targetDocument);
                    $targetCorePropsDom = new DOMDocument();
                    $targetCorePropsDom->loadXML($targetCorePropsDocument);                 
                    
                    $targetContentTypesDom = new DOMDocument();
                    $targetContentTypesDom->loadXML($targetContentTypesDocument);
                    
                    $targetXPath = new \DOMXPath($targetDom);
                    $targetXPath->registerNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

                    $sourceZip = new \ZipArchive();
                    $sourceZip->open($generatedFile, ZipArchive::CREATE);
                    $sourceDocument = $sourceZip->getFromName('word/document.xml');
                    $sourceRelationsDocument = $sourceZip->getFromName('word/_rels/document.xml.rels');
                    $sourceContentTypesDocument = $sourceZip->getFromName('[Content_Types].xml');
                    $sourceContentTypesDocuments = $sourceZip->getFromName('word/numbering.xml');
                    
                    $sourceDom      = new DOMDocument();
                    $sourceDom->loadXML($sourceDocument);
                    
                    $sourceRelationsDom = new DOMDocument();
                    $sourceRelationsDom->loadXML($sourceRelationsDocument);

                    $sourceContentTypes = new DOMDocument();
                    $sourceContentTypes->loadXML($sourceContentTypesDocument);
                    
                    $sourceXPath = new \DOMXPath($sourceDom);
                    $sourceXPath->registerNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
                    
                    $sourceRelationsXPath = new \DOMXPath($sourceRelationsDom);
                     
                    $replacementMarkerNode = $targetXPath->query('//w:p[contains(translate(normalize-space(), " ", ""),"$CONTENT$")]')[0];
                    $sourceNodes = $sourceXPath->query('//w:document//w:body/*[not(self::w:sectPr)]');                  
                    $relationsArr = array();
                    $startId = 700;
                    
                    $ifThereAreComments = 0;
                    $ifThereAreNumber = 0;
                    
                    for ($i = 0; $i < $sourceZip->numFiles; $i++) {
                        if(strpos($sourceZip->getNameIndex($i), 'media') > 0 || strpos($sourceZip->getNameIndex($i), 'comments.xml') > 0){
                            if(strpos($sourceZip->getNameIndex($i), 'comments.xml') > 0)
                                $ifThereAreComments = 1;
                            
                            $imagefile = $sourceZip->getFromName($sourceZip->getNameIndex($i));
                            $temp = fopen(TEMPORARYFILES.substr(bin2hex(random_bytes(5)),0, 5), "w");
                            fwrite($temp, $imagefile);  
                            fseek($temp, 0);
                            
                            $targetZip -> addFile(stream_get_meta_data($temp)['uri'], $sourceZip->getNameIndex($i));
                        }
                        if(strpos($sourceZip->getNameIndex($i), 'numbering.xml') > 0){
                            $ifThereAreNumber = 1;
                        }
                            
                    }
                    foreach ($sourceNodes as $sourceNode) {
                        $checkifImage = $sourceNode -> getElementsByTagNameNS ("urn:schemas-microsoft-com:vml", 'imagedata');
                        foreach($checkifImage AS $t)
                        {
                            $rid = $t->getAttribute('r:id');
                            $relationsArr[$rid] = array('id'=>'rId'.$startId, 'media'=>'');
                            $t->setAttribute('r:id', $relationsArr[$rid]['id']);
                            $startId++;
                        }
                        $imported = $replacementMarkerNode->ownerDocument->importNode($sourceNode, true);
                        $inserted = $replacementMarkerNode->parentNode->insertBefore($imported, $replacementMarkerNode);
                    }
                    $replacementMarkerNode->parentNode->removeChild($replacementMarkerNode); 
                    $targetZip->addFromString('word/document.xml', $targetDom->saveXML());
                    
                    $getSourceRelationsTree = $sourceRelationsDom -> getElementsByTagName('Relationship');
                    foreach($getSourceRelationsTree AS $t){
                        $rid = $t->getAttribute('Id');
                        if(isset($relationsArr[$rid])){
                            $relationsArr[$rid]['media'] = $t->getAttribute('Target');
                        }
                    }
                    
                    if($ifThereAreComments){
                        $targetRelationsDom = new DOMDocument();
                        $targetRelationsDom->loadXML($targetRelationsDocument);
                    
                        $parentDom = $targetRelationsDom->getElementsByTagName('Relationships');
                        $relationsElement = $targetRelationsDom->createElement("Relationship");
                        
                        $domAttribute = $targetRelationsDom->createAttribute('Id');
                        $domAttribute->value = 'rId1000';
                        $relationsElement->appendChild($domAttribute);
                        
                        $domAttribute = $targetRelationsDom->createAttribute('Target');
                        $domAttribute->value = 'comments.xml';
                        $relationsElement->appendChild($domAttribute);
                        $domAttribute = $targetRelationsDom->createAttribute('Type');
                        $domAttribute->value = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";
                        $relationsElement->appendChild($domAttribute);
                        
                        $parentDom[0]->appendChild($relationsElement);
                        
                        $targetZip->addFromString('word/_rels/document.xml.rels', $targetRelationsDom->saveXML());
                        
                        
                        $parentDom = $targetContentTypesDom->getElementsByTagName('Types');
                        $relationsElement = $targetContentTypesDom->createElement("Override");
                        
                        $domAttribute = $targetContentTypesDom->createAttribute('PartName');
                        $domAttribute->value = '/word/comments.xml';
                        $relationsElement->appendChild($domAttribute);
                        
                        $domAttribute = $targetContentTypesDom->createAttribute('ContentType');
                        $domAttribute->value = 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml';
                        $relationsElement->appendChild($domAttribute);
                        
                        $parentDom[0]->appendChild($relationsElement);
                        
                        $targetZip->addFromString('[Content_Types].xml', $targetContentTypesDom->saveXML());
                        
                        
                    }
                    if(!empty($relationsArr)){
                        $targetRelationsDom = new DOMDocument();
                        $targetRelationsDom->loadXML($targetRelationsDocument);
                    
                        $parentDom = $targetRelationsDom -> getElementsByTagName('Relationships');
                        foreach($relationsArr AS $t){
                            $relationsElement = $targetRelationsDom->createElement("Relationship");
                            
                            $domAttribute = $targetRelationsDom->createAttribute('Id');
                            $domAttribute->value = $t['id'];
                            $relationsElement->appendChild($domAttribute);
                            
                            $domAttribute = $targetRelationsDom->createAttribute('Target');
                            $domAttribute->value = $t['media'];
                            $relationsElement->appendChild($domAttribute);
                            
                            $domAttribute = $targetRelationsDom->createAttribute('Type');
                            $domAttribute->value = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
                            $relationsElement->appendChild($domAttribute);
                            
                            $parentDom[0]->appendChild($relationsElement);
                        }
                        
                        $targetZip->addFromString('word/_rels/document.xml.rels', $targetRelationsDom->saveXML());
                    }
                    
                    $parentDom = $targetCorePropsDom -> getElementsByTagNameNS("http://schemas.openxmlformats.org/package/2006/metadata/core-properties", 'coreProperties');
                    $toRem = $parentDom[0]->getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", 'title')->Item(0);
                    $relationsElement = $targetCorePropsDom->createElement("dc:title", isset($demographics['{{title}}'])?$demographics['{{title}}']['value']:null);
                        
                    $parentDom[0]->appendChild($relationsElement);
                    $toRem->parentNode->removeChild($toRem);
                    
                    $toRem = $parentDom[0]->getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", 'subject')->Item(0);
                    $relationsElement = $targetCorePropsDom->createElement("dc:subject", $dict_id);
                        
                    $parentDom[0]->appendChild($relationsElement);
                    $toRem->parentNode->removeChild($toRem);
                    
                    
                    $targetZip->addFromString('docProps/core.xml', $targetCorePropsDom->saveXML());
                    
                    $targetZip->close();
                    
                    $wordFilesArray[$result['file_part_number']] = $targetFile;
                }
                
            }
        } 
        
        return array('r' => 1, 'd'=>array('totFileParts'=>$rcnt, 'wordFiles'=>$wordFilesArray));
    }
    
    
    return array('r'=>0, 'e'=>'INVALID_ACTIVITY');
}
    

很抱歉这个愚蠢的问题,因为每个单词都通过函数以 UTF-8 编码并在循环内传递,看起来很不寻常

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM