最近需要在网页上实现预览上传的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 &
以下是可能需要用到的命令:
netstat -nlp | grep 8100
如果没有显示则没成功ps -ef |grep 8100
rpm -e rpm -qa |grep openoffice
rpm -qa |grep ooobasis
2.安装JAVA环境(如果服务器没有JAVA环境的话)
OpenOffice的运行需要JAVA,所以必须安装。
首先使用java -version
查看自己服务器是否已经安装了
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 -version
3.安装jodconverter
java -jar jodconverter-cli-2.2.2.jar test.docx test.pdf
java -jar 'jar包地址' '源文件地址' '输出文件地址'
4.解决转换结果中中文内容显示出错的问题
c:\window\fonts
目录下的字体上传到linux服务器的usr\share\fonts
目录下,一般都是这个目录,可以用cat /etc/fonts/fonts.conf
确认一下。fc-cache -fv
更新缓存,然后重启openoffice服务,重新尝试文档转换。5.尝试使用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;
}
}
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文件,并在其中添加水印的个人实现过程。
如有错误,欢迎指正哈! ?