TransWikia.com

Как добавить/изменить изображение в шаблоне документа docx использую библиотеку phpword?

Stack Overflow на русском Asked on December 5, 2021

Генерирую документ docx используя библиотеку PHPWord . Не могу разобраться как поменять изображение которое находиться в шаблоне документа. Использую версию библиотеки 0.14.

Знаю что нужно вносить изменения в файл TemplateProcessor.php. но что именно менять и как потом использовать, не могу понять. Если есть люди которые сталкивались с данной библиотекой, пожалуйста помогите в решение указанного вопроса. Если можно с четким пояснением что и где менять. заранее огромное спасибо.

2 Answers

Нашел ответ на свой вопрос, может кому то пригодиться. в файл TemplateProcessor.php вставляете следующий код

       /**
      * Set a new image
 *
 * @param string $search
 * @param string $replace
  */
 public function setImageValue($search, $replace)
 {
    // Sanity check
   if (!file_exists($replace))
   {
    return;
   }

   // Delete current image
    $this->zipClass->deleteName('word/media/' . $search);

    // Add a new one
    $this->zipClass->addFile($replace, 'word/media/' . $search);}

Вызывается с помощью $templateProcessor->setImageValue('image1.jpg', 'my_image.jpg');

Также шаблон документа нужно сохранить в формате zip

Answered by Алексей Биленко on December 5, 2021

Для удаления, добавления, изменения изображений в шаблоне необходимо добавить в файл TemplateProcessor.php следующие фрагменты кода:

1.

// add this in the class
protected $_rels;
protected $_types;

public function __construct($documentTemplate){
    // add this line to this function
    $this->_countRels=100; 
}

2.

public function save()
{
    //add this snippet to this function after $this->zipClass->addFromString('word/document.xml', $this->tempDocumentMainPart);
    if($this->_rels!=""){
        $this->zipClass->addFromString('word/_rels/document.xml.rels', $this->_rels);
    }
    if($this->_types!=""){
        $this->zipClass->addFromString('[Content_Types].xml', $this->_types);
    }
}

3.

public function setImg( $strKey, $img){
    $strKey = '${'.$strKey.'}';
    $relationTmpl = '<Relationship Id="RID" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/IMG"/>';

    $imgTmpl = '<w:pict><v:shape type="#_x0000_t75" style="width:WIDpx;height:HEIpx"><v:imagedata r:id="RID" o:title=""/></v:shape></w:pict>';

    $toAdd = $toAddImg = $toAddType = '';
    $aSearch = array('RID', 'IMG');
    $aSearchType = array('IMG', 'EXT');
    $countrels=$this->_countRels++;
    //I'm work for jpg files, if you are working with other images types -> Write conditions here
    $imgExt = 'jpg';
    $imgName = 'img' . $countrels . '.' . $imgExt;

    $this->zipClass->deleteName('word/media/' . $imgName);
    $this->zipClass->addFile($img['src'], 'word/media/' . $imgName);

    $typeTmpl = '<Override PartName="/word/media/'.$imgName.'" ContentType="image/EXT"/>';


    $rid = 'rId' . $countrels;
    $countrels++;
    list($w,$h) = getimagesize($img['src']);

    if(isset($img['swh'])) //Image proportionally larger side
    {
        if($w<=$h)
        {
            $ht=(int)$img['swh'];
            $ot=$w/$h;
            $wh=(int)$img['swh']*$ot;
            $wh=round($wh);
        }
        if($w>=$h)
        {
            $wh=(int)$img['swh'];
            $ot=$h/$w;
            $ht=(int)$img['swh']*$ot;
            $ht=round($ht);
        }
        $w=$wh;
        $h=$ht;
    }

    if(isset($img['size']))
    {
        $w = $img['size'][0];
        $h = $img['size'][1];           
    }

    $toAddImg .= str_replace(array('RID', 'WID', 'HEI'), array($rid, $w, $h), $imgTmpl) ;
    if(isset($img['dataImg']))
    {
        $toAddImg.='<w:br/><w:t>'.$this->limpiarString($img['dataImg']).'</w:t><w:br/>';
    }

    $aReplace = array($imgName, $imgExt);
    $toAddType .= str_replace($aSearchType, $aReplace, $typeTmpl) ;

    $aReplace = array($rid, $imgName);
    $toAdd .= str_replace($aSearch, $aReplace, $relationTmpl);


    $this->tempDocumentMainPart=str_replace('<w:t>' . $strKey . '</w:t>', $toAddImg, $this->tempDocumentMainPart);
    //print $this->tempDocumentMainPart;

    if($this->_rels=="")
    {
        $this->_rels=$this->zipClass->getFromName('word/_rels/document.xml.rels');
        $this->_types=$this->zipClass->getFromName('[Content_Types].xml');
    }

    $this->_types = str_replace('</Types>', $toAddType, $this->_types) . '</Types>';
    $this->_rels = str_replace('</Relationships>', $toAdd, $this->_rels) . '</Relationships>';
}

4.

function limpiarString($str) {
    return str_replace(
            array('&', '<', '>', "n"), 
            array('&amp;', '&lt;', '&gt;', "n" . '<w:br/>'), 
            $str
    );
}

Пример использования:

//open your template  
$templateProcessor = new PhpOfficePhpWordTemplateProcessor('files/template.docx');
//add image to selector
$templateProcessor->setImg('selector',array('src' => 'image.jpg','swh'=>'200', 'size'=>array(0=>$width, 1=>$height));
// You can also clone row if you need
//$templateProcessor->cloneRow('NAME_IN_TEMPLATE', NUMBER_OF_TABLE_RECORDS);
$templateProcessor->cloneRow('SELECTOR', 4);
//save
header("Content-Disposition: attachment; filename='helloWord.docx'");
$templateProcessor->saveAs('php://output');

Answered by Nikolaj Sarry on December 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP