linux 下用 libreoffice命令行方式将word、excel、ppt转成pdf

 

libreoffice命令行方式将word、excel、ppt转成pdf

项目需要,上传doc、excel、ppt等格式文件到服务器,用户可以在线阅读。经过讨论,决定在上传文件的同时,转换出一份pdf文件保存,用户阅读就只需要展示pdf文件即可,下载可以下载原文件。因为pdf文件需要在web页面上展示还是比较方便的,直接使用html的embed标签就能实现,也可以使用一些pdf.js的插件实现:

 

[html] view plain copy

  1. <!DOCTYPE HTML>  
  2. <html>  
  3. <body>  
  4. <embed src="zpdf.pdf" width="100%" height="600">  
  5. </body>  
  6. </html>  


首先我们需要将doc等格式的文档转换成pdf,网上搜索一翻,实现方式也就那几种,最主流的就是通过openoffice.org或者libreoffice两种方式实现,其实libreoffice也是从openoffice.org分离出来的,功能上面应该相差不大。对于要实现格式转换,两种库都可以。

 

我这里直接使用libreoffice的方式。

首先安装libreoffice,我的服务器是centos,直接使用:

 

[plain] view plain copy

  1. [root@instance-32spzihn /]# yum install libreoffice  

 

提示是否是要安装,执行y就可以了。

一般情况下用yum安装的包都不会是最新版本的,想要安装最新版本,只能够自己下载最新的回来,手动编译安装:

libreoffice官网:http://zh-cn.libreoffice.org/

目前最新版本:LibreOffice_5.4.0_Linux_x86-64_rpm.tar.gz

 

[plain] view plain copy

  1. [root@instance-32spzihn src]# tar -zxvf LibreOffice_5.4.0_Linux_x86-64_rpm.tar.gz  
  2. [root@instance-32spzihn src]# cd LibreOffice_5.4.0.3_Linux_x86-64_rpm/RPMS  
  3. [root@instance-32spzihn RPMS]# yum install *.rpm  

 

 

安装完成后执行:

 

[plain] view plain copy

  1. [root@instance-32spzihn /]# /usr/bin/libreoffice  –invisible –convert-to pdf  zzz.docx  

 

如果是自行编译需要带版本号:

 

[plain] view plain copy

  1. [root@instance-32spzihn /]# /usr/bin/libreoffice5.4  –invisible –convert-to pdf  zzz.docx  

具体情况可以先用 find / -name 'libreoffice*' 查找出相关的执行程序再处理。
 

 

 

竟然报错:

 

[plain] view plain copy

  1. [root@instance-32spzihn /]# /usr/bin/libreoffice  –invisible –convert-to pdf  zzz.docx  
  2. /usr/lib64/libreoffice/program/soffice.bin X11 error: Can't open display:   
  3.    Set DISPLAY environment variable, use -display option  
  4.    or check permissions of your X-Server  
  5.    (See "man X" resp. "man xhost" for details)  


此时只需要安装另外一个库即可解决:

 

 

[plain] view plain copy

  1. [root@instance-32spzihn /]# yum install libreoffice-headless  


再执行转换命令,转换成功。

 

sz zzz.pdf,下载pdf回到本地打开发现中文乱码,这是因为缺少中文字体支付所致,所以先把 c:\Windows\Fonts文件夹复制一份到其它盘,然后打包成Fonts.zip,通过rz Fonts.zip 将压缩包传到服务器上面。

 

[plain] view plain copy

  1. [root@instance-32spzihn /]# cd /usr/share/fonts  
  2. [root@instance-32spzihn fonts]# rz  
  3. [root@instance-32spzihn fonts]# unzip Fonts.zip  
  4. [root@instance-32spzihn fonts]# mv Fonts win  
  5. [root@instance-32spzihn fonts]# cd win  
  6. [root@instance-32spzihn win]# chmod  -Rf 755 *  
  7. [root@instance-32spzihn win]# mkfontscale  
  8. [root@instance-32spzihn win]# mkfontdir  
  9. [root@instance-32spzihn win]# fc-cache –fv  

 

若没有生效可以试下重启服务器,再重新执行转换命令就可以了。

 

完成对文件转换后,那接下来就要将此功能加入项目开发上面,当前需要加入到一个php项目:

 

[php] view plain copy

  1. $retval = 1;  
  2. // exec() might be disabled  
  3. $cmd = '/usr/bin/libreoffice  –invisible –convert-to pdf  zzz.docx';  
  4. if (function_exists('exec')){  
  5.     @exec($cmd, $output, $retval);  
  6. }  
  7. // Did it work?  
  8. if ($retval > 0){  
  9.     exit('process_failed');  
  10. }  


具体实现逻辑可以根据自己实际需求做更改,原理就是程序内执行shell命令处理。

在部署其它服务器时出问题。 就是转换代码不工作。 重点在: export HOME=/tmp && libreoffice  我不明白什么意思但是可以运行。 

export HOME=/tmp/ && libreoffice –headless –invisible –convert-to pdf –outdir  1.pdf  1.docx

参考信息如下:

Linux平台中使用PHP让word转pdf

1、ubantu下安装libreoffice

       sudo apt-get install libreoffice

2、命令行执行word转pdf

   将 /home/wordToPdf/wordFiles/目录下的CAS.docx转成pdf存放到 /home/wordToPdf/pdfFiles 目录下:

    libreoffice –headless –convert-to pdf:writer_pdf_Export /home/wordToPdf/wordFiles/CAS.docx –outdir /home/wordToPdf/pdfFiles

 

/usr/share/fonts 下放中文字体

fc-cache-fv 更新字体缓存

 

在php中执行的代码

$a='./doc/2.doc';

$b='./pdf';

//$str ="libreoffice –headless –convert-to pdf:writer_pdf_Export ./doc/2.doc –outdir ./pdf";

//$str ='ls '.'./';

$str = "export HOME=/tmp && libreoffice –headless -convert-to pdf /var/www/html/doc/2.doc -outdir /var/www/html/pdf";

var_dump(system($str));

发表评论