1. 程式人生 > 實用技巧 >PHP 利用 Apache OpenOffice 將word、excel轉為pdf

PHP 利用 Apache OpenOffice 將word、excel轉為pdf

一、開發環境:
windows7(64位)+ Apache 2.4.23 + PHP 5.6.28 + mysql 5.7.15

二、前提:
安裝JDK,並配置好相關變數:
1.http://www.oracle.com/technetwork/java/javase/downloads/index.html 官網下載並安裝最新jdk;
2.配置系統變數 JAVA_HOME ,值為 C:\Program Files\Java\jdk1.8.0_112(jdk的目錄);
3.配置系統變數 CLASSPATH ,值為 %JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar ;
4.配置系統變數 path ,新增值為 ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin(注:和前面的值用;隔開);

詳情可參見 http://jingyan.baidu.com/article/3c343ff70bc6ea0d377963df.html

三、安裝 Apache OpenOffice :
1.http://www.openoffice.org/ 官網下載並安裝最新版AOO;
2.安裝完AOO後,設定許可權:
開始》執行》輸入Dcomcnfg》元件服務》計算機》我的電腦》DCOM配置》OpenOffice Service Manager》屬性》安全

(1)》啟動和啟用許可權》自定義》編輯》新增 Everyone 的許可權:

3.驗證AOO:
(1)點選AOO的快捷方式圖示,確認可以正常執行軟體:

(2)命令列進到 program 的目錄下,我的目錄是C:\Program Files (x86)\OpenOffice 4\program,輸入下面的命令:
soffice -headless-accept=”socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard
成功後,即在後臺運行了該軟體:

四、配置php.ini
1.com.allow_dcom = true
2.extension=php_com_dotnet.dll
3.ext 資料夾記憶體在 php_com_dotnet.dll
4.phpinfo() 驗證檢視:

5.重啟apache

五、程式碼實現:

1.office文件轉pdf工具類 pdf.php

<?php
/** 
 * office文件轉換為PDF類
 */  

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;  
        }  
    }  

}

  2.新建幾個office檔案,包括.doc .docx .xls .xlsx,以備測試:

3.測試 test.php:

<?php
require_once 'pdf.php';
$pdf = new office2pdf();
$input_url1 = dirname(__FILE__).'/hello.doc';
$output_url1 = dirname(__FILE__).'/hello.pdf';
$pdf->run($input_url1,$output_url1);
$input_url2 = dirname(__FILE__).'/hi.docx';
$output_url2 = dirname(__FILE__).'/hi.pdf';
$pdf->run($input_url2,$output_url2);
$input_url3 = dirname(__FILE__).'/sheet1.xls';
$output_url3 = dirname(__FILE__).'/sheet1.pdf';
$pdf->run($input_url3,$output_url3);
$input_url4 = dirname(__FILE__).'/sheet2.xlsx';
$output_url4 = dirname(__FILE__).'/sheet2.pdf';
$pdf->run($input_url4,$output_url4);