2017-04-06 19:46:17 u012369749 阅读数 682

关于使用PHP转换office文件为PDF的解决方案!

最近遇到了相关的问题,需要让office相关文件在线浏览,类似于百度文库,之前接触过,知道可以使用pdf.js在线浏览PDF文件,那么现在就需要将Word文件转为PDF文件,PPT文件转为PDF文件,Excel文件转为PDF文件,然后让用户在线浏览,这样效果就达到了。本次着重讲解文件转换openoffice的使用。
目录如下:


必须配置Java运行环境

下载安装

主要安装OpenOffice 及 jodconverter (点此下载 原谅我打个友链
OpenOffice的官网地址: https://www.openoffice.org
OpenOffice的文档地址: https://wiki.openoffice.org/wiki/Main_Page
OpenOffice的下载地址: https://www.openoffice.org/download/index.html
这里面可以按照自己的操作系统进行选择并下载:

下载界面

下载之后直接以默认的方式安装即可,也可以自定义的哈。

设置权限

按照下方的步骤打开OpenOffice的服务管理配置:

cmd 运行Dcomcnfg.exe->组件服务->计算机->我的电脑->DCOM配置->OpenOffice Service Manager..

打开之后如下图:

OpenOffice服务管理

设置“安全”选项卡

选中OpenOffice的服务后,鼠标右键,选择“属性”,打开如下界面:

这里写图片描述

按照上图红框标识的进行设置,将“安全”选项 所有的内容都设置为 “自定义” > 然后添加 “Everyone” 用户,允许所有权限即可

设置 “标识”选项卡

选择 “交互式用户”  > 确认并应用

这里写图片描述

启动OpenOffice服务命令

打开cmd(建议用管理员权限运行,保证服务正常开启)
先进入OpenOffice安装目录,例如我安装的: cd  C:\Program Files (x86)\OpenOffice 4\program
启动服务:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 

运行之后,打开 “任务管理器”,可以看到应用已经正常运行了

这里写图片描述

使用jodconverter 转换文件

核心转换java命令行是

java -jar jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar  源文件路径  目标文件路径

可以直接使用以上命令,在dos命令行模式下进行转换。如此便可使用PHP代码执行此命令了,PHP的代码如下:

<?php
/**
 * Created by PhpStorm.
 * User: yezhimeih7
 * Date: 2017/4/6
 * Time: 16:13
 * copy: http://www.tcioc.com
 */

set_time_limit(0);
function openOffice($input_file,$type="pdf"){
    //转换路径的字符编码
    $input_file=iconv("utf-8", "gb2312", $input_file);
    //获取输出的标题
    $out_file=substr($input_file, 0,strrpos($input_file, "."));
    //非指定转换为PDF格式的文件,默认后缀为html
    if($type!=="pdf"){
        $out_file=$out_file.'.html';
    }else{
        // 对输出标题 去除空格 
        $out_file=$out_file.'.pdf';
        $out_file=trim($out_file);
        $out_file=str_replace(" ","",$out_file);
    }
    // dos 命令中,对于有空格的文件夹或者文件名,需要用 双引号(") 括起来,这样就可以正常运行dos命令了
    $file='java -jar jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar  ./'.'"'.$input_file.'"  ./'.'"'.$out_file.'" ';
    // PHP执行命令,这里在linux系统时,会有些不同
    $status=exec($file);
    return $status;
}
// 调用函数,处理转换
openOffice("./data/upload/ueditor/分析设计.pptx");

这里的PHP代码可以 用网站的形式访问,也可以用 cli 的模式运行。
运行成功之后,如下图所示:
这里写图片描述

注意:文件名中 带有 空格,依旧可以转换的哟~


Linux下OpenOffice的使用(转)

你需要几下载几个包,然后安装配置一下:

OOo_3.3.0_Linux_x86_install-rpm-wJRE_en-US.tar.gz
OOo-SDK_3.3.0_Linux_x86_install-rpm_en-US.tar.gz
jodconverter.2.2.2

1. 安装openoffice3

tar zxvf OOo_3.3.0_Linux_x86_install-rpm-wJRE_en-US.tar.gz
cd OOO330_m20_native_packed-1_en-US.9567/RPMS
rpm -ivh *.rpm --nodeps --force

安装后的默认目录是在:/opt/目录下面

启动服务:
/opt/openoffice.org3/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

开机启动:
vi /etc/rc.local

在最后面加入启动语句

2. 安装OpenOffice SDK3.3
tar zxvf OOo-SDK_3.3.0_Linux_x86_install-rpm_en-US.tar.gz
cd OOO330_m20_native_packed-1_en-US.9567/RPMS/
rpm -vih *.rpm

3. 安装jodconverter.2.2.2 ,安装了这个之后就已经可以实现DOC转PDF了。
这个安装很简单,直接上网站下一个这个东东回来。
解压,复制到一个目录里面去,就能直接用了,调用它里面的/lib/jodconverter-cli-2.2.2.jar这个玩意儿就行,可以直接运行命令测试:  

java -jar /usr/local/wenku/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar /tmp/1.doc /tmp/1.pdf

配置运行上面的命令成功之后,可以参考windows下的PHP代码调用运行即可!

参考资料:
https://www.openoffice.org
http://blog.csdn.net/xyz_dream/article/details/52672319
https://zhidao.baidu.com/question/1047506507169557019.html
https://www.oschina.net/question/227511_87517
https://wiki.openoffice.org/wiki/Main_Page

2018-10-26 15:19:22 Douz_lungfish 阅读数 276

原理:基于已安装的openOffice和jodconverter-2.2.2,PHP调用外部命令使用jodconverter-2.2.2完成文档转换

openoffice和jodconverter-2.2.2的安装并实现office转换可以参考CentOS 下安装openOffice,并在Linux上实现office转PDF

配置权限

因为Linux权限问题,在使用PHP执行该命令时会出现权限问题,因此需要给java所在目录和文件转换前后所在目录添加777权限

找到java位置,并进入其所在目录:

 

执行(chmod -R 777 java)赋予java目录读写权限:

 

同样给转换前后目录赋予读写权限,在这里都是/tmp目录(根据你自己的文件存放目录设置):

 

 

实现转换

首先要修改php的配置文件,因为默认情况下php会将shell_exec()这个功能禁用了,所以需要手动打开;忽略这一步会造成php 报错:shell_exec() has been disabled for security reasons

找到php.ini配置文件所在后使用vi或者vim打开,vi/vim中搜索字符串,直接输入:/+需要查找字符串,就可以了(/disable_functions搜索disable_functions),然后将对应方法删除,重启服务即可

 

在PHP中使用shell_exec()来执行转换命令:

 

执行,没有输出(原因是shell_exec()函数没有返回值):

 

在目录中查看,文件已经转换成功:

至此,PHP实现office转pdf便已经实现。

 

 

2015-04-14 17:06:37 u014296016 阅读数 2405

Office 365 简单说就是云中的 Office,是能够提供最佳生产力和高效协同的高端云服务,是微软公司基于云平台的应用套件。 Office 365 REST API 包含了对以下数据的操作:

  • Exchange Online 的邮件(Mail)、日历(Calendar)、联系人(Contact)
  • SharePoint Online 和 OneDrive for Business 的文件和文件夹
  • Azure 活动目录(Active Directory)的用户和用户组

来张结构图看得更直观一些。
Office 365 Architecture

微软官方 Office 365 REST API 文档

在中国大陆地区的 Office 365 是由21世纪互联来运营的,所以在中国使用的 API 接口地址也是和全世界其它地域不一样的。 这个文档记录了所有 Office 365 在国内和国外所使用的 REST API 接口地址

接下去我会用到微软开放技术的一个开源项目来作为例子,简单介绍一下如何用 PHP 来对 Office 365 REST API 进行操作。 在这个项目里,Office 365 的 API 已插件的形式被接到 Moodle 上。 这样一来,用户可以实现 Moodle 和 Office 365 之间的数据互通,做到实时数据同步。


Single Sign-On

实现与 Office 365 的单点登录可以通过以下几个方法:

  • Active Directory 联合身份验证服务(ADFS)
  • Shibboleth 标识提供程序
  • SAML 2.0 标识提供程序
  • 批准的第三方标识提供程序

HTTP Client

定义专用于连接 Office 365 REST API 的 HTTP client 对象 httpclient(继承自 Curl),支持 get、post、put、patch、merge、delete 的操作。


Calendar

定义对 Calendar REST API 操作的对象 calendar(继承自 o365api)。 在 Moodle 的使用场景中,用户需要将 Moodle 事件实时同步至 Office 365 日历上。

创建新的事件 POST 以下数据至
https://partner.outlook.cn/api/v1.0/me/events

{
  "Subject": "新建事件的标题",
  "Body": {
    "ContentType": "HTML",
    "Content": "新建事件的内容"
  },
  "Start": "2014-07-02T18:00:00Z",
  "End": "2014-07-02T19:00:00Z",
  "Attendees": [
    {
      "EmailAddress": {
        "Address": "用户登陆邮箱地址",
        "Name": "用户姓名"
      },
      "Type": "Required"
    }
  ],
  "StartTimeZone": "Pacific Standard Time",
  "EndTimeZone": "Pacific Standard Time"
}

更新现有的事件 PATCH 以下数据(只包含被更新的内容)至
https://partner.outlook.cn/api/v1.0/me/events/{event_id}

{
  "Location": {
    "DisplayName": "更新的事件地点"
  }
}

删除现有的事件发送 DELETE 至
https://partner.outlook.cn/api/v1.0/me/events/{event_id}

有关更多的操所,请参考 Calendar REST API 操作的详细文档。


OneDrive for Business

定义对 Files REST API 操作的对象 onedrive(继承自 o365api)。 在 Moodle 的使用场景中,用户需要访问在 OneDrive 云存储上的文件。

创建新的文件 PUT 文件数据至
https://{tenant}-my.partner.sharepoint.cn/_api/v1.0/me/Files/{parent-id}/children/{file-name}/content
请参考 httpclient 里的 put() 函数对处理新建文件的逻辑。

获取文件夹内容发送 GET 至
https://{tenant}-my.partner.sharepoint.cn/_api/v1.0/me/Files/getByPath('{folder-path}')/children

获取文件可以使用绝对路径或者文件 ID,发送 GET 至
https://{tenant}-my.partner.sharepoint.cn/_api/v1.0/me/Files/getByPath('{file-path}')/content
https://{tenant}-my.partner.sharepoint.cn/_api/v1.0/me/Files/{file-id}/content

有关更多的操所,请参考 Files REST API 操作的详细文档。


这篇博客写得比较仓促,还有很多有关 Office 365 REST API 的操作没有提到,以后会慢慢补上。 作为学习目的,这个用 PHP 写的 Moodle 集成 Office 365 的开源项目 绝对是一个好的参考。

2018-02-27 15:51:00 zl_j_c 阅读数 149

原文链接地址  https://www.cnblogs.com/woider/p/7003481.html

 

OpenOffice

OpenOffice 是一套开源跨平台的办公软件,由许多自由软件人士共同来维持,让大家能在 Microsoft Office 之外,还能有免费的 Office 可以使用。

OpenOffice 与微软的办公软件套件兼容,能将 doc、xls、ppt 等文件转换为 PDF 格式,其功能绝对不比 Microsoft Office 差。

OpenOffice 官网:http://www.openoffice.org/

OpenOffice 下载:http://www.openoffice.org/download/index.html

OpenOffice 需要 java 支持,请确认安装了 JDK,并配置了 JRE 环境变量。

 

1. 配置组件服务

OpenOffice 安装完成之后,按 win+R 快捷键进入运行菜单,输入 Dcomcnfg 打开组件服务。

 [组件服务] >> [计算机] >> [我的电脑] >> [DCOM配置] >> [OpenOffice Service Manager]

右键打开属性面板,选择安全选项卡,分别在 启动和激活权限 和 访问权限 上勾选自定义,添加 Everyone 的权限。

↑ 启动和激活权限 和 访问权限 都使用自定义配置

↑ 添加 Everyone 用户组,记得确认前先检查名称

↑ 两个自定义配置相同,允许 Everyone 拥有所有权限

再选择标识选项卡,勾选 交互式用户,保存设置后退出。

 

2. 后台运行软件

安装完 OpenOffice 后,需要启动一次确认软件可以正常运行,然后再打开命令行运行以下命令:

切换到安装目录:  cd C:\Program Files\OpenOffice 4\program  

后台运行该软件:  soffice -headless-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard  

PS:该命令只需要执行一次,就可以使软件一直在后台运行,即使重启服务器也不受影响。

 

3. 配置PHP扩展

如果是 PHP5.4 以前的版本,需要在 php.ini 里把 com.allow_dcom = true 打开(即去掉前面的分号)。

如果是 PHP5.4 之后的版本,则要在 php.ini 里增加一行扩展 extension = php_com_dotnet.dll 。

重启 Apache 或 IIS 服务器,打印 phpinfo() 信息,检查 com_dotnet 扩展是开启。

↑ 检查 php 的 ext 目录中 是否存在 com_dotnet.dll 文件,如果没有请自行下载对应版本的 dll

 

4. 实现文件转换

PDF 转换工具(支持 doc, docx, xls, xlsx, ppt, pptx 等格式)

class PDFConverter
{
    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 {
            $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);
    }
}

 

