tp5   使用phpword 替换word模板并利用com组件转换pdf

一、首先composer安装PHPword,就不多说了

二、然后是把模板中要替换的部分用变量代替

三、把原始的模板文件放入项目目录,tp框就放在了public/upload/目录下

四、

查看php.ini中是否已经开启了com.allow_dcom = true

从php/ext/里面查找一下有没有这个php_com_dotnet.dll这个文件

如果没有网上下载个,一般都会有的吧应该大概可能。。

然后查找这个php.ini里面查找下#extension=php_com_dotnet.dll把前面的#号去掉

如果找不到就复制,手动添加一下

然后输出下phpinfo()

看看有没有com_dotnet
COM support enabled
DCOM support enabled
.Net support       enabled 表示COM组件开启成功

五、

然后新建一个php文件在里面写上:

$com = new COM('word.application');  (#注意word.application 是电脑中必须有word文档才可以的)
echo $com; 如果没错的话应该会显示    Microsoft Word
说明COM扩展已经安装完成了!

六、代码

  public function word2pdf()
{ $server=$_SERVER['DOCUMENT_ROOT'];
// $filenamedoc =$server.'/upload/basedoc/one.docx';
$filenamedoc =$server.'/'.$templet['url'];//模板路径
$filenamepdf = $server.'/upload/basedoc/one'.$templet['id'].'_new.docx';//替换变量,新的word路径
$fiel='/upload/basedoc/one'.$templet['id'].'_new'.time().'.pdf';//word转换pdf路径
$pdf = $server.$fiel;
$tmp=new \PhpOffice\PhpWord\TemplateProcessor($filenamedoc);//打开模板
$tmp->setValue('name',$sq);
$tmp->setValue('hcwz',$hcwz); $tmp->setValue('ayear',$apply_date_y);
$tmp->setValue('amonth',$apply_date_m);
$tmp->setValue('aday',$apply_date_d); $tmp->setValue('year',date("Y",time()));
$tmp->setValue('month',date("m",time()));
$tmp->setValue('day',date("d",time()));
$tmp->setValue('mishu',$mishu);//${year}年${month}月${day}
$tmp->saveAs($filenamepdf);//另存为
$url=word2pdf($filenamepdf,$pdf);
return config("PdfUrl").$fiel; }
function word2pdf($srcfilename,$destfilename)
{
try {
if(!file_exists($srcfilename)){
unlink($srcfilename);
}
$word = new \COM("word.application") or die("Can't start Word!");
$word->Visible=0;
$word->Documents->Open($srcfilename, false, false, false, "1", "1", true);
$word->ActiveDocument->final = false;
$word->ActiveDocument->Saved = true;
$word->ActiveDocument->ExportAsFixedFormat(
$destfilename,
17, // wdExportFormatPDF
false, // open file after export
0, // wdExportOptimizeForPrint
3, // wdExportFromTo
1, // begin page
5000, // end page
7, // wdExportDocumentWithMarkup
true, // IncludeDocProps
true, // KeepIRM
1 // WdExportCreateBookmarks
);
$word->ActiveDocument->Close();
$word->Quit();
} catch (\Exception $e) {
if (method_exists($word, "Quit")){
$word->Quit();
}
return;
}
}
七、权限问题
如果你有权限问题比如不能打开或保存文档,可能出现这样的错误:

由于没有打开文档,所以无法使用此命令

或

——命令失败

试试这个(如果你正在运行IIS):

——执行“dcomcnfg”

-打开组件服务>计算机>我的计算机> DCOM配置

-搜索Microsoft Office Word 97- 2003文档(它会像这样翻译成你的语言,所以花点时间搜索一下)

-右键单击并打开属性

——选择“身份”选项卡

-通常情况下设置为“启动用户”。您必须将其更改为“交互式用户”或您选择的管理用户。

如果还是有问题,就要捕获异常信息了,建议放在try  catch里面

告诫一下,本机安装的office一定下载完整版,否则转换pdf一直失败(如果一直失败,可能是缺少插件Save As PDF and XPS插件 正式版)

下载地址:http://www.onlinedown.net/soft/1109902.htm,也可以自己在网上找一个安装

配置不难,但小细节需要注意,否则一个小问题就被搞死。

tp5 使用phpword 替换word模板并利用com组件转换pdf的更多相关文章

  1. 利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

  2. POI不同版本替换Word模板时的问题

    一.问题描述 通过POI,把Word中的占位符替换为实际的值,以生成复杂结构的业务报告. 在POI 3.9上,功能正常.由于某些原因升级到POI 3.10.1后,项目组反馈说Word模板出错,无法生成 ...

  3. c#读取Word模板,利用书签替换内容包括表格

    //生成WORD程序对象和WORD文档对象 Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Inter ...

  4. 利用iTextSharp组件给PDF文档添加图片水印,文字水印

    最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了.以下做个记录: 首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来. 代码中添加引用为:   using S ...

  5. C# 利用占位符替换word中的字符串和添加图片

    利用占位符替换word中的字符串和添加图片   ///<summary>         /// 替换word模板文件内容,包括表格中内容         /// 调用如下:WordStr ...

  6. 【3】利用Word模板生成文档的总结

    阅读目录 Word二次开发概况 使用DsoFramer进行开发 使用Interop进行开发 打开.关闭和写入操作 批量替换文本 遍历段落替换文本 查找后逐个替换文本 结论 在各类应用系统开发中,和Wo ...

  7. Open Xml SDK Word模板开发最佳实践(Best Practice)

    1.概述 由于前面的引文已经对Open Xml SDK做了一个简要的介绍. 这次来点实际的——Word模板操作. 从本质上来讲,本文的操作都是基于模板替换思想的,即,我们通过替换Word模板中指定元素 ...

  8. javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第1/2页

    由于时间比较紧,没多的时候去学习研究上述工具包,现在用javascript操作ActiveXObject控件,用替换word模板中的书签方式解决. 最近有需求将数据导出到word里,然后编辑打印. 想 ...

  9. 读取word模板,填充数据后导出

    一.需求说明 定期生成word报告,报告中含有文本.表格.图表等元素,依次获取进行替换,保留原有样式,生成新的word文档 二.引入依赖 <dependency> <groupId& ...

随机推荐

  1. 【剑指Offer】62、序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先序. ...

  2. canvas手势解锁源码

    先放图 demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  3. 剑指offer-面试题17-打印从1到最大的n位数-数字

    /* 题目: 输入数字n,按顺序打印从1到最大的n位十进制数. 如输入3,打印从1,2,3到999. */ /* 思路: 大数问题转化为字符串或数组. */ #include<iostream& ...

  4. Linux C++ 单链表添加,删除,输出,逆序操作

    /*单链表操作*/#include <iostream>using namespace std; class Node{ public: Node(){ next=0; } Node(in ...

  5. 第三章:使用ListView展示数据

    一.ImageList:存储图像集合 Images 存储的所有图像 ImageSize 图像的大小 ColorDepth 颜色数 TransparentColor 被视为透明的颜色 先设置ColorD ...

  6. C#的结构和数组

    下面我们继续学习C#的语法.结构struct,C#中的结构和我们PLC中建立的UDT(结构体)是一样的.里面存储了相关的不同类型的数据. 有一句话我觉得十分重要:方法是依存于结构和对象存在的.这以后我 ...

  7. Linux服务器部署.Net Core笔记:目录

        目录 Linux服务器部署.Net Core笔记:一.开启ssh服务 Linux服务器部署.Net Core笔记:二.安装FTP Linux服务器部署.Net Core笔记:三.安装.NetC ...

  8. 在java中调用mockjs生成模拟数据

    一.手写版 在前端有个模拟数据的神器 Mock.js 能生成随机数据,拦截 Ajax 请求,然后我觉得他的这个生成随机数据不错.然后我就到度娘一顿操作,没找到类似的java实现,于是就有了下面的代码: ...

  9. JAVA StringUtils工具类

    org.apache.commons.lang Class StringUtils java.lang.Object org.apache.commons.lang.StringUtils publi ...

  10. goland设置go module

    goland版本2019.3.2 go版本1.14 网上一大堆乱七八糟的什么破文章,讲了半天都没讲清这个go module怎么实际运用,真滴烦躁,一giao我哩giaogiao!!!!! 这边我直接介 ...