一、开发环境:
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);
4.效果:
5.注意:$input_url
和 $output_url
的路径需要写绝对路径