[英]Issue with PHPWORD
我正在使用 Draftjs 和 phpword。 FRom Draftjs 有一个 json 对象,我正在使用它构建一个 word 文件。 之后我试图合并已经存储的目标文件和模板文件。 合并模板后,使用此方法将源文件和目标文件都转换为 XML 格式,目标文件将填充源文档中存储的内容。
我从源文件中得到了不寻常的 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.