PHP学习_玩转PHP之快速制作Word简历

2021-09-07 0 503 百度已收录

PHP制造word简历

PHP操纵word有一个十分好用的轮子,便是phpword,该轮子能够正在github上查找到(PHPOffice/PHPWord)。下面有较为具体的例子以及代码,此中外面的源码包括有一些经常使用的操纵例子,包含配置页眉、页脚、页码、字体款式、表格、拔出图片等经常使用的操纵。这里介绍的是若何运用该轮子来制造一个简历。

模板交换的体式格局制造简历

正在很多雇用网站都有一个简历下载的功用,若何用php完成呢?正在PHPOffice/PHPWord外面就有一个十分复杂的天生一个word文档,向文档中拔出一些笔墨。这里我运用的体式格局比拟取巧,这个轮子的说明文档中有template processing,我了解为模板交换,也便是跟laravel的blade模板一个观点。接上去就未几空话,间接说若何操纵,这里提一句运用的是laravel框架

1.装置PHPOffice/PHPWord

composer require phpoffice/phpword

2.创立把持器DocController及test办法用于测试,并树立路由。

php artisan make:controller DocController

3.树立word模板,这里说明一下,该轮子交换的是word文档中格局为${value}格局的字符串,这里我简略单纯的搭建一个模板以下图1所示:
PHP学习_玩转PHP之快速制作Word简历

从图中能够看到有一些根本的信息,这些能够从数据库中捞取数据。不外此次是间接运用交换的体式格局,像任务阅历以及教导阅历这类多行表格的形式这里也只要要取一行作为模板便可。

4.详细代码

//load template docx
        $templateProcessor = new TemplateProcessor('./sample.docx');

        //根底信息填写交换
        $templateProcessor->setValue('update_at', date('Y-m-d H:i:s'));
        $templateProcessor->setValue('number', '123456');
        $templateProcessor->setValue('Name', '张三');
        $templateProcessor->setValue('sex', '男');
        $templateProcessor->setValue('birth', '1996年10月');
        $templateProcessor->setValue('age', '22');
        $templateProcessor->setValue('shortcut', '就业/aaa');
        $templateProcessor->setValue('liveArea', '福建省莆田市涵江区');
        $templateProcessor->setValue('domicile', '福建省莆田市涵江区');
        $templateProcessor->setValue('address', '');
        $templateProcessor->setValue('hopetodo', 'IT');
        $templateProcessor->setValue('hopeworkin', '互联网');
        $templateProcessor->setValue('hopes', '7000+');
        $templateProcessor->setValue('worklocation', '福建省莆田市');
        $templateProcessor->setValue('phone', '123456789');
        $templateProcessor->setValue('mail', '456789@qq.com');
        $templateProcessor->setValue('qqnum', '456789');
        $templateProcessor->setValue('selfjudge', '哇哈哈哈哈哈哈哈');

        //任务阅历表格交换
        $templateProcessor->cloneRow('experience_time', 2);//该表经过克隆行的体式格局,构成两行
        $templateProcessor->setValue('experience_time#1', '2010-09~2014-06');//每一行参数是用value#X(X透露表现行号,从1开端)
        $templateProcessor->setValue('job#1', 'ABC company CTO');
        $templateProcessor->setValue('experience_time#2', '2014-09~至今');
        $templateProcessor->setValue('job#2', 'JBC company CTO');

        //教导阅历
        $templateProcessor->cloneRow('time', 2);
        $templateProcessor->setValue('time#1', '2010-09~2014-06');
        $templateProcessor->setValue('school#1', 'ABC');
        $templateProcessor->setValue('major#1', 'Computer science');
        $templateProcessor->setValue('time#2', '2014-09~至今');
        $templateProcessor->setValue('school#2', 'JBC');
        $templateProcessor->setValue('major#2', 'Computer science');

        //言语才能
        $templateProcessor->cloneRow('lang',2);
        $templateProcessor->setValue('lang#1', '汉语|通晓');
        $templateProcessor->setValue('lang#2', '英语|通晓');

        //技艺
        $templateProcessor->cloneRow('skill',3);
        $templateProcessor->setValue('skill#1', 'JAVA|通晓');
        $templateProcessor->setValue('skill#2', 'Python|通晓');
        $templateProcessor->setValue('skill#3', 'PHP|通晓');

        // Saving the document
        $templateProcessor->saveAs('my.docx');

