转载:php通过DCOM组件转化文件为pdf(LibreOffice)

一、概述
通过本方案可以解决上传办公文档(word、excel、ppt)文件到服务器,自动转化为pdf格式文件,方便在线预览。主要是通过软件的组件接口来实现文档转码。

一、服务器配置

  • 服务器需要安转LibreOffice办公软件。LibreOffice是开源的软件,windows和linux系统都可以安转。
  • LibreOffice下载地址:

http://mirrors.ustc.edu.cn/tdf/libreoffice/stable/6.4.0/win/x86_64/LibreOffice_6.4.0_Win_x64.msi

  • windows系统下安转LibreOffice后需要设置LibreOffice组件的权限
  • 在控制面板中打开管理工具,在打开组件服务,如下图:

在这里插入图片描述

找到LibreOffice的组件

在这里插入图片描述

右键设置属性,安全里面都使用自定义选项,单击编辑添加权限任何人:

在这里插入图片描述
在这里插入图片描述

表示改为交互式

在这里插入图片描述
php.ini需要修改com.allow_dcom = true前面的’;'号去掉添加

com.allow_dcom = true
[PHP_COM_DOTNET]
extension=php_com_dotnet.dll

二、引入写好的pdf类,调用run方法即可实现转化

class Pdf
{
    /**
     * 执行文件转化
     * @param $name
     * @param $newName
     * @return int 页数
     */
    public static function run($name, $newName = null){
        $root = str_replace("\\","/",realpath(dirname(__FILE__).'/../../../').'/public');
        $name = "file:///".$root.$name;
        $newName = $newName ? $newName : substr($name,0,strripos($name,'.')).'.pdf';
        return self::transform($name, $newName);
    }

    public static function transform($input_url, $output_url){
        $osm = new \COM("com.sun.star.ServiceManager") or die ("调用组件接口失败");
        $args = array(self::MakePropertyValue($osm,"Hidden",true));
        $oDesktop = $osm->createInstance("com.sun.star.frame.Desktop");
        if(!$oDesktop) {
            return false;
        }
        $oWriterDoc = $oDesktop->loadComponentFromURL($input_url,"_blank", 0, $args);
        if(!$oWriterDoc) {
            return false;
        }
        $export_args = array(self::MakePropertyValue($osm,"FilterName","writer_pdf_Export"));
        $oWriterDoc->storeToURL($output_url,$export_args);
        $oWriterDoc->close(true);
        return self::getPdfPages($output_url);
    }

    public static function MakePropertyValue($osm,$name,$value){
        $oStruct = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
        $oStruct->Name = $name;
        $oStruct->Value = $value;
        return $oStruct;
    }

    /**
     * 获取PDF文件页数的函数获取
     * 文件应当对当前用户可读(linux下)
     * @param  [string] $path [文件路径]
     * @return int
     */
    public static 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;
        }
    }
}

作者:越长大就越孤单
链接:https://www.jianshu.com/p/9a89d23080bb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值