美文网首页
php通过DCOM组件转化文件为pdf

php通过DCOM组件转化文件为pdf

作者: 越长大就越孤单 | 来源:发表于2017-01-11 14:49 被阅读0次

    一、概述

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

    一、服务器配置

    图片.png

    找到LibreOffice的组件

    图片.png

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

    图片.png 图片.png

    表示改为交互式

    图片.png
    • 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;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:php通过DCOM组件转化文件为pdf

          本文链接:https://www.haomeiwen.com/subject/jfkrbttx.html