信呼OA在centos7.4下利用LibreOffice部署Office文档本地PDF转换服务

时间:2020-01-15 阅读:990 评论:0 作者:hkear

# yum install -y libreoffice

编辑 /include/chajian/xinhuapiChajian.php

298行 

#if(!contain(PHP_OS,'WIN'))return returnerror('只能在windows的服务器下转化');

微信截图_20200115201100.png

建立初始文件

#mkdir ./convert
# touch ./convert.sh
#!/bin/bash
#设置系统变量
floder=$(date '+%Y-%m')
time=$(date '+%Y%m%d%H%M')
location=(/www/wwwroot/oagczx/upload)
#因为sed不支持/符号,所以需要加个\
location2=(\/www\/wwwroot\/oagczx\/upload\/)
rundir=(/www/wwwroot/oagczx/tools/convert/tmp)
tools=(/www/wwwroot/oagczx/tools)
jobdir=(/www/wwwroot/oagczx/tools/convert)

#pdffile=$(find $location/$floder -name '*.pdf' -exec basename {} \; > $rundir/pdf.list )
up=($location/$floder)
soffice=(/opt/libreoffice6.3/program/soffice)

#find搜索变量,用于搜索-mmin - * 分钟内的*.type 类型文件 写入 $rundir/下的list文件内
doc=$(find $location/$floder -name '*.doc' -mmin -360 -exec basename {} \; >$rundir/doc.list )
docx=$(find $location/$floder -name '*.docx' -mmin -360 -exec basename {} \; >$rundir/docx.list )
xls=$(find $location/$floder -name '*.xls' -mmin -360 -exec basename {} \; >$rundir/xls.list )
xlsx=$(find $location/$floder -name '*.xlsx' -mmin -360 -exec basename {} \; >$rundir/xlsx.list )
ppt=$(find $location/$floder -name '*.ppt' -mmin -360 -exec basename {} \; >$rundir/ppt.list )
pptx=$(find $location/$floder -name '*.pptx' -mmin -360 -exec basename {} \; >$rundir/pptx.list )

#list变量,catlist文件去掉find生成的list文件内的换行符,文件名单行排列
doclist=$(cat $rundir/doc.list |tr '\n' ' ')
docxlist=$(cat $rundir/docx.list |tr '\n' ' ')
xlslist=$(cat $rundir/xls.list |tr '\n' ' ')
xlsxlist=$(cat $rundir/xlsx.list |tr '\n' ' ')
pptlist=$(cat $rundir/ppt.list |tr '\n' ' ')
pptxlist=$(cat $rundir/pptx.list |tr '\n' ' ')

#将soffice执行语句写入/type.sh,并利用chmod +x赋予执行权限(把这行语句设置为变量不能使用???)
echo "soffice --headless --invisible --convert-to pdf:writer_pdf_Export $location/$floder/$doclist "> $rundir/doc.sh && chmod +x $rundir/doc.sh 
echo "soffice --headless --invisible --convert-to pdf:writer_pdf_Export $location/$floder/$docxlist "> $rundir/docx.sh && chmod +x $rundir/docx.sh 
echo "soffice --headless --invisible --convert-to pdf:writer_pdf_Export $location/$floder/$xlslist "> $rundir/xls.sh && chmod +x $rundir/xls.sh 
echo "soffice --headless --invisible --convert-to pdf:writer_pdf_Export $location/$floder/$xlsxlist "> $rundir/xlsx.sh && chmod +x $rundir/xlsx.sh 
echo "soffice --headless --invisible --convert-to pdf:writer_pdf_Export $location/$floder/$pptlist "> $rundir/ppt.sh && chmod +x $rundir/ppt.sh 
echo "soffice --headless --invisible --convert-to pdf:writer_pdf_Export $location/$floder/$pptxlist "> $rundir/pptx.sh && chmod +x $rundir/pptx.sh 