使用 PDFConverter(必须传入绝对路径)

$arr = array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx');

$converter = new PDFConverter();

foreach ($arr as $ext) {
    $source = __DIR__ . '/office/test.' . $ext;
    $export = __DIR__ . '/pdf/test.' . $ext . '.pdf';
    $converter->execute($source, $export);
    echo '<p>' . $ext . ' Done</p>';
}

 

 

Thinkphp中使用 

创建: 把第四步的 PDFConverter 类放进来

使用:

public function uploadFile ()
    {

        $storeID = I('storeID');
        $printID = I('printID');

        $upload           = new \Think\Upload();// 实例化上传类
        $upload->maxSize  = 0;// 设置附件上传大小
        $upload->exts     = array ('doc','docx','xls','xlsx','ppt','pptx','jpg','gif','png','jpeg');
        $upload->savePath = '/office/'; // 设置附件上传目录
        // 上传文件
        $info = $upload->uploadOne($_FILES['file']);
        if (!$info) {// 上传错误提示错误信息
            $ajax['code'] = 'error';
            $ajax['msg'] = $upload->getError();
        } else {// 上传成功
            $file = $info['savepath'] . $info['savename'];
            Vendor('officeToPDF.officetopdf');
            $converter = new \PDFConverter();
            $source = dirname(dirname(dirname(__DIR__))) . '/Uploads' . $file;
            $export = dirname(dirname(dirname(__DIR__))) . '/Uploads/pdf/'.date('Y-m-d', time()).'/'.$info['savename']. '.pdf';
            $converter->execute($source, $export);
        }

        $this->ajaxReturn($file);
    }

 

没有更多推荐了,返回首页