2013-07-01 17:56:49 jackyrongvip 阅读数 4633
1 phpexcel
   最强大完整的类库了,地址在:
http://phpexcel.codeplex.com

2 simpleexcel-php

  这个简单好用点,当然特性没那么多:
http://faisalman.github.com/simple-excel-php/


3 如果要是读入或者导出excel的话,可以用这个:
   http://code.google.com/p/php-excel-reader/

4 处理WORD的
  http://phpword.codeplex.com/
  当数这个最强大了

5 处理powerpoint的
   http://phppowerpoint.codeplex.com/
2015-04-14 17:06:37 u014296016 阅读数 2403

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-08-03 15:36:18 yohjob 阅读数 7962

最近需要在网页上实现预览上传的word文档,并能在预览中添加自己的水印,之前没有实现过相关功能,搜索了一下网上的资料,清晰完整的教程较少,因此将自己实现的步骤和遇到的问题记录下来,希望能帮到有需要的人

**服务器操作系统:linux centos **
整个实现步骤简要如下:

  • 安装配置OpenOffice、java、jodconverter,实现office文件转pdf

  • 下载fpdf、fpdi库,使用其中的API实现给pdf文件添加水印

  • 将添加水印后的pdf文件在网页上显示出来

详细步骤如下:

1.安装OpenOffice

  • 下载OpenOffice 下载地址:http://www.openoffice.org/download/
    根据自己系统的情况选择下载类型,我选择的是x86_64,RPM格式

  • 将OpenOffice安装包上传到服务器中

  • 切换到安装包所在目录,使用以下命令解压OpenOffice安装包
    tar -zxvf Apache_OpenOffice_4.1.5_Linux_x86-64_install-rpm_zh-CN.tar.gz

  • 会看到当前目录下多了一个"zh-CN"文件夹,切换进入该文件夹中的"RPMS"目录,使用以下命令安装OpenOffice:
    rpm -ivh *.rpm
    安装成功后就可以启动OpenOffice服务了

  • 启动OpenOffice服务
    先切换到’openoffice4/program/'目录下(安装包解压后出现的目录),使用以下命令启动服务:
    ./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &
    以下是可能需要用到的命令:

    • 查看OpenOffice是否成功启动:
      netstat -nlp | grep 8100 如果没有显示则没成功
      ps -ef |grep 8100
      启动后若要停止服务只需kill服务的PID就行
    • 卸载Openoffice

    rpm -e rpm -qa |grep openoffice rpm -qa |grep ooobasis

2.安装JAVA环境(如果服务器没有JAVA环境的话)
OpenOffice的运行需要JAVA,所以必须安装。
首先使用java -version查看自己服务器是否已经安装了

  • 下载JDK,下载地址:
    http://www.oracle.com/technetwork/java/javase/downloads/index.html
    根据自己的情况选择JAVA版本,操作系统位数不要选错
  • 将JDK上传到服务器的目录下,我的目录是/opt/java/,然后使用以下命令解压:
    tar -zxvf jdk-8u181-linux-x64.tar.gz (jdk名改成自己的)
  • 解压完成后编辑配置文件:vim /etc/profile 在其中添加以下内容:
	JAVA_HOME=/usr/java/jdk1.8.0_60
	CLASSPATH=$JAVA_HOME/lib/
	PATH=$PATH:$JAVA_HOME/bin
	export PATH JAVA_HOME CLASSPATH
  • 改完后使用source /etc/profile 更新系统环境配置。
  • 查看JAVA环境是否安装成功:java -version
  • 重新运行OpenOffice,查看是否成功,一般都没啥问题。

3.安装jodconverter

  • 使用jodconverter调用openoffice来实现office文件转pdf,这个方法对于linux下的php比较方便。
    jodconverter下载地址:
    https://sourceforge.net/projects/jodconverter/files/
  • 下载完后上传到linux服务器解压,然后切换到jodconverter的lib目录下,使用以下命令测试word转pdf:
    java -jar jodconverter-cli-2.2.2.jar test.docx test.pdf
    如果成功将word文档转成pdf文档,则表示你的openoffice和jodconver都已经安装成功了。(该命令默认test.docx也在lib目录下)
    当然你也可以不用切换到lib目录,使用以下命令也能实现转换:
    java -jar 'jar包地址' '源文件地址' '输出文件地址'
  • 转换完成后查看一下pdf文件内容,看看是否中文出现乱码或者显示不出,若存在该情况,还需要进行下面这一步:

