一、PHP使用openoffice实现office在线转PDF介绍

最近需要在网页上实现预览上传的word文档,之前没有实现过相关功能,搜索了一下网上的资料,完整的教程较少,因此将自己实现的步骤和遇到的问题记录下来,希望能帮到有需要的人

1.目前前端只能实现在线预览pdf格式的文件,可以用pdf.js或者jquery.media.js来实现。
2.要实现其他格式的文件预览,需要在后端进行格式转换。

3.目前我了解到的后端对office文档格式的转换方法有:

a、先转换成swf格式->在转换成pdf格式
b、借用第三方工具,如OpenOffice,LibreOffice等,用php或者java或者c#来实现.

4.我用的是openoffice来实现,下面进行详细介绍windows和linux系统的安装和使用方法。

二、windows server实现步骤

①实现具体步骤

a、首先下载openoffice软件,openoffice下载链接

下载完成之后双击安装,可以一路next。
b、oppenoffice权限设置
1、cmd 运行 Dcomcnfg->组件服务->计算机->我的电脑->DCOM配置->OpenOffice Service Manager

2、右键选择属性

3、进行设置步骤图示

注:标识设置中选择:交互式用户

注:Everyone首字母需要大写,检查名称出现下划线即表示成功直接确定即可

c、php环境及配置(开启php中com组件服务)

1: php环境我用的是独立搭建Apache+PHP环境,php版本为5.6.21
2 :具体配置:到php.ini中打开com选项 com.allow_dcom = true
注:PHP 5.4.5后,com/dotnet 模块已经成了单独的扩展,所以需要在PHP.ini中配置extension=php_com_dotnet.dll ,如果PHP VERSION<5.4.5 则不需要。


②windows server格式转换代码实现

