PHP 實現Word,excel等轉換pdf
最近做一個項目,需要將用戶上傳的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
</div>成功后即在后臺運行了該軟件。
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; } } } </pre><br />