项目需要把用户上传的word文档转换为pdf文件,方便用户浏览。经过谷歌百度找到PHP可以使用COM组件调用微软的openoffice来实现文档转换

1,安装OpenOffice

  •   安装OpenOffice 4.1.3 (zh-CN),可百度直接下载对应操作系统版本

2,设置权限

  •   cmd 运行Dcomcnfg.exe->组件服务->计算机->我的电脑->DCOM配置->OpenOffice Service Manager
  •   鼠标右击->属性,选择安全 ,和标识这2个配置。标识配置=>交互式用户,安全=>自定义,全部添加Everyone权限。
  •   点击编辑->添加Everyone权限就行了
  •   启动OpenOffice服务命令:
  •   打开cmd(建议用管理员权限运行,保证服务正常开启)。 先进入OpenOffice安装目录,例如我安装的:
  •   cd  C:\Program Files (x86)\OpenOffice 4\program
  • 启动服务:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

3,配置php.ini

  •   php.ini 开启 com.allow_dcom = true
  •   php.ini 添加 extension=php_com_dotnet.dll
  •   检查该文件 php/ext/php_com_dotnet.dll

下面奉上我整理的代码,希望能帮到你

 <?php
/**
* office文档转换类
* 实现office任何格式文档网页浏览
* author hui
* 1,安装OpenOffice 4.1.3 (zh-CN)
*
* 2,安装 SWFTOOLS http://www.swftools.org/download.html到C盘
* 并把pdf2swf.exe文件移动到C盘根目录
*
* 3,php.ini 开启com.allow_dcom = true
* php.ini 添加extension=php_com_dotnet.dll
* 检查该文件
* php/ext/php_com_dotnet.dll
*/ class Convert{ private $osm; // 构造函数,启用OpenOffice的COM组件
public function __construct(){
ini_set('magic_quotes_runtime', 0); // 设置运行时间
$this->osm = new COM("com.sun.star.ServiceManager") or die("Please be sure that OpenOffice.org is installed.n");
} private function MakePropertyValue($name, $value){
$oStruct = $this->osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
$oStruct->Name = $name;
$oStruct->Value = $value;
return $oStruct;
} private function transform($input_url, $output_url){
$args = array($this->MakePropertyValue('Hidden', true));
$oDesktop = $this->osm->createInstance("com.sun.star.frame.Desktop");
$oWriterDoc = $oDesktop->loadComponentFromURL($input_url, '_blank', 0, $args);
$export_args = array($this->MakePropertyValue('FilterName', 'writer_pdf_Export'));
$oWriterDoc->storeToURL($output_url, $export_args);
$oWriterDoc->close(true);
return $this->getPdfPages($output_url);
} /**
* getPdfPages 获取PDF文件页数的函数获取,文件应当对当前用户可读(linux下)
* @param string $path 文件路径
* @return int
*/
private function getPdfPages($path = ''){
if(!file_exists($path)) return 0;
if(!is_readable($path)) return 0;
$fp=@fopen($path, "r"); // 打开文件
if(!$fp){
return 0;
}else{
$max = 0;
while(!feof($fp)){
$line = fgets($fp,255);
if(preg_match('/\/Count [0-9]+/', $line, $matches)){
preg_match('/[0-9]+/', $matches[0], $matches2);
if ($max<$matches2[0]) $max = $matches2[0];
}
}
fclose($fp);
return $max; // 返回页数
}
} /**
* office文件转换pdf格式
* @param string $input 需要转换的文件
* @param string $output 转换后的pdf文件
* @return return string 页数
*/
public function run($input = '', $output = ''){
if(empty($input) || empty($output)){
return ['error' => 1, 'msg' => '参数缺失', 'flag' => 'run'];
}
$input = "file:///" . str_replace("\\", "/", $input);
$output = "file:///" . str_replace("\\", "/", $output);
return $this->transform($input, $output);
} /**
* pdf2swf pdf文件转换swf格式
* @param string $word_file 需要转换的文件路径
* @param string $attach_dir 保存文件地址
* @return array
*/
public function pdf2swf($word_file = '', $attach_dir = ''){
if(empty($word_file) || empty($attach_dir)){
return ['error' => 1, 'msg' => '参数缺失', 'flag' => 'pdf2swf'];
}
$file_name = uniqid();
$pdf_file = "{$attach_dir}{$file_name}.pdf"; // PDF文件绝对路径
$page = $this->run($word_file, $pdf_file); // 文件先转换为PDF格式
if(isset($page) && $page > 0){
$swf_file = "{$attach_dir}{$file_name}.swf"; // 转换后的swf文件
$pd = str_replace("/", "\\", $pdf_file);
$sw = str_replace("/", "\\", $swf_file);
$cmd = Config::get('websetup.swftools') . " -t {$pd} -s flashversion=9 -o {$sw}";
$phpwsh = new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");
$exec = $phpwsh->exec("cmd.exe /c" . $cmd); // cmd执行pdf2swf转换命令
$stdout = $exec->stdout();
$stdout->readall();
if(is_file($sw)){ // swf文件
if(is_file($pdf_file)){ // 删除pdf文件
unlink($pdf_file);
}
return ['error' => 0, 'page' => $page, 'swf_file' => $file_name];
}else{
return ['error' => 1, 'msg' => 'swf文件不存在', 'flag' => 'pdf2swf'];
}
}else{
return ['error' => 1, 'msg' => '转换pdf失败', 'flag' => 'pdf2swf'];
}
} }

