搜索
查看: 7540|回复: 0

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

[复制链接]

152

主题

99

回帖

540

积分

高级会员

中国黑客

积分
540
QQ
发表于 2018-8-4 18:12:25 来自手机 | 显示全部楼层 |阅读模式 来自 甘肃
最近需要在网页上实现预览上传的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 在其中添加以下内容:
[pre]
    JAVA_HOME=/usr/java/jdk1.8.0_60
    CLASSPATH=$JAVA_HOME/lib/
    PATH=$PATH:$JAVA_HOME/binexport
    PATH JAVA_HOME CLASSPATH
[/pre]
改完后使用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文件,键入以下代码:
[pre]
$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;
    }
}
[/pre]

代码中的文件路径根据自己的情况修改,运行该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并不麻烦,下载解压好后将他们放到项目文件中,然后在使用时直接调用就行。示例代码如下:
[pre]
//添加日期作为水印
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');
[/pre]

下面是添加图片作为水印:
[pre]
//给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');
[/pre]

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

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

第二种
[pre]
$path = 'pic.pdf';
Header("Content-type: application/pdf");
header("Content-Disposition:inline;filename='pic.pdf'");
readfile($path);
[/pre]

效果如下:
18-07-24-20180803151836518.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表