2018-08-03 15:36:18 yohjob 阅读数 7940

最近需要在网页上实现预览上传的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文件,并在其中添加水印的个人实现过程。
如有错误,欢迎指正哈! ?

2019-04-04 14:23:00 cailongbiaoyuli 阅读数 641

若不使用第三方的软件,类如卓正公司的PageOffice等专业工具,要想实现在自己平台上word,excel,ppt,pdf等格式的在线预览。推荐使用一些方法。

1.Excel

引用第三方的平台,通过调用地址,传入地址的方式来预览文件。

预览方式:https://view.officeapps.live.com/op/view.aspx?src="一个url地址"

在项目中可使用iframe框来加载。

$url = "http://storage.xuetangx.com/public_assets/xuetangx/PDF/1.xls";
$html .= "<iframe src='https://view.officeapps.live.com/op/view.aspx?src=$url' width=\"100%\" height=\"100%\" frameborder='1'></iframe>";

效果预览

word也可以使用上面的方式,但是对格式要求很严格。下面讲一个另一个平台的使用方法。

 

2.word,ppt在线预览

预览方式:https://api.idocv.com/view/url?url="url地址"

同样,可使用iframe框加载

word 格式

$url = "http://148.70.56.74/test.doc";
$html .= "<iframe src='https://api.idocv.com/view/url?url=$url' width=\"100%\" height=\"100%\" frameborder='1'></iframe>";

 

预览效果:

ppt格式

$url = "http://148.70.56.74/222.pptx";
$html .= "<iframe src='https://api.idocv.com/view/url?url=$url' width=\"100%\" height=\"100%\" frameborder='1'></iframe>";

预览效果:

ppt好像只有一个小时的试用期,要长久使用的话要购买。。。

3.pdf在线预览

需要引入pdf.js 地址

下载地址: http://148.70.56.74/pdf.js    

将js引入之后,页面上只需要几行代码搞定。

html

<div id="viewpdf"></div>

 

js ex:pdf  文件名字支持中文

// 文件路径
var url = 'http://148.70.56.74/群管理秘籍.pdf';
var options = {
    height: "550px",
    pdfOpenParams: {view: 'FitV', page: '0' },
    ame:"mans",
    fallbackLink: "<p>您的浏览器暂不支持此pdf,请下载最新的浏览器</p>"
};
// 读取文件地址
PDFObject.embed(url, "#viewpdf",options)

预览效果:

 

 

PHP代码,可以参考一下

public function ViewDocument ($type){
        $type = $_GET['type'] ? $_GET['type'] : "word";
        $html = "";
        switch ($type){
            // 调用微软office平台 将抵制放到iframe框中预览 文件地址可以是在
            case "xls":
                //$url = "http://148.70.56.74/cjxq.xls";
                $url = "http://storage.xuetangx.com/public_assets/xuetangx/PDF/1.xls";
                $html .= "<iframe src='https://view.officeapps.live.com/op/view.aspx?src=$url' width=\"100%\" height=\"100%\" frameborder='1'>
            </iframe>";
                break;
            case "word":
                $url = "http://148.70.56.74/test.doc";
                $html .= "<iframe src='https://api.idocv.com/view/url?url=$url' width=\"100%\" height=\"100%\" frameborder='1'>
            </iframe>";
                break;
            case "ppt":
                $url = "http://148.70.56.74/test.pptx";
                $html .= "<iframe src='https://api.idocv.com/view/url?url=$url' width=\"100%\" height=\"100%\" frameborder='1'>
                </iframe>";
                break;
            case "pdf":
                $html = '<div id="viewpdf"></div>';
                break;
            default:
                $html = '';
                break;
        }
        $this->view->assign("html",$html);
        $this->view->display('zrk/viewdoc');

    }

 

2017-01-22 14:46:41 litong94 阅读数 962

一、介绍

1.目前前端只能实现在线预览pdf格式的文件,可以用pdf.js或者jquery.media.js来实现。
2.要实现其他格式的文件预览,需要在后端进行格式转换。

二、具体步骤

1.目前我了解到的后端对office文档格式的转换方法有:

a、先转换成swf格式->在转换成pdf格式
b、借用第三方工具,如openoffice,通过其给的接口,用php后者java或者c#来实现.

2.我用的的是上面提到的第二种方法,下面进行详细介绍。

