最新消息:欢迎加入小松的QQ群一起讨论一起学习,搜索页面修改成lua+ElasticSearch,使用php这个页面速度相对慢一点,优化之后速度杠杠的,如有问题请加群联系我

phpword图片替换的问题

PHP 147浏览 0评论

有群里的兄弟使用phpword的时候,找不到模板替换图片的方法,有空就帮忙看看
phpword github: https://github.com/PHPOffice/PHPWord
phpword手册:http://phpword.readthedocs.io/en/latest/

我查了手册,查看了TemplateProcessor的源码发现并没有什么方法,应该是原来就没有的,于是google一下
找到一老外分享的方式,发现可以使用,于是分享一下

修改文件vendor\phpoffice\phpword\src\PhpWord\TemplateProcessor.php
添加方法

	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>';
}
function limpiarString($str) {
        return str_replace(
                array('&', '<', '>', "\n"), 
                array('&amp;', '&lt;', '&gt;', "\n" . '<w:br/>'), 
                $str
        );
}

save方法中

$this->zipClass->addFromString($this->getMainPartName(), $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);
}

添加变量

class TemplateProcessor
{
    const MAXIMUM_REPLACEMENTS_DEFAULT = -1;

    //添加两个变量
    protected $_rels;
    protected $_types;
    [...]
    public function __construct($documentTemplate)
    {
        //添加变量赋值
        $this->_countRels=100;
    }
}

使用

$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('Template.docx');
$templateProcessor->setValue('Name', 'John Doe');

$arrImagenes=array('src' => '2016111101545711290.png','swh'=>'250');
$templateProcessor->setImg('Image', $arrImagenes);

$templateProcessor->saveAs('Template1.docx');

测试的案例已经打包
百度网盘:http://pan.baidu.com/s/1nvbfJIT

测试案例的生成之后的截图

phpword图片

QQ交流群:136351212(满) 455721967

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
转载保留版权:小松博客» phpword图片替换的问题
本文链接地址:https://www.phpsong.com/3015.html

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
木有头像就木有JJ!点这里按步骤申请Gravatar头像吧!