php 文件预览 水印,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);

效果如下:

0e0ed013bbc2b8618d5cce1dda8f5c7a.png

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

以上就是php实现在线预览word等office文件,并在其中添加水印的个人实现过程。

如有错误,欢迎指正哈! ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值