a、首先下载openoffice软件,下载链接

b、oppenoffice权限设置

1、cmd 运行Dcomcnfg.exe->组件服务->计算机->我的电脑->DCOM配置->OpenOffice Service Manager
2、右键选择属性这里写图片描述
3、设置步骤图示

这里写图片描述
这里写图片描述
这里写图片描述

c、php环境及配置(开启php中com组件服务)

  php环境我用的是xampp集成环境,php版本为5.6.21
  具体配置:到php.ini中打开com选项    com.allow_dcom = true
  PS:PHP 5.4.5后,com/dotnet 模块已经成了单独的扩展,所以需要在PHP.ini中配置extension=php_com_dotnet.dll ,如果PHP VERSION<5.4.5 则不需要。

三、格式转换代码实现

<?php 
 class office2pdf  
    {  
        private $osm;  
        public function __construct()  
        {  
            $this->osm = new COM("com.sun.star.ServiceManager")or die ("Please be sure that OpenOffice.org is installed.n");   
        }    
        public function MakePropertyValue($name,$value)  
        {  
            $oStruct = $this->osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");  
            $oStruct->Name = $name;  
            $oStruct->Value = $value;  
            return $oStruct;  
        }            
        public function transform($input_url, $output_url)  
        {  
            $args = array($this->MakePropertyValue("Hidden",true));  
            $oDesktop = $this->osm->createInstance("com.sun.star.frame.Desktop");  
     $oWriterDoc = $oDesktop->loadComponentFromURL($input_url,"_blank", 0, $args);  
        $export_args = array($this->MakePropertyValue("FilterName","writer_pdf_Export"));  
            $oWriterDoc->storeToURL($output_url,$export_args);  
            $oWriterDoc->close(true);  
            return $this->getPdfPages($output_url);  
        }           
        public function run($input,$output)
        {  
            $input = "file:///" . str_replace("\\","/",$input);  
            $output = "file:///" . str_replace("\\","/",$output);  
            return $this->transform($input, $output);  
        }        
        /** 
         * 获取PDF文件页数的函数获取 
         * 文件应当对当前用户可读(linux下) 
         * @param  [string] $path [文件路径] 
         * @return int 
         */  
        public function getPdfPages($path)  
        {  
            if(!file_exists($path)) return 0;  
            if(!is_readable($path)) return 0;  
            // 打开文件  
            $fp=@fopen($path,"r");  
            if (!$fp)   
            {  
                return 0;  
            }  
            else   
            {  
                $max=0;  
                while(!feof($fp))   
                {  
                    $line = fgets($fp,255);  
                    if (preg_match('/\/Count [0-9]+/', $line, $matches))  
                    {  
                        preg_match('/[0-9]+/',$matches[0], $matches2);  
                        if ($max<$matches2[0]) $max=$matches2[0];  
                    }  
                }  
                fclose($fp);  
                // 返回页数  
                return $max;  
            }  
        }       
    }  
  $con=new office2pdf();
  $con->run("D:/xampp/htdocs/design/yuanwenjian/ax.xlsx","D:/xampp/htdocs/design/xinwenjian/ax.pdf");
  echo $con->getPdfPages("D:/xampp/htdocs/design/xinwenjian/ax.pdf");
    ?>

四、pdf格式文件预览代码实现

<!DOCTYPE html>
<html>
         <head>
                   <meta charset="UTF-8">
                   <title></title>
                   <script src="../js/jquery-3.1.0.min.js" type="text/javascript" charset="utf-8"></script>
                   <script src="../js/jquery.media.js" type="text/javascript" charset="utf-8"></script>
                   <script src="../js/jquery.metadata.js" type="text/javascript" charset="utf-8"></script>
         </head>
         <body>
        <a class="media {type: 'html'}" href="../output/ad.pdf"></a> 
         </body>
         <script type="text/javascript">
                   $('a.media').media({width:1200, height:900});
         </script>
</html>

五、参考博客
参考博客

2019-01-24 14:47:26 qq_35728445 阅读数 1094

PHP 在线预览word、excel、ppt、pdf、txt等文档文件。

PHP 在线预览文档

  1. 写代码比较少的方案。
