PHP 实现Word,excel等转换pdf

jopen 7年前

最近做一个项目,需要将用户上传的word,excel文档转成PDF文档保存并打印,在网上找了很多资料,并不全面,所以自己写了一份比较全面的教程来分享。

下面是操作步骤:

1、        安装免费的openOffice软件,请至openoffice.org下载最新版本。

2、        JDK支持,请自行搜索下载最新版本JDK。

3、        安装完openOffice后,在开始--运行中输入Dcomcnfg打开组件服务。在组件服务—计算机—我的电脑—DCOMP配置中,选择

在这两项上分别点击右键属性,打开属性面板如下图:

选择安全选项卡,分别在启动和激活权限和访问权限两项上点自定义,添加Everyone的权限。

选择标识选项卡,选择交互式用户。

 

4、        安装完openOffice后,请先打开一次确认可以正常运行软件,然后退出后用命令行运行以下命令。

先到安装目录下,例如:C:\Program Files\OpenOffice 4\program\

执行命令:

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

成功后即在后台运行了该软件。

 

5、        如果是php5.4.5以前版本,需要在php.ini里把com.allow_dcom = true打开,即去掉前面的分号。如果是以后版本,需要在php.ini 里增加一行扩展extension=php_com_dotnet.dll,然后检查php的ext目录中是否存在该dll文件,如果没有请自行下载对应版本的dll。然后重启apache或IIS服务器。

6、        代码实现

 

    /**        * office文档转换为PDF类        * @author jinzhonghao <954299193@qq.com> created 2015-04-23        */                        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;                }            }                }  

来自:http://blog.csdn.net/jzh2004/article/details/46440799