php实现在线预览word等office文件,同时添加水印

最近需要在网页上实现预览上传的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文件添加水印

  • 下载地址
    fpdf: http://www.fpdf.org
    fpdi: https://www.setasign.com/products/fpdi/downloads/
    我下载的fpdi在使用过程中出现了一些问题,卡了挺久找不到原因,最后暂时使用了该博客里提供的fpdi:参考链接

  • 使用fpdf和fpdi并不麻烦,下载解压好后将他们放到项目文件中,然后在使用时直接调用就行。示例代码如下:

//添加日期作为水印
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文件,同时添加水印_第1张图片

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

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

你可能感兴趣的:(php)