// PDF、text可以直接网页打开查看
// word、excel、ppt 文件可以通过office官方打开
$fileType = strrchr($fileUrl,'.');//获取文件类型
if($fileType == 'PDF' || $fileType =='txt'){
	//直接网页中打开
}else if($fileType == 'doc' || $fileType =='docx' || $fileType =='xlsx' || $fileType =='xls'){
	header('HTTP/1.1 301 Moved Permanently');
	header('Location: https://view.officeapps.live.com/op/view.aspx?src='.$fileUrl);//fileUrl 必须是绝对路径
}
2018-11-14 02:13:10 weixin_33815613 阅读数 369
永中office在我的项目中主要的应用目的是在线预览office文件。
至于为啥不用微软,不知道是不是我的姿势不对,大佬也说在国内可能出现无法转换(误)。
复制代码

准备

永中office DCS文档

先进入官网,我需要的office在线预览功能在永中的DCS文档。

**这里我就不得不吐槽了,作为和罗老师(罗永浩)一起研发下一代智能语音控制的坚果office的合作厂商,这文档写的太不明确了吧。**
复制代码

确定项目方案

永中这边提供的文件预览方式有两种:
1. 给永中的服务一个office文件的下载链接,永中服务器下载文件转换预览后给你一个网页地址。
    - 预览的用户需要上外网(由于我是做oa的,客户还真的不一定有外网)
    - 你的服务站点必须要在公网环境(oa的也真的不一定),要能被永中服务器下载到。
2. 给永中的服务上传一个office文件,返回一个网页地址。
    - 预览的用户需要上外网
    - 你的服务站点必须能上传文件到外网

由于我是开发oa系统的选手,选择了限制条件较少的2方式。
复制代码

调用接口

忍不住再吐槽一遍,官网文档的调用示例是不知道从哪里抄来的一段php上传文件的代码,我认为是非常不明确的,因此我对照了kodexplorer里的方法来编写,这里感谢一下这些可爱的开源工作者。
复制代码

下载链接方式(1)

这个方法只是一个简单的http请求,直接上示例就好。
复制代码
<?php
$url = "http://dcs.yozosoft.com/onlinefile";
$uri = "http://dcs.yozosoft.com/example/doc/doctest.docx";
$response = onlinefile($url, $uri);
echo $response;

function onlineFile($url, $uri)
{
    $data = array('downloadUrl' => $uri, 'convertType' => '1');
    $data = http_build_query($data);
    $params = array(
        'http' => array(
            'method' => 'POST',
            'content' => $data,
            'header' => "Content-type:application/x-www-form-urlencoded"
        )
    );
    $ctx = stream_context_create($params);
    $fp = file_get_contents($url, false, $ctx);
    if (!$fp) {
        return false;
    }
    return $fp;

}
复制代码

结果:

{
    "result": 0,
    "data": [
        "http://dcs.yozosoft.com:8000/2018/11/14/MTgxMTE0ODM0Njc1MjMy.html"
    ],
    "message": "转换成功",
    "type": 1
}
复制代码

上传文件方式

这个方式也很简单,其实把参数明确就没有那么多弯路要走,再次吐槽官方文档上的示例。
复制代码
$url = "http://www.yozodcs.com/upload";
$response = uploadFile($url, './1.xls');
echo $response;

function uploadFile($url, $filePath)
{
    $filePathInfo = pathinfo($filePath);
    $post = array("convertType" => 1);
    $mime = 'application/vnd.ms-excel';
    if (@class_exists('\CURLFile')) {
        $post['file'] = new CURLFile($filePath, $mime, $filePathInfo['filename']);
    } else {
        $post['file'] = "@" . $filePath . ";type=" . $mime . ";filename=" . $filePathInfo['filename'];
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    $result = curl_exec($ch);
    curl_close($ch);
    if (!empty($result)) {
        return $result;
    }
    return false;
}
复制代码

结果:

{
    "result": 0,
    "data": [
        "http://dcs.yozosoft.com:8000/2018/11/14/MTgxMTE0ODM0Njc1MjMy.html"
    ],
    "message": "转换成功",
    "type": 1
}
复制代码

总结

永中office预览还是挺好用的,但是并不是完全适合用于所有场景,毕竟很多office文件都是内部文件,可能有关单位会比较在意这些。 多学多看多练,这里是刘子沐,我们下期,再见(还不知道有没有下期)。

刘子沐的博客

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