帝国cms 新闻系统实现office、pdf 文档预览

一、设计的需求和最终演示

在设计一个单位的系统的时候,采用了帝国cms,这个系统相对来说是成熟的。必定是单位网站,对方希望能将上传的文档,实现在线预览。

所以我想了几个方案,首先想到了腾讯文档。使用起来简单便捷。沟通之后对方不想用。

之后又想到了kkfileview 这个开源预览。 对方也不想用。但是必定量不大。最后决定在本机化建设。

采用开源框架 dochub相同的逻辑。

演示网址PPT: 2024高考学考艺术省统考网报系统培训

演示网址XLS:一分一段统计表

演示网址DOCX:2024高考报名问答.

演示网址PDF:苏教考招〔2024〕2号 省教育考试院关于做好2024年普通高校招生体检工作的通知

二、查找相关代码进行代码溯源

首先帝国的上传界面是这样的。

截图_20240125093311.png

上传的form 的action  也就是处理上传的文件 是这个文件

截图_20240125093502.png

在然后 上传非图片的代码是

截图_20240125093600.png

找到这个函数的位置  位于 editorfun.php文件的大约310行 各种类型文件的上传处理分类都在这个函数。

在这个函数找 上传office的文件的代码

截图_20240125093843.png

那么下边就是找 DoTranFile函数的位置,在这个函数修改上传内容  实现文档生成,和预览。

三、修改代码实现预览。

修改一、DoTranFile函数的修改

function DoTranFile($file,$file_name,$file_type,$file_size,$classid,$ecms=0){
    global $public_r,$class_r,$doetran,$efileftp_fr;
    $classid=(int)$classid;
    //文件类型
    $r[filetype]=GetFiletype($file_name);
//    print '$r[filetype]:'.$r[filetype];

    $filename2=str_replace($r[filetype], '', $file_name); //获得后缀文件名
    $mytype = array (".doc", ".xls", ".ppt", ".docx", ".xlsx", ".pptx"); //定义文件名类型
    //文件名
    $r[insertfile]=ReturnDoTranFilename($file_name,$classid);
    $r[filename]=$r[insertfile].$r[filetype];
    //日期目录
    $r[filepath]=FormatFilePath($classid,$mynewspath,0);
    $filepath=$r[filepath]?$r[filepath].'/':$r[filepath];
    print '$filepath::'.$filepath;
    //存放目录
    $fspath=ReturnFileSavePath($classid);
    $r[savepath]=eReturnEcmsMainPortPath().$fspath['filepath'].$filepath;//moreport
    //附件地址
    $r[url]=$fspath['fileurl'].$filepath.$r[filename];



    //缩图文件
    $r[name]=$r[savepath]."small".$r[insertfile];
    //附件文件
    $r[yname]=$r[savepath].$r[filename];
    $r[tran]=1;
    //验证类型
    if(CheckSaveTranFiletype($r[filetype]))
    {
       if($doetran)
       {
          $r[tran]=0;
          return $r;
       }
       else
       {
          printerror('TranFail','',$ecms);
       }
    }
    //上传文件
    $cp=@move_uploaded_file($file,$r[yname]);
    if(empty($cp))
    {
       if($doetran)
       {
          $r[tran]=0;
          return $r;
       }
       else
       {
          printerror('TranFail','',$ecms);
       }
    }
    DoChmodFile($r[yname]);
    $r[filesize]=(int)$file_size;
    //FileServer
    if($public_r['openfileserver'])
    {
       $efileftp_fr[]=$r['yname'];
    }
    //生成PDF  判断后缀 如果属于定义后缀转成PDF,在转成svg
    $system_url = 'http://'.$_SERVER['SERVER_NAME'].'/'; //获取系统当前的网站地址
//    print '$url_this:'.$url_this;

    $officeUrl=ECMS_PATH.$r[url];
    if (in_array($r[filetype],$mytype)){
        $a=officeToPdf($officeUrl,$r[savepath]);
        if ($a[state]==0){ //转成SVG
            //pdf地址
            $pdfpath=$r[savepath].$r[insertfile].'.pdf';
            $totalpage=getPageTotal($pdfpath);//获取PDF页码

            for ($i=1;$i<=$totalpage;$i++) {
                $newcmd = 'pdf2svg ' . $pdfpath .' '. $r[savepath].$r[insertfile].'-' .$i.".svg" . ' ' . $i;
//                print 'newcmd:'.$newcmd;
                exec($newcmd);
                $svgurl=$system_url.'d/file/p/'.$filepath.$r[insertfile].'-'.$i.'.svg';
                $addhtml=$addhtml."<img src='$svgurl' width='100%' title='$r[insertfile]'></br>";
            }
        }
    }elseif ($r[filetype]==='.pdf'){
        //pdf地址
        $pdfpath=$r[savepath].$r[insertfile].'.pdf';
//        print 'pdfpath:'. $pdfpath."<br>";
        //获取pdf页码的第二种方法
        $contents = file_get_contents($pdfpath);
        preg_match_all("/\/Page\W/", $contents, $matches);
        $totalpage = count($matches[0]);

        for ($i=1;$i<=$totalpage;$i++) {
            $newcmd = 'pdf2svg ' . $pdfpath .' '. $r[savepath].$r[insertfile].'-' .$i.".svg" . ' ' . $i;
//            print 'newcmd:'.$newcmd;
            exec($newcmd);
            $svgurl=$system_url.'d/file/p/'.$filepath.$r[insertfile].'-'.$i.'.svg';
            $addhtml=$addhtml."<img src='$svgurl' width='100%' title='$r[insertfile]'></br>";
        }
    }
    //生成html地址加入到r变量
    $r[html]=$addhtml;
    return $r;
}

修改二、Tranfile函数修改

返回值是$r   期中增加了 $r[html]这个变量。 所以返回edutorfun.php 找TranFile函数 处理这个变量。

//写入数据库
   if (!isset($r[html])){
       $r[html]="";
   }

$r[filesize]=(int)$r[filesize];
$classid=(int)$classid;
$post[filepass]=(int)$post[filepass];
$type=(int)$type;
$sql=eInsertFileTable($r[filename],$r[filesize],$r[filepath],$username,$classid,$no,$type,$post[filepass],$post[filepass],$public_r[fpath],0,$modtype,$fstb,addslashes($r[html]));
$fileid=$empire->lastid();
//导入gd.php文件

修改三、插入数据库的修改 eInsertFileTable

返回值只用于写入数据库  因为处理所有的返回值  所以有的返回值是没有html这个变量的  所以 写之前 我加了个判断,存在就写,不存在赋个空值。

在e/class/connect.php 找到这个函数。sql语句增加个字段。

截图_20240125100036.png

同时到附件的数据库也增加个字段

截图_20240125100233.png

到此 数据处理部分就完成了。

修改四、显示则是到新闻系统内容页模版页面  增加框中内容。

截图_20240125100415.png

[e:loop={"select * from zhaoban_enewsfile_1 where classid='$navinfor[classid]' and id='$navinfor[id]' order by id desc",0,24,0,'',''}]
<?=$bqr['html']?>
[/e:loop]

四、最终效果及文件下载

最终效果:

截图_20240125100822.png

现将涉及到的文件打包如下。

帝国增加文档预览.zip

懒省事的直接复制替换配置。

最后、说下这个修改的缺点

首先,预览图片不能修改,所以很多时候只能删除改文章  不利于seo

其次,不能选择图片显示,而是全部显示,对于文档大的 不友好

最后,修改后不能选择预览不预览,只要运行成功必然预览。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值