前段时间负责公司内部文件平台的设计,其中有一个需求是要能够在线浏览用户上传的 office 文件。

我的思路是先将 office 转换成 PDF,再通过 pdf.js 插件解析 PDF 文件,使其能在任何浏览器下查看。

可以通过 PHP 的 COM 组件,调用其它能够处理 office 文件的应用程序,利用提供的接口来转换 PDF 文件。

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 \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.php

使用 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>';
}

5. 查看PDF文档

最后分享一个基于 HTML5 的 PDF 阅读器插件 pdf.js,它是 Mozilla 实验室在 GitHub 上开源的一款 js 库,专门用来读取 PDF 文件。

由于是 Mozilla 的产品,所以在 Firefox 下表现的十分出色,并且只要是支持 HTML5 的浏览器,都能使用这款阅读器。

项目地址:https://github.com/mozilla/pdf.js

插件下载:http://mozilla.github.io/pdf.js/

↑ pdf.js 不能打开本地 pdf 文件,但可以通过 url 打开服务器上的文件,不支持跨域浏览 pdf

使用方法:1)将插件解压,放置在网站的根目录;2)通过网址访问 viewer.html;3)添加 file 参数指定 pdf 路径;

例如:http://localhost/pdfjs/web/viewer.php?file=/office/example.pdf

PHP 实现 word/excel/ppt 转换为 PDF的更多相关文章

  1. 21.PHP实现Word/Excel/PPT转换为PDF

    参考文档: https://www.cnblogs.com/woider/p/7003481.html http://blog.csdn.net/aoshilang2249/article/detai ...

  2. word/excel/ppt 2 PDF

    PHP 实现 word/excel/ppt 转换为 PDF 一般最常见的就是利用OpenOffice来转换,来看看实现的核心代码: class PDFConverter { private $com; ...

  3. Java使用Openoffice将word、ppt转换为PDF

    最近项目中要实现WORD的文件预览功能,我们可以通过将WORD转换成PDF或者HTML,然后通过浏览器预览. OpenOffice OpenOffice.org 是一套跨平台的办公室软件套件,能在 W ...

  4. word,excel,ppt转Pdf,Pdf转Swf,通过flexpaper+swftools实现在线预览

    其实这是我好几年前的项目,现在再用这种方式我也不建议了,毕竟未来flash慢慢会淘汰,此方式也是因为目测大部分人都装了flash,才这么做的,但是页面展示效果也不好.其实还是考虑收费的控件,毕竟收费的 ...

  5. word、ppt转换为pdf

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. word,excel,ppt转pdf

    第一步 需要下载jar包和jacob-1.14.3-x64.dll * <dependency> * <groupId>net.sf.jacob-project</gro ...

  7. winform显示word、ppt和pdf,用一个控件显示

    思路:都以pdf的格式展示,防止文件拷贝,所以要把word和ppt转换为pdf:展示用第三方组件O2S.Components.PDFView4NET.dll,破解版的下载链接:https://pan. ...

  8. PDF/WORD/EXCEL/PPT 文档在线阅读

    查资料看了2种解决方法: 1.通过办公软件dll转换,用flans去看 2.通过Aspose转换成pdf格式,在用js前台读pdf(我用的pdf.js) 今天我解决的就是WORD/EXCEL/PPT ...

  9. Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结

    Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word  excel pdf 的web预览要求 ...

随机推荐

  1. rabbitmq 源码安装

    官网地址:rabbitmqhttp://www.rabbitmq.com/releases/rabbitmq-server/官网地址:erlanghttp://erlang.org/download/ ...

  2. Project Euler Problem7

    10001st prime Problem 7 By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see t ...

  3. FreeSWITCH与PSTN对接

    FreeSWITCH与PSTN电话系统对接设定 一.环境介绍 我们目前使用模拟的话机连接到电信运营商,购买他们配套的电话总机,勉强实现了公司的基本通话.但是客户电话总机系统以及升级添加新的应用不但费用 ...

  4. SqlServer 2017 下载地址及密钥

    下载地址: ed2k://|file|cn_sql_server_2017_developer_x64_dvd_11296175.iso|1769777152|E21AE7C3576C0BDF1BC0 ...

  5. 性能测试十五:liunx下搭建(tomcat+项目+jmete命令行)

    单机 准备工作: 1.压力机安装并配置好JDK,输入java和javac验证环境变量 2.上传jmeter到liunx下: 准备好jmeter的压缩包 在第三方工具中对linux文件上传下载(需先装好 ...

  6. pytest七:assert断言

    断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了.什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试 pass,不符合预期那就测试 failed py ...

  7. web中切图、快速切图与web雪碧图制作的方法

    声明: web小白的笔记,欢迎大神指点,联系QQ:1522025433. 工具:Photoshop 1.复制文字:点击文章工具后选择文字. 2.矩形选框工具 看信息 f8, 取消矩形选框 Ctrl+D ...

  8. vue组件库(二):基于verdaccio工具npm私服搭建

    大纲 搭建npm私服的必要性 搭建npm私服的主要操作 一.搭建npm私服的必要性 二.搭建npm私服的主要操作 1.环境准备 确保服务器已安装以下包: node(必须) 安装了nodenpm,如果想 ...

  9. PAT 之 A+B和C

    时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard 题目描述 给定区间 [-2的31次方, 2的31次方] 内的3个整数 A.B 和 C,请判 ...

  10. HTTP请求报文和响应报文

    HTTP请求报文 GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User ...