4.解决转换结果中中文内容显示出错的问题

  • 将windows系统的c:\window\fonts目录下的字体上传到linux服务器的
    usr\share\fonts目录下,一般都是这个目录,可以用cat /etc/fonts/fonts.conf确认一下。
  • 上传完成后,使用命令fc-cache -fv更新缓存,然后重启openoffice服务,重新尝试文档转换。

5.尝试使用php实现文档转换

  • 新建一个php文件,键入以下代码:
$jodconverter_path = '/opt/jodconverter/lib/jodconverter-cli-2.2.2.jar';
$infile_path       = '/opt/test/1.docx';
$outfile_path      = '/opt/test/1.pdf';
echo word2pdf($infile_path, $outfile_path, $jodconverter_path);

function word2pdf ($infile_path, $outfile_path, $jodconverter_path) {
    if (empty($infile_path)) return false;    
    try {
        $p = "/opt/java/jdk1.8.0_181/bin/java -jar ". $jodconverter_path. ' '. $infile_path. ' '. $outfile_path;
        
        $res = exec($p);
        return $res;
    } catch (Exception $e) {
        return false;
    }
}
  • 代码中的文件路径根据自己的情况修改,运行该php文件,则可以测试php能否成功将文件进行转换。
    在测试的过程中若遇到php无法执行exec()函数的问题,需要修改php.ini里的配置(disable_function等)。
  • 说一下我遇到的问题,就是php运行exec()时受到权限限制,无法执行命令,返回值为127。在网上找了一下解决方法,发现都是修改运行php的用户权限来实现的,这样会降低项目的安全性。
    最后我发现了一个简单的解决方法,就是把java -jar命令修改为/opt/java/jdk1.8.0_181/bin/java -jar,也就是把java程序的全路径写出来,这样就能正常运行了。所以这个权限问题应该是运行php的当前用户没有访问系统$PATH的权限。

6.使用fpdf和fpdi给pdf文件添加水印

//添加日期作为水印
require_once('./fpdf/fpdf.php');
require_once('./fpdi/fpdi.php');

$pdf = new FPDI();
//获取pdf页数
$pageCount = $pdf->setSourceFile('more.pdf');
//遍历每一页,添加水印
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++)
{
    //获取当前页
    $templateId = $pdf->importPage($pageNo);
	//获取当前页大小
    $size = $pdf->getTemplateSize($templateId);
    //创建一页空白页
    if ($size['w'] > $size['h'])
	   $pdf->AddPage('L', array($size['w'], $size['h']));
    else 
	   $pdf->AddPage('P', array($size['w'], $size['h']));
    //加上当前页
    $pdf->useTemplate($templateId);
    //设置水印字体
    $pdf->SetFont('Arial','B','12');
    //加上水印
    $pdf->SetXY(10, 20); //水印坐标
    $pdf->Write(7, date('Y-m-d'));
}
$pdf->Output('word.pdf');

下面是添加图片作为水印:

//给pdf添加图片水印,与添加文字水印大同小异
require_once('./fpdf/fpdf.php');
require_once('./fpdi/fpdi.php');

$pdf = new FPDI();
$pageCount = $pdf->setSourceFile('more.pdf');
    
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++){
    $templateId = $pdf->importPage($pageNo);
    $size = $pdf->getTemplateSize($templateId);
    if ($size['w'] > $size['h']) 
	   $pdf->AddPage('L', array($size['w'], $size['h']));
    else 
	   $pdf->AddPage('P', array($size['w'], $size['h']));

    $pdf->useTemplate($templateId);
    $pdf->image("test.png", 75, 85, 50);//加上图片水印,后为坐标
}
$pdf->Output('pic.pdf');

7. 在页面上实现预览
两种方法

  • 第一种:
$path = 'pic.pdf';
$file = fopen($path, "r");
Header("Content-type: application/pdf");
echo fread($file, filesize($path));
fclose($file);

  • 第二种
$path = 'pic.pdf';
Header("Content-type: application/pdf");
header("Content-Disposition:inline;filename='pic.pdf'");
readfile($path);
  • 效果如下:
    这里写图片描述

图片的透明度什么的靠自己设置了。

以上就是php实现在线预览word等office文件,并在其中添加水印的个人实现过程。
如有错误,欢迎指正哈! ?

PHP操作Excel

阅读数 3823

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