一.windos 安装
1. 检查 java 环境
没有Java 环境,请先安装jdk。
2. 下载OpenOffice
OpenOffice 官网:http://www.openoffice.org/
OpenOffice 下载:http://www.openoffice.org/download/index.html
3. 安装OpenOffice
4.配置组件服务
OpenOffice 安装完成之后,按 win+R 快捷键进入运行菜单,输入 Dcomcnfg 打开组件服务。
[组件服务] >> [计算机] >> [我的电脑] >> [DCOM配置] >> [OpenOffice Service Manager]
右键打开属性面板,选择安全选项卡,分别在 启动和激活权限 和 访问权限 上勾选自定义,添加 Everyone 的权限。
↑ 启动和激活权限 和 访问权限 都使用自定义配置
↑ 添加 Everyone 用户组,记得确认前先检查名称
↑ 两个自定义配置相同,允许 Everyone 拥有所有权限
再选择标识选项卡,勾选 交互式用户,保存设置后退出。
5.启动后台服务
安装完 OpenOffice 后,需要启动一次确认软件可以正常运行,然后再打开命令行运行以下命令:
切换到安装目录: cd C:\Program Files (x86)\OpenOffice 4\program
后台运行该软件: soffice -headless-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
PS:该命令只需要执行一次,就可以使软件一直在后台运行,即使重启服务器也不受影响。
6. 配置PHP扩展
如果是 PHP5.4 以前的版本,需要在 php.ini 里把 com.allow_dcom = true 打开(即去掉前面的分号)。
如果是 PHP5.4 之后的版本,则要在 php.ini 里增加一行扩展 extension = php_com_dotnet.dll 。
重启 Apache 或 IIS 服务器,打印 phpinfo() 信息,检查 com_dotnet 扩展是开启。
7. 转换类
namespace common\models;
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/11/22 0022
* Time: 13:55
*/
// pdf转化类
class PDFConverter extends \yii\base\Model
{
private $com;
/**
* need to install openoffice and run in the background
* soffice -headless-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
*/
public function __construct()
{
try {
// 注意:
// 在yii框架下,COM前面必须加"\",否则找不到COM类
$this->com = new \COM('com.sun.star.ServiceManager');
} catch (Exception $e) {
die('Please be sure that OpenOffice.org is installed.');
}
}
/**
* Execute PDF file(absolute path) conversion
* @param $source [source file]
* @param $export [export file]
*/
public function execute($source, $export)
{
$source = 'file:///' . str_replace('\\', '/', $source);
$export = 'file:///' . str_replace('\\', '/', $export);
$this->convertProcess($source, $export);
}
/**
* Get the PDF pages
* @param $pdf_path [absolute path]
* @return int
*/
public function getPages($pdf_path)
{
if (!file_exists($pdf_path)) return 0;
if (!is_readable($pdf_path)) return 0;
if ($fp = fopen($pdf_path, 'r')) {
$page = 0;
while (!feof($fp)) {
$line = fgets($fp, 255);
if (preg_match('/\/Count [0-9]+/', $line, $matches)) {
preg_match('/[0-9]+/', $matches[0], $matches2);
$page = ($page < $matches2[0]) ? $matches2[0] : $page;
}
}
fclose($fp);
return $page;
}
return 0;
}
private function setProperty($name, $value)
{
$struct = $this->com->Bridge_GetStruct('com.sun.star.beans.PropertyValue');
$struct->Name = $name;
$struct->Value = $value;
return $struct;
}
private function convertProcess($source, $export)
{
$desktop_args = array($this->setProperty('Hidden', true));
$desktop = $this->com->createInstance('com.sun.star.frame.Desktop');
$export_args = array($this->setProperty('FilterName', 'writer_pdf_Export'));
$program = $desktop->loadComponentFromURL($source, '_blank', 0, $desktop_args);
$program->storeToURL($export, $export_args);
$program->close(true);
}
}
二、Ubuntu16.04安装
linux 下面缺少COM,所以做法和windos 不同
cd /home/daiven/downloads
下载地址:
http://www.openoffice.org/download/index.html
或从下面的分享连接下载:
链接:https://pan.baidu.com/s/1EqdSd3s32KwNSI2_Kq51NA
提取码:d2nd
用FTP上传到服务器/home/daiven/downloads
解压
tar -zxvf Apache_OpenOffice_4.1.2_Linux_x86-64_install-deb_zh-CN.tar.gz
mv zh-CN/ Apache_OpenOffice4.1.2
cd Apache_OpenOffice4.1.2/DEBS
sudo dpkg -i *.deb
cd /home/daiven/downloads/Apache_OpenOffice4.1.2/DEBS/desktop-integration
ls
openoffice4.1-debian-menus_4.1.2-9782_all.deb
安装菜单项,必须安装该菜单项后,刚才安装的OpenOffice才能够使用。
(在/DEBS/desktop-integration 目录下)
sudo dpkg -i openoffice4.1-debian-menus_4.1.2-9782_all.deb
//$sudo dpkg -i
到这里,安装完成
开启后台服务
cd /opt/openoffice4/program/
nohup ./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
打开另一个窗口,执行下面的命令:
ps as | grep soffice
显示如下:
0 21905 0000000000000000 0000000000000000 0000000000000001 0000000000014002 S pts/1 0:00 /bin/sh ./soffice -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard
0 21914 0000000000000000 0000000000000000 0000000000001000 00000001fbc064f7 Sl pts/1 0:00 /opt/openoffice4/program/soffice.bin -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard
0 21932 0000000000000000 0000000000000000 0000000000000000 0000000180000000 S+ pts/2 0:00 grep --color=autosoffice
2. 下载JODConverter
https://sourceforge.net/projects/jodconverter/files/latest/download
解压:
unzip jodconverter-2.2.2.zip
进入目录:
cd jodconverter-2.2.2/lib
测试转换(test.docx=>test.pdf):
java -jar jodconverter-cli-2.2.2.jar test.docx test.pdf
返回信息如下:
Nov 22, 2018 8:05:33 PM com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection connect
INFO: connected
Nov 22, 2018 8:05:33 PM com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection disposing
INFO: disconnected
经过测试发现,格式转换成功,只是中文字体没有转换出来,解决如下:
下载 simhei.ttf 黑体 ,simsun.ttc 宋体两种字体文件 ,找到jre的字体路径:/usr/share/fonts,新建文件夹fallback(mkdir fallback),将字体simhei.ttf 、simsun.ttc拷贝到/usr/share/fonts/fallback目录下,
将winows 的字体拷贝到/usr/share/fonts/fallback 目录下
重启 openoffice
php调用
$command = "java -jar /home/daiven/downloads/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar test.docx test.pdf";
//exec($command, $output);
//system($command);
//passthru($command);
调用出现如下错误:
passthru() has been disabled for security reasons
exec() has been disabled for security reasons
system() has been disabled for security reasons
解决:
编辑php.ini文件
disable_functions = scandir,passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen
去掉passthru,exec,system 保存并重起php-fpm即可。
目前存在的问题:
不管是标题含有中文还是内容含有中文,都不能转换,需要设置字体。。。。。