PHPWord/Classes/PHPWord/Writer/Word2007/Base.php

788 lines
29 KiB
PHP
Executable File

<?php
/**
* PHPWord
*
* Copyright (c) 2014 PHPWord
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPWord
* @package PHPWord
* @copyright Copyright (c) 2014 PHPWord
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 0.7.0
*/
/**
* Class PHPWord_Writer_Word2007_Base
*/
class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
{
protected function _writeText(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Text $text, $withoutP = false)
{
$styleFont = $text->getFontStyle();
$SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false;
if (!$withoutP) {
$objWriter->startElement('w:p');
$styleParagraph = $text->getParagraphStyle();
$SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;
if ($SpIsObject) {
$this->_writeParagraphStyle($objWriter, $styleParagraph);
} elseif (!$SpIsObject && !is_null($styleParagraph)) {
$objWriter->startElement('w:pPr');
$objWriter->startElement('w:pStyle');
$objWriter->writeAttribute('w:val', $styleParagraph);
$objWriter->endElement();
$objWriter->endElement();
}
}
$strText = htmlspecialchars($text->getText());
$strText = PHPWord_Shared_String::ControlCharacterPHP2OOXML($strText);
$objWriter->startElement('w:r');
if ($SfIsObject) {
$this->_writeTextStyle($objWriter, $styleFont);
} elseif (!$SfIsObject && !is_null($styleFont)) {
$objWriter->startElement('w:rPr');
$objWriter->startElement('w:rStyle');
$objWriter->writeAttribute('w:val', $styleFont);
$objWriter->endElement();
$objWriter->endElement();
}
$objWriter->startElement('w:t');
$objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text
$objWriter->writeRaw($strText);
$objWriter->endElement();
$objWriter->endElement(); // w:r
if (!$withoutP) {
$objWriter->endElement(); // w:p
}
}
protected function _writeTextRun(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_TextRun $textrun)
{
$elements = $textrun->getElements();
$styleParagraph = $textrun->getParagraphStyle();
$SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;
$objWriter->startElement('w:p');
if ($SpIsObject) {
$this->_writeParagraphStyle($objWriter, $styleParagraph);
} elseif (!$SpIsObject && !is_null($styleParagraph)) {
$objWriter->startElement('w:pPr');
$objWriter->startElement('w:pStyle');
$objWriter->writeAttribute('w:val', $styleParagraph);
$objWriter->endElement();
$objWriter->endElement();
}
if (count($elements) > 0) {
foreach ($elements as $element) {
if ($element instanceof PHPWord_Section_Text) {
$this->_writeText($objWriter, $element, true);
} elseif ($element instanceof PHPWord_Section_Link) {
$this->_writeLink($objWriter, $element, true);
}
}
}
$objWriter->endElement();
}
protected function _writeParagraphStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Paragraph $style, $withoutPPR = false)
{
$align = $style->getAlign();
$spaceBefore = $style->getSpaceBefore();
$spaceAfter = $style->getSpaceAfter();
$spacing = $style->getSpacing();
$indent = $style->getIndent();
$tabs = $style->getTabs();
if (!is_null($align) || !is_null($spacing) || !is_null($spaceBefore) || !is_null($spaceAfter) || !is_null($indent) || !is_null($tabs)) {
if (!$withoutPPR) {
$objWriter->startElement('w:pPr');
}
if (!is_null($align)) {
$objWriter->startElement('w:jc');
$objWriter->writeAttribute('w:val', $align);
$objWriter->endElement();
}
if (!is_null($indent)) {
$objWriter->startElement('w:ind');
$objWriter->writeAttribute('w:firstLine', 0);
$objWriter->writeAttribute('w:left', $indent);
$objWriter->endElement();
}
if (!is_null($spaceBefore) || !is_null($spaceAfter) || !is_null($spacing)) {
$objWriter->startElement('w:spacing');
if (!is_null($spaceBefore)) {
$objWriter->writeAttribute('w:before', $spaceBefore);
}
if (!is_null($spaceAfter)) {
$objWriter->writeAttribute('w:after', $spaceAfter);
}
if (!is_null($spacing)) {
$objWriter->writeAttribute('w:line', $spacing);
$objWriter->writeAttribute('w:lineRule', 'auto');
}
$objWriter->endElement();
}
if (!is_null($tabs)) {
$tabs->toXml($objWriter);
}
if (!$withoutPPR) {
$objWriter->endElement(); // w:pPr
}
}
}
protected function _writeLink(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Link $link, $withoutP = false)
{
$rID = $link->getRelationId();
$linkName = $link->getLinkName();
if (is_null($linkName)) {
$linkName = $link->getLinkSrc();
}
$styleFont = $link->getFontStyle();
$SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false;
if (!$withoutP) {
$objWriter->startElement('w:p');
$styleParagraph = $link->getParagraphStyle();
$SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;
if ($SpIsObject) {
$this->_writeParagraphStyle($objWriter, $styleParagraph);
} elseif (!$SpIsObject && !is_null($styleParagraph)) {
$objWriter->startElement('w:pPr');
$objWriter->startElement('w:pStyle');
$objWriter->writeAttribute('w:val', $styleParagraph);
$objWriter->endElement();
$objWriter->endElement();
}
}
$objWriter->startElement('w:hyperlink');
$objWriter->writeAttribute('r:id', 'rId' . $rID);
$objWriter->writeAttribute('w:history', '1');
$objWriter->startElement('w:r');
if ($SfIsObject) {
$this->_writeTextStyle($objWriter, $styleFont);
} elseif (!$SfIsObject && !is_null($styleFont)) {
$objWriter->startElement('w:rPr');
$objWriter->startElement('w:rStyle');
$objWriter->writeAttribute('w:val', $styleFont);
$objWriter->endElement();
$objWriter->endElement();
}
$objWriter->startElement('w:t');
$objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text
$objWriter->writeRaw($linkName);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
if (!$withoutP) {
$objWriter->endElement(); // w:p
}
}
protected function _writePreserveText(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Footer_PreserveText $textrun)
{
$styleFont = $textrun->getFontStyle();
$styleParagraph = $textrun->getParagraphStyle();
$SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false;
$SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;
$arrText = $textrun->getText();
$objWriter->startElement('w:p');
if ($SpIsObject) {
$this->_writeParagraphStyle($objWriter, $styleParagraph);
} elseif (!$SpIsObject && !is_null($styleParagraph)) {
$objWriter->startElement('w:pPr');
$objWriter->startElement('w:pStyle');
$objWriter->writeAttribute('w:val', $styleParagraph);
$objWriter->endElement();
$objWriter->endElement();
}
foreach ($arrText as $text) {
if (substr($text, 0, 1) == '{') {
$text = substr($text, 1, -1);
$objWriter->startElement('w:r');
$objWriter->startElement('w:fldChar');
$objWriter->writeAttribute('w:fldCharType', 'begin');
$objWriter->endElement();
$objWriter->endElement();
$objWriter->startElement('w:r');
if ($SfIsObject) {
$this->_writeTextStyle($objWriter, $styleFont);
} elseif (!$SfIsObject && !is_null($styleFont)) {
$objWriter->startElement('w:rPr');
$objWriter->startElement('w:rStyle');
$objWriter->writeAttribute('w:val', $styleFont);
$objWriter->endElement();
$objWriter->endElement();
}
$objWriter->startElement('w:instrText');
$objWriter->writeAttribute('xml:space', 'preserve');
$objWriter->writeRaw($text);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->startElement('w:r');
$objWriter->startElement('w:fldChar');
$objWriter->writeAttribute('w:fldCharType', 'separate');
$objWriter->endElement();
$objWriter->endElement();
$objWriter->startElement('w:r');
$objWriter->startElement('w:fldChar');
$objWriter->writeAttribute('w:fldCharType', 'end');
$objWriter->endElement();
$objWriter->endElement();
} else {
$text = htmlspecialchars($text);
$text = PHPWord_Shared_String::ControlCharacterPHP2OOXML($text);
$objWriter->startElement('w:r');
if ($SfIsObject) {
$this->_writeTextStyle($objWriter, $styleFont);
} elseif (!$SfIsObject && !is_null($styleFont)) {
$objWriter->startElement('w:rPr');
$objWriter->startElement('w:rStyle');
$objWriter->writeAttribute('w:val', $styleFont);
$objWriter->endElement();
$objWriter->endElement();
}
$objWriter->startElement('w:t');
$objWriter->writeAttribute('xml:space', 'preserve');
$objWriter->writeRaw($text);
$objWriter->endElement();
$objWriter->endElement();
}
}
$objWriter->endElement(); // p
}
protected function _writeTextStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Font $style)
{
$font = $style->getName();
$bold = $style->getBold();
$italic = $style->getItalic();
$color = $style->getColor();
$size = $style->getSize();
$fgColor = $style->getFgColor();
$striketrough = $style->getStrikethrough();
$underline = $style->getUnderline();
$objWriter->startElement('w:rPr');
// Font
if ($font != 'Arial') {
$objWriter->startElement('w:rFonts');
$objWriter->writeAttribute('w:ascii', $font);
$objWriter->writeAttribute('w:hAnsi', $font);
$objWriter->writeAttribute('w:cs', $font);
$objWriter->endElement();
}
// Color
if ($color != '000000') {
$objWriter->startElement('w:color');
$objWriter->writeAttribute('w:val', $color);
$objWriter->endElement();
}
// Size
if ($size != 20) {
$objWriter->startElement('w:sz');
$objWriter->writeAttribute('w:val', $size);
$objWriter->endElement();
$objWriter->startElement('w:szCs');
$objWriter->writeAttribute('w:val', $size);
$objWriter->endElement();
}
// Bold
if ($bold) {
$objWriter->writeElement('w:b', null);
}
// Italic
if ($italic) {
$objWriter->writeElement('w:i', null);
$objWriter->writeElement('w:iCs', null);
}
// Underline
if (!is_null($underline) && $underline != 'none') {
$objWriter->startElement('w:u');
$objWriter->writeAttribute('w:val', $underline);
$objWriter->endElement();
}
// Striketrough
if ($striketrough) {
$objWriter->writeElement('w:strike', null);
}
// Foreground-Color
if (!is_null($fgColor)) {
$objWriter->startElement('w:highlight');
$objWriter->writeAttribute('w:val', $fgColor);
$objWriter->endElement();
}
$objWriter->endElement();
}
protected function _writeTextBreak(PHPWord_Shared_XMLWriter $objWriter = null)
{
$objWriter->writeElement('w:p', null);
}
protected function _writeTable(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Table $table)
{
$_rows = $table->getRows();
$_cRows = count($_rows);
if ($_cRows > 0) {
$objWriter->startElement('w:tbl');
$tblStyle = $table->getStyle();
if ($tblStyle instanceof PHPWord_Style_Table) {
$this->_writeTableStyle($objWriter, $tblStyle);
} else {
if (!empty($tblStyle)) {
$objWriter->startElement('w:tblPr');
$objWriter->startElement('w:tblStyle');
$objWriter->writeAttribute('w:val', $tblStyle);
$objWriter->endElement();
$objWriter->endElement();
}
}
$_heights = $table->getRowHeights();
for ($i = 0; $i < $_cRows; $i++) {
$row = $_rows[$i];
$height = $_heights[$i];
$objWriter->startElement('w:tr');
if (!is_null($height)) {
$objWriter->startElement('w:trPr');
$objWriter->startElement('w:trHeight');
$objWriter->writeAttribute('w:val', $height);
$objWriter->endElement();
$objWriter->endElement();
}
foreach ($row as $cell) {
$objWriter->startElement('w:tc');
$cellStyle = $cell->getStyle();
$width = $cell->getWidth();
$objWriter->startElement('w:tcPr');
$objWriter->startElement('w:tcW');
$objWriter->writeAttribute('w:w', $width);
$objWriter->writeAttribute('w:type', 'dxa');
$objWriter->endElement();
if ($cellStyle instanceof PHPWord_Style_Cell) {
$this->_writeCellStyle($objWriter, $cellStyle);
}
$objWriter->endElement();
$_elements = $cell->getElements();
if (count($_elements) > 0) {
foreach ($_elements as $element) {
if ($element instanceof PHPWord_Section_Text) {
$this->_writeText($objWriter, $element);
} elseif ($element instanceof PHPWord_Section_TextRun) {
$this->_writeTextRun($objWriter, $element);
} elseif ($element instanceof PHPWord_Section_Link) {
$this->_writeLink($objWriter, $element);
} elseif ($element instanceof PHPWord_Section_TextBreak) {
$this->_writeTextBreak($objWriter);
} elseif ($element instanceof PHPWord_Section_ListItem) {
$this->_writeListItem($objWriter, $element);
} elseif ($element instanceof PHPWord_Section_Image ||
$element instanceof PHPWord_Section_MemoryImage
) {
$this->_writeImage($objWriter, $element);
} elseif ($element instanceof PHPWord_Section_Object) {
$this->_writeObject($objWriter, $element);
} elseif ($element instanceof PHPWord_Section_Footer_PreserveText) {
$this->_writePreserveText($objWriter, $element);
}
}
} else {
$this->_writeTextBreak($objWriter);
}
$objWriter->endElement();
}
$objWriter->endElement();
}
$objWriter->endElement();
}
}
protected function _writeTableStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Table $style = null)
{
$margins = $style->getCellMargin();
$mTop = (!is_null($margins[0])) ? true : false;
$mLeft = (!is_null($margins[1])) ? true : false;
$mRight = (!is_null($margins[2])) ? true : false;
$mBottom = (!is_null($margins[3])) ? true : false;
if ($mTop || $mLeft || $mRight || $mBottom) {
$objWriter->startElement('w:tblPr');
$objWriter->startElement('w:tblCellMar');
if ($mTop) {
$objWriter->startElement('w:top');
$objWriter->writeAttribute('w:w', $margins[0]);
$objWriter->writeAttribute('w:type', 'dxa');
$objWriter->endElement();
}
if ($mLeft) {
$objWriter->startElement('w:left');
$objWriter->writeAttribute('w:w', $margins[1]);
$objWriter->writeAttribute('w:type', 'dxa');
$objWriter->endElement();
}
if ($mRight) {
$objWriter->startElement('w:right');
$objWriter->writeAttribute('w:w', $margins[2]);
$objWriter->writeAttribute('w:type', 'dxa');
$objWriter->endElement();
}
if ($mBottom) {
$objWriter->startElement('w:bottom');
$objWriter->writeAttribute('w:w', $margins[3]);
$objWriter->writeAttribute('w:type', 'dxa');
$objWriter->endElement();
}
$objWriter->endElement();
$objWriter->endElement();
}
}
protected function _writeCellStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Cell $style = null)
{
$bgColor = $style->getBgColor();
$valign = $style->getVAlign();
$textDir = $style->getTextDirection();
$brdSz = $style->getBorderSize();
$brdCol = $style->getBorderColor();
$bTop = (!is_null($brdSz[0])) ? true : false;
$bLeft = (!is_null($brdSz[1])) ? true : false;
$bRight = (!is_null($brdSz[2])) ? true : false;
$bBottom = (!is_null($brdSz[3])) ? true : false;
$borders = ($bTop || $bLeft || $bRight || $bBottom) ? true : false;
$styles = (!is_null($bgColor) || !is_null($valign) || !is_null($textDir) || $borders) ? true : false;
if ($styles) {
if (!is_null($textDir)) {
$objWriter->startElement('w:textDirection');
$objWriter->writeAttribute('w:val', $textDir);
$objWriter->endElement();
}
if (!is_null($bgColor)) {
$objWriter->startElement('w:shd');
$objWriter->writeAttribute('w:val', 'clear');
$objWriter->writeAttribute('w:color', 'auto');
$objWriter->writeAttribute('w:fill', $bgColor);
$objWriter->endElement();
}
if (!is_null($valign)) {
$objWriter->startElement('w:vAlign');
$objWriter->writeAttribute('w:val', $valign);
$objWriter->endElement();
}
if ($borders) {
$_defaultColor = $style->getDefaultBorderColor();
$objWriter->startElement('w:tcBorders');
if ($bTop) {
if (is_null($brdCol[0])) {
$brdCol[0] = $_defaultColor;
}
$objWriter->startElement('w:top');
$objWriter->writeAttribute('w:val', 'single');
$objWriter->writeAttribute('w:sz', $brdSz[0]);
$objWriter->writeAttribute('w:color', $brdCol[0]);
$objWriter->endElement();
}
if ($bLeft) {
if (is_null($brdCol[1])) {
$brdCol[1] = $_defaultColor;
}
$objWriter->startElement('w:left');
$objWriter->writeAttribute('w:val', 'single');
$objWriter->writeAttribute('w:sz', $brdSz[1]);
$objWriter->writeAttribute('w:color', $brdCol[1]);
$objWriter->endElement();
}
if ($bRight) {
if (is_null($brdCol[2])) {
$brdCol[2] = $_defaultColor;
}
$objWriter->startElement('w:right');
$objWriter->writeAttribute('w:val', 'single');
$objWriter->writeAttribute('w:sz', $brdSz[2]);
$objWriter->writeAttribute('w:color', $brdCol[2]);
$objWriter->endElement();
}
if ($bBottom) {
if (is_null($brdCol[3])) {
$brdCol[3] = $_defaultColor;
}
$objWriter->startElement('w:bottom');
$objWriter->writeAttribute('w:val', 'single');
$objWriter->writeAttribute('w:sz', $brdSz[3]);
$objWriter->writeAttribute('w:color', $brdCol[3]);
$objWriter->endElement();
}
$objWriter->endElement();
}
}
$gridSpan = $style->getGridSpan();
if (!is_null($gridSpan)) {
$objWriter->startElement('w:gridSpan');
$objWriter->writeAttribute('w:val', $gridSpan);
$objWriter->endElement();
}
$vMerge = $style->getVMerge();
if (!is_null($vMerge)) {
$objWriter->startElement('w:vMerge');
$objWriter->writeAttribute('w:val', $vMerge);
$objWriter->endElement();
}
}
/**
* @param \PHPWord_Shared_XMLWriter $objWriter
* @param \PHPWord_Section_Image $image
*/
protected function _writeImage(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Image $image)
{
$rId = $image->getRelationId();
$style = $image->getStyle();
$width = $style->getWidth();
$height = $style->getHeight();
$align = $style->getAlign();
$marginTop = $style->getMarginTop();
$marginLeft = $style->getMarginLeft();
$wrappingStyle = $style->getWrappingStyle();
$objWriter->startElement('w:p');
if (!is_null($align)) {
$objWriter->startElement('w:pPr');
$objWriter->startElement('w:jc');
$objWriter->writeAttribute('w:val', $align);
$objWriter->endElement();
$objWriter->endElement();
}
$objWriter->startElement('w:r');
$objWriter->startElement('w:pict');
$objWriter->startElement('v:shape');
$objWriter->writeAttribute('type', '#_x0000_t75');
$imgStyle = '';
if (null !== $width) {
$imgStyle .= 'width:' . $width . 'px;';
}
if (null !== $height) {
$imgStyle .= 'height:' . $height . 'px;';
}
if (null !== $marginTop) {
$imgStyle .= 'margin-top:' . $marginTop . 'in;';
}
if (null !== $marginLeft) {
$imgStyle .= 'margin-left:' . $marginLeft . 'in;';
}
switch ($wrappingStyle) {
case PHPWord_Style_Image::WRAPPING_STYLE_BEHIND:
$imgStyle .= 'position:absolute;z-index:-251658752;';
break;
case PHPWord_Style_Image::WRAPPING_STYLE_SQUARE:
$imgStyle .= 'position:absolute;z-index:251659264;mso-position-horizontal:absolute;mso-position-vertical:absolute;';
break;
case PHPWord_Style_Image::WRAPPING_STYLE_TIGHT:
$imgStyle .= 'position:absolute;z-index:251659264;mso-wrap-edited:f;mso-position-horizontal:absolute;mso-position-vertical:absolute';
break;
case PHPWord_Style_Image::WRAPPING_STYLE_INFRONT:
$imgStyle .= 'position:absolute;zz-index:251659264;mso-position-horizontal:absolute;mso-position-vertical:absolute;';
break;
}
$objWriter->writeAttribute('style', $imgStyle);
$objWriter->startElement('v:imagedata');
$objWriter->writeAttribute('r:id', 'rId' . $rId);
$objWriter->writeAttribute('o:title', '');
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
}
protected function _writeWatermark(PHPWord_Shared_XMLWriter $objWriter = null, $image)
{
$rId = $image->getRelationId();
$style = $image->getStyle();
$width = $style->getWidth();
$height = $style->getHeight();
$marginLeft = $style->getMarginLeft();
$marginTop = $style->getMarginTop();
$objWriter->startElement('w:p');
$objWriter->startElement('w:r');
$objWriter->startElement('w:pict');
$objWriter->startElement('v:shape');
$objWriter->writeAttribute('type', '#_x0000_t75');
$strStyle = 'position:absolute;';
$strStyle .= ' width:' . $width . 'px;';
$strStyle .= ' height:' . $height . 'px;';
if (!is_null($marginTop)) {
$strStyle .= ' margin-top:' . $marginTop . 'px;';
}
if (!is_null($marginLeft)) {
$strStyle .= ' margin-left:' . $marginLeft . 'px;';
}
$objWriter->writeAttribute('style', $strStyle);
$objWriter->startElement('v:imagedata');
$objWriter->writeAttribute('r:id', 'rId' . $rId);
$objWriter->writeAttribute('o:title', '');
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
}
protected function _writeTitle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Title $title)
{
$text = htmlspecialchars($title->getText());
$text = PHPWord_Shared_String::ControlCharacterPHP2OOXML($text);
$anchor = $title->getAnchor();
$bookmarkId = $title->getBookmarkId();
$style = $title->getStyle();
$objWriter->startElement('w:p');
if (!empty($style)) {
$objWriter->startElement('w:pPr');
$objWriter->startElement('w:pStyle');
$objWriter->writeAttribute('w:val', $style);
$objWriter->endElement();
$objWriter->endElement();
}
$objWriter->startElement('w:r');
$objWriter->startElement('w:fldChar');
$objWriter->writeAttribute('w:fldCharType', 'end');
$objWriter->endElement();
$objWriter->endElement();
$objWriter->startElement('w:bookmarkStart');
$objWriter->writeAttribute('w:id', $bookmarkId);
$objWriter->writeAttribute('w:name', $anchor);
$objWriter->endElement();
$objWriter->startElement('w:r');
$objWriter->startElement('w:t');
$objWriter->writeRaw($text);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->startElement('w:bookmarkEnd');
$objWriter->writeAttribute('w:id', $bookmarkId);
$objWriter->endElement();
$objWriter->endElement();
}
}