博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php Windows office转pdf
阅读量:6688 次
发布时间:2019-06-25

本文共 4729 字,大约阅读时间需要 15 分钟。

原文链接地址  

 

OpenOffice

OpenOffice 是一套开源跨平台的办公软件,由许多自由软件人士共同来维持,让大家能在 Microsoft Office 之外,还能有免费的 Office 可以使用。

OpenOffice 与微软的办公软件套件兼容,能将 doc、xls、ppt 等文件转换为 PDF 格式,其功能绝对不比 Microsoft Office 差。

OpenOffice 官网:

OpenOffice 下载:

OpenOffice 需要 java 支持,请确认安装了 JDK,并配置了 JRE 环境变量。

 

1. 配置组件服务

OpenOffice 安装完成之后,按 win+R 快捷键进入运行菜单,输入 Dcomcnfg 打开组件服务。

 [组件服务] >> [计算机] >> [我的电脑] >> [DCOM配置] >> [OpenOffice Service Manager]

右键打开属性面板,选择安全选项卡,分别在 启动和激活权限 和 访问权限 上勾选自定义,添加 Everyone 的权限。

↑ 启动和激活权限 和 访问权限 都使用自定义配置

↑ 添加 Everyone 用户组,记得确认前先检查名称

↑ 两个自定义配置相同,允许 Everyone 拥有所有权限

再选择标识选项卡,勾选 交互式用户,保存设置后退出。

 

2. 后台运行软件

安装完 OpenOffice 后,需要启动一次确认软件可以正常运行,然后再打开命令行运行以下命令:

切换到安装目录:  cd C:\Program Files\OpenOffice 4\program  

后台运行该软件:  soffice -headless-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard  

PS:该命令只需要执行一次,就可以使软件一直在后台运行,即使重启服务器也不受影响。

 

3. 配置PHP扩展

如果是 PHP5.4 以前的版本,需要在 php.ini 里把 com.allow_dcom = true 打开(即去掉前面的分号)。

如果是 PHP5.4 之后的版本,则要在 php.ini 里增加一行扩展 extension = php_com_dotnet.dll 。

重启 Apache 或 IIS 服务器,打印 phpinfo() 信息,检查 com_dotnet 扩展是开启。

↑ 检查 php 的 ext 目录中 是否存在 com_dotnet.dll 文件,如果没有请自行下载对应版本的 dll

 

4. 实现文件转换

PDF 转换工具(支持 doc, docx, xls, xlsx, ppt, pptx 等格式)

class PDFConverter{    private $com;    /**     * need to install openoffice and run in the background     * soffice -headless-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard     */    public function __construct()    {        try {            $this->com = new COM('com.sun.star.ServiceManager');        } catch (Exception $e) {            die('Please be sure that OpenOffice.org is installed.');        }    }    /**     * Execute PDF file(absolute path) conversion     * @param $source [source file]     * @param $export [export file]     */    public function execute($source, $export)    {        $source = 'file:///' . str_replace('\\', '/', $source);        $export = 'file:///' . str_replace('\\', '/', $export);        $this->convertProcess($source, $export);    }    /**     * Get the PDF pages     * @param $pdf_path [absolute path]     * @return int     */    public function getPages($pdf_path)    {        if (!file_exists($pdf_path)) return 0;        if (!is_readable($pdf_path)) return 0;        if ($fp = fopen($pdf_path, 'r')) {            $page = 0;            while (!feof($fp)) {                $line = fgets($fp, 255);                if (preg_match('/\/Count [0-9]+/', $line, $matches)) {                    preg_match('/[0-9]+/', $matches[0], $matches2);                    $page = ($page < $matches2[0]) ? $matches2[0] : $page;                }            }            fclose($fp);            return $page;        }        return 0;    }    private function setProperty($name, $value)    {        $struct = $this->com->Bridge_GetStruct('com.sun.star.beans.PropertyValue');        $struct->Name = $name;        $struct->Value = $value;        return $struct;    }    private function convertProcess($source, $export)    {        $desktop_args = array($this->setProperty('Hidden', true));        $desktop = $this->com->createInstance('com.sun.star.frame.Desktop');        $export_args = array($this->setProperty('FilterName', 'writer_pdf_Export'));        $program = $desktop->loadComponentFromURL($source, '_blank', 0, $desktop_args);        $program->storeToURL($export, $export_args);        $program->close(true);    }}

 

使用 PDFConverter(必须传入绝对路径)

$arr = array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx');$converter = new PDFConverter();foreach ($arr as $ext) {    $source = __DIR__ . '/office/test.' . $ext;    $export = __DIR__ . '/pdf/test.' . $ext . '.pdf';    $converter->execute($source, $export);    echo '

' . $ext . ' Done

';}

 

 

Thinkphp中使用 

创建: 把第四步的 PDFConverter 类放进来

使用:

public function uploadFile ()    {        $storeID = I('storeID');        $printID = I('printID');        $upload           = new \Think\Upload();// 实例化上传类        $upload->maxSize  = 0;// 设置附件上传大小        $upload->exts     = array ('doc','docx','xls','xlsx','ppt','pptx','jpg','gif','png','jpeg');        $upload->savePath = '/office/'; // 设置附件上传目录        // 上传文件        $info = $upload->uploadOne($_FILES['file']);        if (!$info) {
// 上传错误提示错误信息 $ajax['code'] = 'error'; $ajax['msg'] = $upload->getError(); } else {
// 上传成功 $file = $info['savepath'] . $info['savename']; Vendor('officeToPDF.officetopdf'); $converter = new \PDFConverter(); $source = dirname(dirname(dirname(__DIR__))) . '/Uploads' . $file; $export = dirname(dirname(dirname(__DIR__))) . '/Uploads/pdf/'.date('Y-m-d', time()).'/'.$info['savename']. '.pdf'; $converter->execute($source, $export); } $this->ajaxReturn($file); }

 

转载于:https://www.cnblogs.com/zjj1990/p/8479308.html

你可能感兴趣的文章
VMWare14 安装Mac OS系统(图解)
查看>>
VR影视“万事俱备只欠东风”,它会成为下一个内容发展的风口吗?
查看>>
Kali Linux 网络扫描秘籍 第三章 端口扫描(一)
查看>>
6大历史遗留问题,将被区块链技术解决
查看>>
Installation failed with message INSTALL_FAILED_UID_CHANGED.--APK安装失败解决方法
查看>>
锐捷网络中标农行全国WLAN项目 助推“网点优势“转为“网络优势”
查看>>
万向区块链实验室董事长肖风:区块链经济才是真正的共享经济
查看>>
英伟达VR:GPU的发展还需要一个20年
查看>>
拿什么拯救你——王阿姨的少女心!
查看>>
共享单车步入物联网军备战
查看>>
斯坦福 CS183c 闪电式扩张(Blitzscaling)中文笔记
查看>>
MySQL时间戳与日期互转
查看>>
摘下月亮送给爱人?AstroReality用AR技术帮你实现
查看>>
PHP 魔术变量
查看>>
推荐的PHP编码规范
查看>>
从Linley Group预测报告看物联网四大趋势
查看>>
【AI科幻】地球陨落·真相(中)
查看>>
Gartner报告:东方金信进入Hadoop世界厂商名录
查看>>
参加2017开放数据中心峰会,探2020数据中心网络十大热点问题
查看>>
Python_(1)数据类型及其常见使用方法(图文)
查看>>