#sed修改完善type.sh文件内容,如不执行,则生成的文件为 执行语句 $location/file1 file2 file3,实测证明soffice无法执行此命令,会导致error,所以需要每行添加一次执行
sed -i "s/.docx /.docx\nsoffice --headless --invisible --convert-to pdf:writer_pdf_Export \/www\/wwwroot\/oagczx\/upload\/$floder\//g" `grep -rl "\n" $rundir/`
sed -i "s/.doc /.doc\nsoffice --headless --invisible --convert-to pdf:writer_pdf_Export \/www\/wwwroot\/oagczx\/upload\/$floder\//g" `grep -rl "\n" $rundir/`
sed -i "s/.xlsx /.xlsx\nsoffice --headless --invisible --convert-to pdf:writer_pdf_Export \/www\/wwwroot\/oagczx\/upload\/$floder\//g" `grep -rl "\n" $rundir/`
sed -i "s/.xls /.xls\nsoffice --headless --invisible --convert-to pdf:writer_pdf_Export \/www\/wwwroot\/oagczx\/upload\/$floder\//g" `grep -rl "\n" $rundir/`
sed -i "s/.pptx /.pptx\nsoffice --headless --invisible --convert-to pdf:writer_pdf_Export \/www\/wwwroot\/oagczx\/upload\/$floder\//g" `grep -rl "\n" $rundir/`
sed -i "s/.ppt /.ppt\nsoffice --headless --invisible --convert-to pdf:writer_pdf_Export \/www\/wwwroot\/oagczx\/upload\/$floder\//g" `grep -rl "\n" $rundir/`


#由于doc和docx存在重复,所以再修改一次sh文件
#doc+docx
sed -i "s/.docx/.docx --outdir \/www\/wwwroot\/oagczx\/upload\/$floder /g" `grep -rl "\n" $rundir/`
sed -i "s/.doc/.doc --outdir \/www\/wwwroot\/oagczx\/upload\/$floder /g" `grep -rl "\n" $rundir/`
sed -i "s/.doc --outdir \/www\/wwwroot\/oagczx\/upload\/$floder x/.docx /g" `grep -rl "\n" $rundir/` 

#ppt+pptx
sed -i "s/.pptx/pptx --outdir \/www\/wwwroot\/oagczx\/upload\/$floder /g" `grep -rl "\n" $rundir/`
sed -i "s/.ppt/.ppt --outdir \/www\/wwwroot\/oagczx\/upload\/$floder /g" `grep -rl "\n" $rundir/`
sed -i "s/.ppt --outdir \/www\/wwwroot\/oagczx\/upload\/$floder x/.pptx /g" `grep -rl "\n" $rundir/`
#xls+xlsx
sed -i "s/.xlsx/xlsx --outdir \/www\/wwwroot\/oagczx\/upload\/$floder /g" `grep -rl "\n" $rundir/`
sed -i "s/.xls/.xls --outdir \/www\/wwwroot\/oagczx\/upload\/$floder /g" `grep -rl "\n" $rundir/`
sed -i "s/.xls --outdir \/www\/wwwroot\/oagczx\/upload\/$floder x/.xlsx /g" `grep -rl "\n" $rundir/`

#清除最后一个无效soffice执行命令替换为换行
sed -i "s/soffice --headless --invisible --convert-to pdf:writer_pdf_Export \/www\/wwwroot\/oagczx\/upload\/$floder\/ //g" `grep -rl "\n" $rundir/`
sed -i "s/soffice --headless --invisible --convert-to pdf:writer_pdf_Export \/www\/wwwroot\/oagczx\/upload\/$floder\/ //g" `grep -rl "\n" $rundir/`

#记录需要转换的文件名
#cat $rundir/*.list >$jobdir/log/filelist-$time.log

#合并为job.sh并赋予执行权限
cat $rundir/*.sh >$jobdir/job.sh
chmod +x $jobdir/job.sh

#记录转换日志:开始时间
echo "jobStart:$time" >$jobdir/log/job-$time.log

#记录转换详情
$jobdir/job.sh >>$jobdir/log/job-$time.log

#记录转换日志:结束
echo "jobEND:$time" >>$jobdir/log/job-$time.log

#清理临时文件
rm -rf $rundir/*.list
rm -rf $rundir/*.sh
rm -rf $rundir/*.log

最后crontab这个sh每N分钟运行一次即可

如果需要手动转换可以修改*topdf.html,增加手动执行的php链接,同时需要禁用php的exec函数

<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><title>Convert</title>
</head>
<?php
    
    $shell = "/www/rockoa/tools/convert.sh";
    exec($shell, $result, $status);
    $shell = "<font color='red'>$shell</font>";
    echo "<pre>";
    if( $status ){
     
         echo "准换进程执行失败";
    } else {
        echo "转换进程完成!<hr>";
      
    }
    echo "</pre>";
  
?>

 <!--   echo "shell命令{$shell}执行失败"; echo "shell命令{$shell}成功执行, 结果如下   print_r( $result );<hr>"; -->

<html><head><body onload='setTimeout("mm()",1000)'> <script>function mm(){ window.opener=null; window.close();} </script></body></head></html>
 <div align=center><input type="button" name="close" value="OK" onclick="window.close();" /></div>


本文链接: https://dkicloud.com/?id=11 转载请注明出处!

评论区 交流一下吧!

共有0条评论来说两句吧...

欢迎 发表评论: