登录  /  注册

玩转PHP之快速制作Word简历

藏色散人
发布: 2021-09-06 17:19:22
转载
3996人浏览过

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所示:
bf72a60e7bc2445b5dcfc3670dfc813.png

从图中可以看到有一些基本的信息,这些可以从数据库中捞取数据。不过这次是直接使用替换的方式,像工作经历和教育经历这种多行表格的模式这里也只需要取一行作为模板即可。

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中有人提出了这个问题并且也有人给出了解决方案。下面我就来说说如何实现将图片替换进去的功能。

替换图片

假设你的简历模板中有个表格单元格中要插入一张图片,如下:
212cac139dc51c88908f89d49452b86.png

我要将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-&gt;_rels = '';
        $this-&gt;_types = '';
    }
    /**
     * Saves the result document.
     *
     * @throws \PhpOffice\PhpWord\Exception\Exception
     *
     * @return string
     */
    public function save()
    {
        foreach ($this-&gt;tempDocumentHeaders as $index =&gt; $xml) {
            $this-&gt;zipClass-&gt;addFromString($this-&gt;getHeaderName($index), $xml);
        }
        $this-&gt;zipClass-&gt;addFromString($this-&gt;getMainPartName(), $this-&gt;tempDocumentMainPart);
        /*****************重写原有的save方法中添加的内容******************/
        if ($this-&gt;_rels != "") {
            $this-&gt;zipClass-&gt;addFromString('word/_rels/document.xml.rels', $this-&gt;_rels);
        }
        if ($this-&gt;_types != "") {
            $this-&gt;zipClass-&gt;addFromString('[Content_Types].xml', $this-&gt;_types);
        }
        /*********************我是分割线******************************/
        foreach ($this-&gt;tempDocumentFooters as $index =&gt; $xml) {
            $this-&gt;zipClass-&gt;addFromString($this-&gt;getFooterName($index), $xml);
        }
        // Close zip file
        if (false === $this-&gt;zipClass-&gt;close()) {
            throw new Exception('Could not close zip file.');
        }
        return $this-&gt;tempDocumentFilename;
    }
    /**
     * 实现将图片替换进word稳定的方法
     * @param $strKey
     * @param $img
     */
    public function setImg($strKey, $img){
        $strKey = '${'.$strKey.'}';
        $relationTmpl = '<relationship></relationship>';
        $imgTmpl = '<pict><shape><imagedata></imagedata></shape></pict>';
        $toAdd = $toAddImg = $toAddType = '';
        $aSearch = array('RID', 'IMG');
        $aSearchType = array('IMG', 'EXT');
        $countrels=$this-&gt;_countRels++;
        //I'm work for jpg files, if you are working with other images types -&gt; Write conditions here
        $imgExt = 'jpg';
        $imgName = 'img' . $countrels . '.' . $imgExt;
        $this-&gt;zipClass-&gt;deleteName('word/media/' . $imgName);
        $this-&gt;zipClass-&gt;addFile($img['src'], 'word/media/' . $imgName);
        $typeTmpl = '<override></override>';
        $rid = 'rId' . $countrels;
        $countrels++;
        list($w,$h) = getimagesize($img['src']);
        if(isset($img['swh'])) //Image proportionally larger side
        {
            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.='<br><t>'.$this-&gt;limpiarString($img['dataImg']).'</t><br>';
        }
        $aReplace = array($imgName, $imgExt);
        $toAddType .= str_replace($aSearchType, $aReplace, $typeTmpl) ;
        $aReplace = array($rid, $imgName);
        $toAdd .= str_replace($aSearch, $aReplace, $relationTmpl);
        $this-&gt;tempDocumentMainPart=str_replace('<t>' . $strKey . '</t>', $toAddImg, $this-&gt;tempDocumentMainPart);
        //print $this-&gt;tempDocumentMainPart;
        if($this-&gt;_rels=="")
        {
            $this-&gt;_rels=$this-&gt;zipClass-&gt;getFromName('word/_rels/document.xml.rels');
            $this-&gt;_types=$this-&gt;zipClass-&gt;getFromName('[Content_Types].xml');
        }
        $this-&gt;_types       = str_replace('', $toAddType, $this-&gt;_types) . '';
        $this-&gt;_rels        = str_replace('', $toAdd, $this-&gt;_rels) . '';
    }
}
登录后复制
  • 3.使用方法:
$templateProcessor = new TemplateDocx('./sample.docx');
        $imgPath = './img/against the current.jpg';

        $templateProcessor-&gt;setImg('img', array(
            'src'  =&gt; $imgPath, //图片路径
            'size' =&gt; array( 150, 150 ) //图片大小,单位px
        ));
        $templateProcessor-&gt;setValue('name', 'Sun');

        $templateProcessor-&gt;cloneRow('key', 2);//该表通过克隆行的方式,形成两行
        $templateProcessor-&gt;setValue('key#1', '2010-09~2014-06');//每行参数是用value#X(X表示行号,从1开始)
        $templateProcessor-&gt;setValue('val#1', 'ABC company CTO');
        $templateProcessor-&gt;setValue('key#2', '2014-09~至今');
        $templateProcessor-&gt;setValue('val#2', 'JBC company CTO');
//        $templateProcessor-&gt;setValue('img', 'Sun');

        $templateProcessor-&gt;saveAs('my.docx');
登录后复制
  • 4.运行结果

1f076207cb3280fc82695404a3c2761.png

至此就可以产生简历啦,如果这篇文章对你有所帮助记得点赞哦,亲!如果有任何问题可以留言!!(* ̄︶ ̄)

以上就是玩转PHP之快速制作Word简历的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:segmentfault网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号