如许就能够经过树立word模板的体式格局发生一个简历了。以上内容不提到若何将图片交换出来,假如你检查文档的话会发明这个包的模板交换并无说怎样交换图片,由于仿佛压根这类体式格局就不供给,晕逝世。不外github的issue中有人提出了这个成绩而且也有人给出理解决计划。上面我就来讲说若何完成将图片交换出来的功用。

交换图片

假定你的简历模板中有个表格单位格中要拔出一张图片,以下:
PHP学习_玩转PHP之快速制作Word简历

我要将public/img下的against the current.jpg图片交换出来,而源代码未将图片交换进word的功用,以是只能本人编写了。

  • 1.修正composer.json,将TemplateDocx类主动加载出去:
"autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "app/Core/TemplateDocx.php"
        ],
        "psr-4": {
            "App\\\\": "app/"
        }
    },

运转以下代码:

composer dump-autoload
  • 2.完成TemplateDocx类:

该类的内容我间接放正在我的gist上了,毗连TemplateDocx.php

因为code是放正在gist上,国际拜访没有了以是我间接把code贴进去,以下:

<?php
namespace App\\Core;
use PhpOffice\\PhpWord\\Exception\\Exception;
use PhpOffice\\PhpWord\\TemplateProcessor;
class TemplateDocx extends TemplateProcessor
{
    /**
     * @since 0.12.0 Throws CreateTemporaryFileException and CopyFileException instead of Exception
     *
     * @param string $documentTemplate The fully qualified template filename
     *
     * @throws \\PhpOffice\\PhpWord\\Exception\\CreateTemporaryFileException
     * @throws \\PhpOffice\\PhpWord\\Exception\\CopyFileException
     */
    public function __construct($documentTemplate)
    {
        parent::__construct($documentTemplate);
        //增加以下属性,前面会用到
        $this->_countRels = 100; //start id for relationship between image and document.xml
        $this->_rels = '';
        $this->_types = '';
    }
    /**
     * Saves the result document.
     *
     * @throws \\PhpOffice\\PhpWord\\Exception\\Exception
     *
     * @return string
     */
    public function save()
    {
        foreach ($this->tempDocumentHeaders as $index => $xml) {
            $this->zipClass->addFromString($this->getHeaderName($index), $xml);
        }
        $this->zipClass->addFromString($this->getMainPartName(), $this->tempDocumentMainPart);
        /*****************重写原本的save办法中增加的内容******************/
        if ($this->_rels != "") {
            $this->zipClass->addFromString('word/_rels/document.xml.rels', $this->_rels);
        }
        if ($this->_types != "") {
            $this->zipClass->addFromString('[Content_Types].xml', $this->_types);
        }
        /*********************我是联系线******************************/
        foreach ($this->tempDocumentFooters as $index => $xml) {
            $this->zipClass->addFromString($this->getFooterName($index), $xml);
        }
        // Close zip file
        if (false === $this->zipClass->close()) {
            throw new Exception('Could not close zip file.');
        }
        return $this->tempDocumentFilename;
    }
    /**
     * 完成将图片交换进word波动的办法
     * @param $strKey
     * @param $img
     */
    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>';
    }
}
  • 3.运用办法:
$templateProcessor = new TemplateDocx('./sample.docx');
        $imgPath = './img/against the current.jpg';

        $templateProcessor->setImg('img', array(
            'src'  => $imgPath, //图片途径
            'size' => array( 150, 150 ) //图片巨细,单元px
        ));
        $templateProcessor->setValue('name', 'Sun');

        $templateProcessor->cloneRow('key', 2);//该表经过克隆行的体式格局,构成两行
        $templateProcessor->setValue('key#1', '2010-09~2014-06');//每一行参数是用value#X(X透露表现行号,从1开端)
        $templateProcessor->setValue('val#1', 'ABC company CTO');
        $templateProcessor->setValue('key#2', '2014-09~至今');
        $templateProcessor->setValue('val#2', 'JBC company CTO');
//        $templateProcessor->setValue('img', 'Sun');

        $templateProcessor->saveAs('my.docx');
  • 4.运转后果

PHP学习_玩转PHP之快速制作Word简历

至此就能够发生简历啦,假如这篇文章对于你有所协助记患上点赞哦,亲!假如有任何成绩能够留言!!(* ̄︶ ̄)

以上便是玩转PHP之疾速制造Word简历的具体内容,更多请存眷酷吧易资源网别的相关文章!

 

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

酷吧易资源网 PHP教程 PHP学习_玩转PHP之快速制作Word简历 https://www.kubayi.com/7513.html

常见问题

相关文章

评论
暂无评论