<?php class office2pdf  {  private $osm;  public function __construct()  {  //$this->osm = new COM("com.sun.star.ServiceManager")or die ("Please be sure that OpenOffice.org is installed.n");   }    public function MakePropertyValue($name,$value)  {  $oStruct = $this->osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");  $oStruct->Name = $name;  $oStruct->Value = $value;  return $oStruct;  }            public 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);  }           public function run($input,$output){  $input = "file:///" . str_replace("\\","/",$input);  $output = "file:///" . str_replace("\\","/",$output);  return $this->transform($input, $output);  }        /** * 获取PDF文件页数的函数获取 * 文件应当对当前用户可读(linux下) * @param  [string] $path [文件路径] * @return int */  public 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;  }  }       }  $con=new office2pdf();$con->run("C:\yikesoft\www\openoffice\demo.pptx","C:\yikesoft\www\office2pdf\demo.pdf");echo $con->getPdfPages("C:\yikesoft\www\office2pdf\demo.pdf");//获取转换完成pdf文件的页数?>

三、linux系统实现步骤

linux实现具体步骤

服务器操作系统:linux ubuntu18.04.4 Lts
整个实现步骤简要如下:

  • 安装配置OpenOffice、java、jodconverter,实现office文件转pdf
  • 运用jodconverter调用java启动openoffice实现文件转换

必须先卸载LibreOffice:

 1. sudo apt-get remove --purge libreoffice*2. sudo apt-get clean3. sudo apt-get autoremove

详细步骤如下:

1.安装OpenOffice,同上方下载地址一样,这里就不加链接了

  • 根据自己系统的情况选择下载类型,我选择的是x86_64,DEB格式的安装包 (如果你服务器系统是centos的,那么需要下载RPM安装包)
  • 下载完成之后将OpenOffice安装包上传到服务器中,我选择放在根目录下opt/ 目录中
  • 切换到安装包所在目录,使用以下命令解压OpenOffice安装包
tar -zxvf Apache_OpenOffice_4.1.7_Linux_x86-64_install-deb_zh-CN.tar.gz(建议使用tab获取)
  • 会看到当前目录下多了一个"zh-CN"文件夹,切换进入该文件夹中的"DEBS"目录,使用以下命令安装OpenOffice:
 - cd zh-CN/DEBS/- sudo dpkg -i *.deb- cd desktop-integration/- sudo dpkg -i openoffice4.1-debian-menus_4.1.7-9800_all.deb(建议使用tab获取)

安装成功后就可以启动OpenOffice服务了

  • 启动OpenOffice服务

先切换到’opt/openoffice4/program/'目录下(安装包解压后出现的目录),使用以下命令启动服务
sentos启动

./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

Ubuntu启动

soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard &


这里可以看到报错,无法启动openoffice,是因为服务器没有java环境 需要安装java环境
以下是可能需要用到的命令:

  • 查看OpenOffice是否成功启动:

netstat -nlp | grep 8100 如果没有显示则没成功
ps -ef |grep 8100启动后若要停止服务只需kill服务的PID就行

  • 卸载Openoffice

rpm -e rpm -qa |grep openoffice rpm -qa |grep ooobasis

2.安装JAVA环境(如果服务器没有JAVA环境的话)

OpenOffice的运行需要JAVA,所以必须安装。
首先使用java -version查看自己服务器是否已经安装了

  • 下载JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
  • 根据自己的情况选择JAVA版本,操作系统位数不要选错
  • 将JDK上传到服务器的目录下,我的目录是/opt/java/,然后使用以下命令解压:
    tar -zxvf jdk-8u241-linux-x64.tar.gz (jdk名改成自己的)
    解压完成后编辑配置文件:vim /etc/profile 在其中添加以下内容:
 JAVA_HOME=/opt/java/jdk1.8.0_241CLASSPATH=$JAVA_HOME/lib/PATH=$PATH:$JAVA_HOME/binexport PATH JAVA_HOME CLASSPATH
  • 改完后使用source /etc/profile 更新系统环境配置。
  • 查看JAVA环境是否安装成功:java -version
  • 重新运行OpenOffice,查看是否成功,一般都没啥问题。

emm…结果我的出现了这个问题

  • 我们需要通过yum源安装 “X Window System” 启动
    apt-get install yum(Ubuntu系统没有安装yum需要执行)
    centos系统需要安装一下命令
yum groupinstall "X Window System"

3.安装jodconverter

  • 使用jodconverter调用openoffice来实现office文件转pdf,这个方法对于linux下的php比较方便。
    jodconverter下载地址: https://sourceforge.net/projects/jodconverter/files/
  • 下载完后上传到linux服务器解压,然后切换到jodconverter的lib目录下,使用以下命令测试word转pdf:
    java -jar jodconverter-cli-2.2.2.jar test.docx test.pdf
  • 如果成功将word文档转成pdf文档,则表示你的openoffice和jodconver都已经安装成功了。(该命令默认test.docx也在lib目录下)
    当然你也可以不用切换到lib目录,使用以下命令也能实现转换:
    java -jar 'jar包地址' '源文件地址' '输出文件地址'
  • 转换完成后查看一下pdf文件内容,看看是否中文出现乱码或者显示不出,若存在该情况,还需要进行下面这一步:

4.解决转换结果中中文内容显示乱码的问题

  • 将windows系统的c:\window\fonts目录下的字体上传到linux服务器的usr\share\fonts目录下,一般都是这个目录,可以用cat /etc/fonts/fonts.conf确认一下。
  • 只需要选中的这些即可
  • 上传完成后,使用命令fc-cache -fv更新缓存,然后重启openoffice服务(重启只需要kill掉pid再次启动即可),重新尝试文档转换发现字体正常。

5.使用php实现文档转换

  • 新建一个php文件,键入以下代码:
$jodconverter_path = '/opt/jodconverter/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar';//jodconverter-cli-2.2.2.jar 程序绝对路径
$infile_path       = '/opt/test/1.docx';//需要转pdf格式的源文件
$outfile_path      = '/opt/test/1.pdf';//需要输出的文件绝对路径
echo word2pdf($infile_path, $outfile_path, $jodconverter_path);function word2pdf ($infile_path, $outfile_path, $jodconverter_path) {if (empty($infile_path)) return false;    try {$p = "/opt/java/jdk1.8.0_241/bin/java -jar ". $jodconverter_path. ' '. $infile_path. ' '. $outfile_path;$res = exec($p);return $res;} catch (Exception $e) {return false;}
}
  • 代码中的文件路径根据自己的情况修改,运行该php文件,则可以测试php能否成功将文件进行转换。
    在测试的过程中若遇到php无法执行exec()函数的问题,需要修改php.ini里的配置(disable_function等)。

四、自用线上TP5项目封装调用方法,适用于windows server和linux两种系统同时跑

<?phpnamespace app\admin\controller;use Exception;
use think\facade\Request;class Office2Pdf
{/*** word2pdf() 执行odconverter用openOffice转pdf代码 linux系统下* @param $infile_path* @param $outfile_path* @param $jodconverter_path* @return bool*/public function word2pdf($infile_path, $outfile_path, $jodconverter_path){if (empty($infile_path)) return false;try {$set_charset = 'export LANG=en_US.UTF-8;'; //为防止中文文件转pdf时exec()函数执行出错 设置字符集为utf-8$p = "/opt/java/jdk1.8.0_241/bin/java -jar " . $jodconverter_path . ' ' . $infile_path . ' ' . $outfile_path;exec($set_charset.$p);} catch (Exception $e) {return false;}}/*** 获取PDF文件页数的函数获取  两系统通用* 文件应当对当前用户可读(linux下)* @param  [string] $path [文件路径]* @return int*/public function getPdfPages($outfile_path){if(!file_exists($outfile_path)) return 0;if(!is_readable($outfile_path)) return 0;// 打开文件$fp=@fopen($outfile_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 $file_path* @return string*/public function office2pdf($file_path = '666.xlsx'){//判断服务器操作系统 暂定为win和linux两种if (PHP_OS == 'Linux'){$jodconverter_path = "/opt/jodconverter/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar";$infile_path = "/var/www/yike-resource/public/".$file_path;$rand_path = time().rand(100000,999999).'.pdf'; //定义随机生成一个pdf格式文件名$outfile_path = "/var/www/yike-resource/public/uploads/office2pdf/".$rand_path;$this->word2pdf($infile_path, $outfile_path, $jodconverter_path);return "/uploads/office2pdf/".$rand_path;}elseif(PHP_OS == 'WINNT'){$con = new Office2Pdf();$infile_path = PUBLIC_UPLOADS.'/'.$file_path;$rand_path = time().rand(100000,999999).'.pdf';$outfile_path = PUBLIC_UPLOADS."/office2pdf/".$rand_path;$con->run($infile_path,$outfile_path);//echo $con->getPdfPages($outfile_path);return "office2pdf/".$rand_path;}}/*** win系统下操作openoffice方法* @var COM*/private $osm;public function __construct(){if (PHP_OS == 'WINNT'){$this->osm = new \COM("com.sun.star.ServiceManager")or die ("Please be sure that OpenOffice.org is installed.n");}}public function MakePropertyValue($name,$value){$oStruct = $this->osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");$oStruct->Name = $name;$oStruct->Value = $value;return $oStruct;}public 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);}public function run($input,$output){$input = "file:///" . str_replace("\\","/",$input);$output = "file:///" . str_replace("\\","/",$output);return $this->transform($input, $output);}}
  • 以上就是php通过openoffice实现在线预览word等office文件。
    第一次发博文,一是对过程的记录,二是希望能帮到有需要的你。如有错误,欢迎指正、

PHP使用openoffice实现word,ppt,Excel在线转PDF浏览。windows和linux系统不同的解决方案相关推荐

  1. java利用jacob实现word,ppt,excel,jpg转pdf

    项目中遇到了需要把用户上传的word,execl,ppt每页截图保存.需要先用到jacob把资源转换为pdf,在通过pdf-renderer把每页截图下来. 下载相关的jar包:http://down ...

  2. Spring Boot整合OpenOffice实现Word、Excel、PPT在线预览

    Spring Boot整合OpenOffice实现Word.Excel.PPT在线预览 1 介绍下OpenOffice 官网:https://www.openoffice.org/download/ ...

  3. office@microsoft365@官方在线安装@第三方离线下载并安装(word+ppt+excel)

    文章目录 官方下载@office下载安装 其他(三方)安装途径(离线安装) 版本补充说明 官方下载@office下载安装 Download and install or reinstall Micro ...

  4. Office2016只安装三件套方法(word,ppt,excel)另附安装visio2016安装教程

    制作简介:在安装office时除了常用的三件套,office其他的组件基本用不上,但是一键安装的时候,无法选择安装:这里就介绍了只安装office三件套的方法: 1.下载需要的office安装文件io ...

  5. python word,ppt,excel转pdf(word转html),转图片

    word,ppt,excel转pdf 装依赖 pip install comtypes==1.1.10 转换 import comtypes.client import osdef ppt_pdf(p ...

  6. Office2016只安装三件套方法(word,ppt,excel)

    1. 从官网下载Office部署工具,虽然此工具是Office365的,但是无需担心. 2.安装该工具,会在我们指定的安装目录,生成以下的四个文件.这里我们只需要的setup.exe和configur ...

  7. 【亲测有效】更新了WIN11之后 右键无 新建WORD,PPT,EXCEL 选项 问题 解决方案

    原本正常的正版系统,在昨天4月自动更新安装之后,发现右键找 不到新建文档了,word,ppt,excel都不见了. 看了网上大神的方法 Win11安装了Office右键没有新建Excel选项怎么办? ...

  8. 【e悦读】支持PDF转WORD/PPT/Excel等

    [e悦读更新]支持PDF转WORD/PPT/Excel等 [重磅信息]e悦读ON-LINE 研发出新功能,目前支持7种功能:     1. PDF转word     2. PDF转html(网页)   ...

  9. 使用VBS实现word、excel批量转换为pdf

    使用VBS实现word.excel批量转换为pdf 由于最近我家tiger有这方面的需求,且她单位用的是office 2007的32位系统,网上python转换的方法无法奏效,所以使用通用性还可以的V ...

最新文章

  1. php的反射作用是什么意思,php反射的作用是什么
  2. oracle表没有数据判断,Oracle中判断有表DROP无表CREATE的存储过程
  3. Linux 网卡相关操作
  4. nfs文件服务器以及客户端基本配置
  5. build settings参数详解
  6. 可信云十年,重磅研究成果与2021云计算十大关键词悉数发布
  7. oracle 对两列加唯一性束_oracle中创建unique唯一约束(单列和多列) 。
  8. android 弹窗ui,Android 弹出窗口与对话框 UI设计
  9. redis的zset的底层实现_redis zset底层实现原理
  10. exam1802 Bounty Hunter II(DAG的最小路径覆盖)
  11. 论文简述 | Line Flow Based SLAM
  12. h5打开APP,如果未下载跳转下载页,如果已下载唤醒APP
  13. 关于使用阿里云centos7如何搭建L2TP用于学习2021年7月亲测
  14. 通过阿里接口查询银行卡信息
  15. 谷歌负载均衡Maglev实现简析
  16. OSChina 周六乱弹 —— 假如你被熊困到树上
  17. PHP Imagick发光文字
  18. ADL100(2)-Wuwei-检索式对话
  19. linux音乐应用程序,适用于节拍,循环,录音的最佳免费Linux音乐制作应用程序 | MOS86...
  20. 解决U盘文件变成快捷方式的最佳方法

热门文章

  1. 《码出高效:java开发手册》六-数据结构与集合(二)
  2. python爬快手个人介绍个性_快手个人介绍个性霸气说说_江湖一碗茶喝完各自爬...
  3. 剑指Offer——联通研究院笔、面试题 (Offer-1已收割)
  4. 读书笔记-Icepak自然冷却模拟设置步骤
  5. 在keil中看内存地址
  6. 印章如何去蜡_文社100:火漆印章的火漆蜡要怎么使用
  7. PPT绘图笔记2:PPT导出图片结合ps处理图片
  8. 带您聚焦第十四届中国航展新看点
  9. asp.net夜话之八:数据绑定控件
  10. 学术前沿趋势分析(一)