一、概述
通过本方案可以解决上传办公文档(word、excel、ppt)文件到服务器,自动转化为pdf格式文件,方便在线预览。主要是通过软件的组件接口来实现文档转码。
一、服务器配置
- 服务器需要安转LibreOffice办公软件。LibreOffice是开源的软件,windows和linux系统都可以安转。
- LibreOffice下载地址:http://mirrors.ustc.edu.cn/tdf/libreoffice/stable/5.2.4/win/x86/LibreOffice_5.2.4_Win_x86.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;
}
}
}