PHP Windows系统下调用OpenOffice的更多相关文章

  1. Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

    项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...

  2. 如何用python在Windows系统下,生成UNIX格式文件

    平时测试工作中,少不了制造测试数据.最近一个项目,我就需要制造一批可在UNIX下正确读取的文件.为确保这批文件能从FTP下载成功,开发叮嘱我:“文件中凡是遇到换行,换行符必须是UNIX下的LF,而不是 ...

  3. Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式

    在上一篇文章里面 ( Windows系统下Memcached缓存系列一:Couchbase(服务器端)和CouchbaseClient(c#客户端)的安装教程 ),我们介绍了服务器端的安装和客户端的安 ...

  4. 吻逗死(windows)系统下自动部署脚本(for java spring*)及linux命令行工具

    转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10051647.html (^^)(^^)自動部署腳本原本在上個公司就在使用,由於近期同事需要手動部署一個Spr ...

  5. windows系统下npm升级的正确姿势以及原理

    本文来自网易云社区 作者:陈观喜 网上关于npm升级很多方法多种多样,但是在windows系统下不是每种方法都会正确升级.其中在windows系统下主要的升级方法有以下三种: 首先最暴力的方法删掉no ...

  6. windows系统下jenkins环境搭建与基本使用

    一. windows 系统下搭建jenkins环境 1.1 jenkins环境搭建和构建job流程图 1.2 安装jdk JDK下载地址:  http://www.oracle.com/technet ...

  7. Windows系统下三十款优秀开源软件

    Windows系统下三十款优秀开源软件 1.Firefox 官方网站:http://www.getfirefox.com/ 可替换Internet Explorer 功能特点:如果你还没有使用Fire ...

  8. 在Windows系统下用命令把应用程序添加到系统服务

    在Windows系统下用命令把应用程序添加到系统服务,使用SC命令. 加入服务格式如下:sc create ServiceName binPath= 程序路径 start= auto(等号后面的空格是 ...

  9. windows系统下在dos命令行kill掉被占用的pid (转)

    原文出自:http://www.2cto.com/os/201304/203771.html   windows系统下在dos命令行kill掉被占用的pid   1.开始-->运行-->c ...

随机推荐

  1. python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)

    print(train_set.tdm) print(type(train_set.tdm)) 输出得到: (0, 3200) 0.264940780338 (0, 1682) 0.356545827 ...

  2. POJ 2674 Linear world(弹性碰撞)

    Linear world Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4426   Accepted: 1006 Desc ...

  3. Hive使用druid做连接池代码实现

    配置文档 hive_jdbc_url=jdbc:hive2://192.168.0.22:10000/default hive.dbname=xxxxx hive_jdbc_username=root ...

  4. STS - 配置Tomcat 运行路径

    背景 今天在一台新机器上面安装开发环境,下载完code以后在STS上配置Tomcat,发现启动以后无法读取到配置文件...启动失败! 七月 , :: 上午 org.apache.catalina.co ...

  5. ubuntu16.04编译QT5.6所依赖的库

    首先在QT的根目录下,阅读README文件! 里面介绍了ubuntu环境下,编译该版本的QT需要安装的包 New dependencies in Qt 5    ------------------- ...

  6. 0908期 HTML 基础 第一讲

    HTML  常用属性.标签以及表格 HTML 超文本标记语言的简称. <html>    --开始标签 <head> 网页上的控制信息 <title>页面标题< ...

  7. JAVA构造函数在超类和子类调用注意事项

    1.构造函数:        当子类继承一个父类时,构造子类时需要调用父类的构造函数,存在三种情况        (1),父类无构造函数或者一个无参数构造函数,子类若无构造函数或者有无参数构造函数,子 ...

  8. 千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死

    原文地址:https://www.cnblogs.com/wangchuang/archive/2013/02/20/2918858.html .c# Invoke和BeginInvoke 区别 Co ...

  9. python拷贝目录下的文件

    #!/usr/bin/env python # Version = 3.5.2 import shutil base_dir = '/data/media/' file = '/backup/temp ...

  10. 关于 Apache Shiro 详解

    1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Securi ...