欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

【libreoffice】libreoffice实现office (包括 word doc excel ppt pptx 等)转pdf、html、jpg等格式数据 有大用 有大大用 有大大大用

# yum install libreoffice          # 在linux上安装 libreoffice      


下面是 linux 上测试的一个成功的命令    把这个docx , xlsx等许多office文件 转换为 html     

/usr/bin/libreoffice  --headless --convert-to html --outdir /www/web/test  MAC系统邮件仲裁SOP.docx    

   

--convert-to  html: 表示转换成html    

--outdir /www/web/test: 表示输出目录为  /www/web/test    

MAC系统邮件仲裁SOP.docx: 表示源文件为 MAC系统邮件仲裁SOP.docx    


   

在php中执行下面的代码,可能会问题,会很卡,报 504 Gateway Time-out ,并且 看不到错误,

在 nginx的  error.log 中 2022/01/04 16:05:19 [error] 2527#0: *4 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.46.1, server: jsfaq.luxshare-ict.com, request: "GET /doc_to_html?fid=676&doc=sites/default/files/private/files/2021/12/%E9%82%AE%E7%AE%B1%E6%90%9C%E7%B4%A2%E4%B8%93%E6%A1%%99SOP.docx HTTP/1.1", upstream: "http://127.0.0.1:88/doc_to_html?fid=676&doc=sites/default/files/private/files/2021/12/%E9%82%AE%E7%A...", host: "testjsfaq.luxshare-ict.com", referrer: "http://test.luxs.com/node/564"


   

httpd 的 error_log 中,似乎也看不出错


   

exec('/usr/bin/libreoffice --headless --convert-to html --outdir doc/672 /www/web/jsfaq_luxshare-ict_com/public_html/test2/text.docx'." 2>&1" ,$res);


   

我的做法是 如下,在exec 的代码上面 加上两行代码    

putenv('PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin');//加上这行代码    

putenv('HOME=/tmp');//再加上这行代码    

exec('export LANG=zh_CN.UTF-8');//这里使用中文UTF-8编码, 防止中文文件名,生成后有问题,比如图像的打不开等等    

exec('/usr/bin/libreoffice --headless --convert-to html --outdir doc/672 /www/web/jsfaq_luxshare-ict_com/public_html/test2/text.docx'." 2>&1" ,$res);  //  这里程序对 doc/672 要有写权限  重点 重点     


               

下面是原理                

设法export HOME=/tmp在运行 convert 命令之前快速解决了这个问题,这让 libreoffice 有一个可写的地方来工作,这很神奇。                

Libreoffice 将影子/临时/隐藏文件写入用户(运行 PHP 的用户,通常是 apache 或 http 或 www-data)主目录。从网络服务器(不是从 CLI)运行 PHP 的用户通常没有主目录,因此 $HOME env 变量将为空白或未设置,并且 libreoffice 无法写入 /。因此,将其显式设置为 tmp 会为 libreoffice 提供一些具有写入权限的空间。                

I managed to fix this issue with a quick export HOME=/tmp before running the convert command, this gives libreoffice somewhere writable to work it's magic.                

Libreoffice writes shadow/temporary/hidden files to the user's (the user running PHP, normally apache or http or www-data) home directory. The user running PHP from a webserver (not from CLI) never normally has a home directory, so the $HOME env variable will be blank or not set and libreoffice cannot write to /. So setting this explicitly to tmp gives libreoffice a bit of space with permission to write                


               

如果报这个错   Error: Please verify input parameters... (SfxBaseModel::impl_store failed: 0x80070c4a),,则注意是否具有生的成的 html  的目录的权限,,,,即上面蓝色字 重点 处        

         

下面是自己实现的最终版本,每一行都很重要


   

function custom_seven_doc_to_html_doc_to_html()      

{        

  $fid = $_GET['fid'];       

  $uri =  substr(strchr(request_uri(),'doc='),4);       

  $uri = urldecode($uri);       

  if (!is_dir('doc/'.$fid)){        

       mkdir('doc/'.$fid);          

      exec('chmod -R 777 doc/'.$fid);      //防止权限

   }      

  exec('export.UTF-8 && export HOME=/tmp && /usr/bin/libreoffice --headless --convert-to html   --outdir ./doc/'.$fid.'  '."'$uri'".' 2>&1',$res);       

  $filename = substr(basename($uri),0,strrpos(basename($uri),'.')).'.html';          drupal_goto('doc/'.$fid.'/'.$filename);  

  exit;      

}    


   


   


   


   


   


   


   


   

其实libreoffice有好多功能,完全可以替代office

 

1.windows下将word转为pdf

1  安装libreoffice

到官网下载后安装即可。https://donate.libreoffice.org/    

安装完成后目录:

   

 

其实安装完我们发现其有好多功能,现在介绍几个重要的功能。    

soffice.exe --- 类似于一个全收录功能,双击可以新建好多格式文本。

sweb.exe---类似于一个html的编辑器,可以编辑好多文件,可能与notpad++更像。

scalc.exe---类似于excel,对表格处理。

simpress.exe---类似于ppt

swriter.exe---类似于word,编辑文档(当然可以打开docx文档)

sbase.exe----对数据库进行操作,可以通过JDBC、ODBC连接数据库,没有可视化工具的时候可以用这个。

 

2.配置环境变量(为了我们能在任何情况下调用命令)

     

 

执行命令测试soffice

复制代码        
C:\Users\liqiang>
LibreOffice 6.0.6.2 0c292870b25a325b5ed35f6b45599d2ea4458e77

用法:软 [参数...]
       参数 - 开关、开关参数和文档 URI(文件名)。

不带特殊参数使用:
如果不带任何参数使用,则打开开始中心。
   {file} 尝试打开组件中的文件(文件)
                       适合他们。
   {file} {macro:///Library.Module.MacroName}
                       打开文件并运行指定的宏
                       文件。

获取帮助和信息:
   --帮助 | -h | -?显示此帮助并退出。
   --helpwriter 打开有关 Writer 的内置或联机帮助。
   --helpcalc 打开 Calc 的内置或在线帮助。
   --helpdraw 打开有关 Draw 的内置或在线帮助。
   --helpimpress 打开 Impress 的内置或在线帮助。
   --helpbase 在 Base 上打开内置或在线帮助。
   --helpbasic 打开有关基本脚本的内置或联机帮助
                       语。
   --helpmath 打开有关数学的内置或联机帮助。
   --version 显示版本并退出。
   --n临时目录
                       (仅限 MacOS X 沙箱)返回临时文件的路径
                       当前用户的目录并退出。覆盖
                       所有其他参数。

一般论点:
   --quickstart[=no] 激活[停用] Quickstarter 服务。
   --nolockcheck 禁用检查远程实例使用一个
                       安装。
   --infilter={filter} 如果可能,强制输入过滤器类型。例如:
                       --infilter="Calc Office Open XML"
                       --infilter="文本(编码):UTF8,LF,,,"
   --pidfile={file} 将 soffice.bin pid 存储到 {file}。
   --display {display} 在类 UNIX 上设置 DISPLAY 环境变量
                       平台到值 {display}(仅支持
                       启动脚本)。

用户/编程接口控制:
   --nologo 在程序启动时禁用启动画面。
   --minimized 开始最小化。不显示启动画面。
   --nodefault 开始时不显示除飞溅之外的任何内容
                       屏幕(不显示初始窗口)。
   --invisible 以隐形模式启动。无论是启动标志还是
                       初始程序窗口将可见。应用
                       可以控制,文档和对话框可以
                       通过 API 控制和打开。使用参数,
                       该过程只能使用任务管理器结束
                       (Windows) 或 kill 命令(类 UNIX 系统)。它
                       不能与--quickstart 一起使用。
   --headless 以“无头模式”启动,允许使用
                       没有 GUI 的应用程序。可以使用这种特殊模式
                       当应用程序由外部客户端控制时
                       通过 API。
   --norestore 在系统崩溃后禁用重新启动和文件恢复。
   --safe-mode 以安全模式启动,即临时启动
                       新的用户配置文件并有助于恢复损坏的
                       配置。
   --accept={UNO-URL} 指定用于创建 UNO 的 UNO-URL 连接字符串
                       其他程序可以通过它连接到的接受器
                       访问 API。UNO-URL 是这样的字符串
                   uno:连接类型,参数;协议名称,参数;对象名称。
   --unaccept={UNO-URL} 关闭使用 --accept 创建的接受器。利用
                       --unaccept=all 关闭所有打开的接受者。
   --language={lang} 使用指定的语言,如果没有选择语言
                       还为用户界面。lang 是 IETF 中语言的标签
                       语言标签。

开发者参数:
   --terminate_after_init
                       初始化完成后退出(没有加载文件)。
   --eventtesting 加载文件后退出。

新文档创建参数:
参数创建指定类型的空文档。只有其中之一可以
在一个命令行中使用。如果在参数后指定文件名,
然后它尝试在指定的组件中打开这些文件。
   --writer 创建一个空的 Writer 文档。
   --calc 创建一个空的 Calc 文档。
   --draw 创建一个空的 Draw 文档。
   --impress 创建一个空的 Impress 文档。
   --base 创建一个新数据库。
   --global 创建一个空的 Writer 主(全局)文档。
   --math 创建一个空的数学文档(公式)。
   --web 创建一个空的 HTML 文档。

文件打开参数:
这些参数定义了如何处理以下文件名。新的治疗开始
在参数之后并在下一个参数处结束。默认处理是
打开文档进行编辑,并从文档模板创建新文档。
   -n 将以下文件视为创建新文件的模板
                       文件。
   -o 打开以下文件进行编辑,无论是否
                       它们是不是模板。
   --pt {Printername} 将以下文件打印到打印机 {Printername},
                       之后这些文件被关闭。启动画面
                       没有出现。如果多次使用,仅最后一次
                       {Printername} 对所有的所有文件都有效
                       --pt 运行。此外, --printer-name 参数
                       --print-to-file 开关干扰 {Printername}。
   -p 将以下文件打印到默认打印机,之后
                       这些文件已关闭。启动画面确实
                       没有出现。如果文件名包含空格,则它
                       必须用引号括起来。
   --view 在查看器模式下打开以下文件(只读)。
   --show 打开并启动以下演示文档
                       每个立即。放映后关闭文件。
                       Impress 文档以外的文件在
                       默认模式,无论以前的模式如何。
   --convert-to OutputFileExtension[:OutputFilterName]
     [--outdir output_dir] [--convert-images-to]
                       批量转换文件(暗示 --headless)。如果 --outdir
                       未指定,则使用当前工作目录
                       作为输出目录。如果 --convert-images-to 给出,它的
                       参数作为*all*的目标MIME格式
                       图像写入输出格式。如果 --convert-to 是
                       多次使用,OutputFileExtension的最后一个值
                       [:OutputFilterName] 有效。如果更多地使用 --outdir
                       不止一次,只有最后一个值有效。例如:
                   --convert-to pdf *.odt
                   --convert-to epub *.doc
                   --convert-to pdf:writer_pdf_Export --outdir /home/user *.doc
                   --convert-to "html:XHTML Writer File:UTF8" *.doc
                   --convert-to "txt:Text (encoded):UTF8" *.doc
   --print-to-file [--printer-name 打印机名称] [--outdir output_dir]
                       批量打印文件到文件。如果未指定 --outdir,
                       然后将当前工作目录用作 output_dir。
                       如果 --printer-name 或 --outdir 多次使用,则仅
                       每个的最后一个值是有效的。此外,{Printername} 的
                       --pt 开关会干扰 --printer-name。
   --cat 将以下文件的文本内容转储到控制台
                       (暗示--headless)。不能与 --convert-to 一起使用。
   --script-cat 将文件中嵌入的任何脚本的文本内容转储到控制台
                       (暗示--headless)。不能与 --convert-to 一起使用。
   -env: < VAR > [= < VALUE > ] 设置引导变量。例如:设置
                       非默认用户配置文件路径:
                       -env:UserInstallation=file:///tmp/test

忽略开关:
   -psn 忽略(仅限 MacOS X)。
   - 忽略嵌入(COM+ 相关;仅限 Windows)。
   --nofirststartwizard 什么都不做,只接受向后兼容。
   --protector {arg1} {arg2}
                       仅用于单元测试并且应该有两个参数。
       
复制代码        

 

 

4.命令行转换pdf

 转换到当前目录:

复制代码        
liqiang@root MINGW64 ~/Desktop/新建文件夹 (3)
$ soffice --headless --convert-to pdf ./Java开发-太原科技大学-软件工程-乔利强.docx
转换C:\Users\liqiang\Desktop\▒½▒▒ļ▒▒▒( 3 )\Java▒▒▒▒-̫ԭ▒Ƽ▒▒▒ѧ-▒▒▒▒▒▒▒▒▒▒▒▒▒ docx -> C:\Users\liqiang\Desktop\▒½▒▒ļ▒▒▒(3)\Java▒▒▒▒-̫ԭ▒Ƽ▒▒▒ѧ-▒▒ѧ- ▒▒▒▒▒▒▒▒▒▒▒ ǿ.pdf 使用过滤器:writer_pdf_Export
func =xmlSecCheckVersionExt: file =..\src\xmlsec.c:line= 188 :obj=unknown:subj=unknown:error= 19 :invalid version:mode=abi compatible;expected minor version= 2 ;real minor version= 2 ;预期的次要版本= 25 ;真正的次要版本= 26

liqiang@root MINGW64 ~/Desktop/新建文件夹 (3)
$ ls
Java开发-太原科技大学-软件工程-乔利强.docx
Java开发-太原科技大学-软件工程-乔利强.pdf
       
复制代码        

 

 

如果需要转换到指定目录可以加--outdir参数

 

5.java程序实现word转pdf(原理是通过cmd调用上述命令)

复制代码        
导入java.io.IOException;
导入java.io.InputStream;

导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;

公众 最终 级的测试{
    私人 静态 最后记录器记录= LoggerFactory.getLogger(测试。);

    public  static  void main(String[] args) throws NullPointerException {
         long start = System.currentTimeMillis();
        String srcPath = "C:/Users/liqiang/Desktop/ww/tt.docx", desPath = "C:/Users/liqiang/Desktop/ww" ;
        字符串命令= "" ;
        String osName = System.getProperty("os.name" );
        if (osName.contains("Windows" )) {
            命令= "soffice --headless --convert-to pdf " + srcPath + " --outdir " + desPath;
            执行(命令);
        }
        长尾= System.currentTimeMillis();
        logger.debug( "用时:{} ms", end - start);
    }

    公共 静态 布尔执行(字符串命令){
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug( "exec cmd : {}" , command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
            InputStream errorStream = process.getErrorStream();
            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error( " exec {} error" , command, e);
            返回 
        }

        int exitStatus = 0 ;
        试试{
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error( "InterruptedException exec {}" , command, e);
            返回 
        }

        如果(退出状态!= 0 ){
            logger.error ( "exec cmd exitStatus {}" , exitStatus);
        }其他{
            logger.debug ( "exec cmd exitStatus {}" , exitStatus);
        }

        process.destroy(); // 销毁子进程
        process = null;

        返回 
    }

}
       
复制代码        

 

另一种命令的方式为  cmd /c soffice ..... .

另外写的时候最好pdf后面跟上  :writer_pdf_Export,例如: --convert-to pdf:writer_pdf_Export  可能会在转换失败后调用过滤器重写。

 

 结果:    

2018-10-25 21:56:35 [测试]-[调试] exec cmd : soffice --headless --convert-to pdf C:/Users/liqiang/Desktop/ww/tt.docx --outdir C:/ Users/liqiang/Desktop/ww
2018-10-25 21:56:45 [Test]-[DEBUG] i----0
2018-10-25 21:56:45 [Test]-[DEBUG] exec cmd exitStatus 0
2018-10-25 21:56:45 [测试]-[DEBUG] 用时:9980 ms    

 

 

 2.linux实现将word转为pdf,以centos为例

1.linux下安装libreoffice

1.下载

  我们安装采用yum安装,首先下载rpm包。这里需要三个包。

wget的HTTP:// mirrors.ustc.edu.cn/tdf/libreoffice/stable/6.0.6/rpm/x86_64/LibreOffice_6.0.6_Linux_x86-64_rpm.tar.gz
的wget的http:// mirrors.ustc.edu.cn/ TDF / LibreOffice的/稳定/ 6.0.6 /转/ x86_64的/ LibreOffice_6.0.6_Linux_x86-64_rpm_sdk.tar.gz 
wget的HTTP:// mirrors.ustc.edu.cn/tdf/libreoffice/stable/6.0.6/rpm/x86_64 /LibreOffice_6.0.6_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
   

 

  

  其实我们在windows下通过浏览器访问上面链接也是可以下载tar.gz包的,如果需要不同的版本只需要修改url上的版本号即可。比如我想下载6.0.3的我可以访问下面url:

http://mirrors.ustc.edu.cn/tdf/libreoffice/stable/6.0.3/rpm/x86_64/LibreOffice_6.0.3_Linux_x86-64_rpm.tar.gz    

 

  其实好多时候我们采用wget下载的时候如果下载不下来, 我们可以先在windows下访问url下载完,传到linux服务器,这也是一种思路。    

2.上传到服务器并解压

采用  tar -xvf xxxxxx.tar.gz解压即可。解压结果如下:

复制代码        
[root@VM_0_12_centos libreoffice]# ll
总计263748 
drwxr -xr-x 4 root root       4096 Jul 28  06 : 07 LibreOffice_6。0.6 .2_Linux_x86- 64_rpm
drwxr -xr-x 3 root root       4096 Jul 28  07 : 32 LibreOffice_6。0.6 .2_Linux_x86-64_rpm_langpack_zh- CN
drwxr -xr-x 3 root root       4096 Jul 28  06 : 27 LibreOffice_6。0.6 .2_Linux_x86- 64_rpm_sdk
 -rw-R - R-- 1根根    798421 10月的25  1213 LibreOffice_6。0 .6_Linux_x86-64_rpm_langpack_zh-CN。焦油。广州
-rw-R - R-- 1根根  36919386 10月的25  1224 LibreOffice_6。0 .6_Linux_x86-64_rpm_sdk。焦油.gz
 -rw-r--r--1个根213845646 10月的25  1033 LibreOffice_6。0 .6_Linux_x86-64_rpm。焦油.gz
       
复制代码        

 

 

3.采用yum localinstall *.rpm安装rpm文件

[root@VM_0_12_centos RPMS]# pwd 
/opt/libreoffice/LibreOffice_6. 0.6 .2_Linux_x86-64_rpm / RPMS
[root@VM_0_12_centos RPMS]# yum localinstall *.rpm
   

 

  RPMS下存放的是需要安装的rpm文件,进入该文件夹下采用通配符的方式安装即可。(三个tar.gz解压后的都需要安装)

 

4.测试libreoffice

复制代码        
[root@VM_0_12_centos RPMS]# libreoffice6.0 - help
警告: -help 已弃用。使用--help 代替。
LibreOffice 6.06.2 0c292870b25a325b5ed35f6b45599d2ea4458e77

用法:软 [参数...]
       参数-开关、开关参数和文档 URI(文件名)。

不带特殊参数使用:如果不带任何参数使用
,打开开始中心
   {文件}尝试打开该文件(文件)的组件
                       适用他们。
   { file } {macro: /// Library.Module.MacroName}
                       打开文件并运行指定的宏
                       该文件

获取帮助和信息:
   --帮助 | -h | -?    显示此帮助并退出。
   --helpwriter开幕内置或作家联机帮助。
   --helpcalc开幕内置或Calc的在线帮助。
   --helpdraw开幕内置或抽奖联机帮助。
   --helpimpress开幕内置或Impress的联机帮助。
   --helpbase开幕内置或基本的在线帮助。
   --helpbasic开幕内置上Basic脚本或联机帮助
                       语。
   --helpmath开幕内置或数学上的联机帮助。
   -- version 显示版本并退出。
   -- nstemporary目录
                       (仅限 MacOS X 沙箱)返回临时文件的路径
                       目录当前用户,然后退出。覆盖
                       所有其他参数。

一般论点:
   --quickstart[= no] 激活[停用] Quickstarter 服务。
   --nolockcheck禁用检查用于使用一个远程实例
                       安装。
   --infilter={filter}如果可能,强制输入过滤器类型。例如:
                        --infilter= " Calc Office Open XML " 
                       --infilter= " Text (encoded):UTF8,LF,,, " 
   --pidfile={ file } 将 soffice.bin pid 存储到 { file }。
   --display {display}将UNIX的DISPLAY环境变量
                       平台到值 {display}(仅支持
                       启动脚本)。

用户/程序界面控制:
    -- nologo 在程序启动时禁用启动画面。
   --最小化 开始最小化。不显示启动画面。
   -- nodefault 开始时不显示除飞溅之外的任何内容
                       屏幕(不要不显示初始窗口)。
   --invisible隐形模式启动。无论是启动标志还是
                       初始程序窗口将可见。应用
                       可以控制,文档和对话框可以
                       通过 API 控制和打开。使用参数,
                       该过程只能使用任务管理器结束
                       (Windows) 或kill命令(类 UNIX系统)。它
                       不能使用-与结合快速启动。
   --headless “无头模式” 启动允许使用
                       没有 GUI 的应用程序。可以使用这种特殊模式
                       当应用程序由外部客户端控制时
                       通过 API。
   --norestore在系统崩溃后禁用重新启动和文件恢复。
   --safe模式开始安全模式,即具有临时启动
                       新的用户配置文件并有助于恢复损坏的
                       配置。
   --accept={UNO-URL} 指定用于创建 UNO的 UNO-URL 连接字符串其他程序可以
                       通过连接到的接受器
                       访问 API。UNO -URL是字符串的这类
                   uno:connection -type,params;protocol- name,params;ObjectName。
   --unaccept={UNO-URL} 关闭使用 --accept 创建的接受器。使用
                       --unaccept= all 关闭所有打开的接受器。
   --language={lang} 使用指定的语言,如果没有选择语言
                       还用户界面。郎是语言的标签IETF
                       语言标签。

开发者参数:
   - terminate_after_init
                       初始化完成后退出(没有加载文件)。
   -- eventtesting 加载文件后退出。

新文档创建参数:
参数创建指定类型的空文档。只有其中之一可以
被用于一个命令行。如果在参数后指定文件名,
它会尝试指定组件中打开这些文件。
   -- writer 创建一个空的 Writer 文档。
   -- calc 创建一个空的 Calc 文档。
   -- draw 创建一个空的 Draw 文档。
   -- impress 创建一个空的 Impress 文档。
   -- base 创建一个新的数据库。
   -- global 创建一个空的 Writer 主(全局)文档。
   -- math 创建一个空的 Math 文档(公式)。
   ——web 创建一个空的 HTML 文档。

文件打开参数:
这些参数定义了如何处理以下文件名。新的治疗开始
在参数之后并在下一个参数处结束。默认处理是
打开文档进行编辑,并从文档模板创建新文档。
   -n黄柏下列文件作为模板,创造新的
                       文件。
   -o 打开以下文件进行编辑,无论是否
                       它们是不是模板。
   -- pt {Printername} 将以下文件打印到打印机 {Printername},
                       之后这些文件被关闭。启动画面
                       没有出现。如果多次使用,只有最后
                       {} PRINTERNAME是有效所有的所有文档
                       --pt运行。此外,--print-to-文件开关的--printer- name 参数会
                       干扰 {Printername}。
   - P打印下列文件到默认打印机,之后
                       这些文件被关闭。启动画面确实
                       没有出现。如果文件名包含空格,
                       必须括引号。
   --view查看器模式下打开以下文件(只读)。
   -- show 打开并启动以下演示文档
                       每个立即。放映后关闭文件。
                       Impress 文档以外的文件
                       默认模式,无论以前的模式如何。
   --convert- to OutputFileExtension[:OutputFilterName]
     [ --outdir output_dir] [--convert-images- to]
                       批量转换文件(暗示--headless)。如果--outdir
                       ISN '吨指定,则当前工作目录是用来
                       作为OUTPUT_DIR。如果给定了--convert-images- to,它的
                       参数被作为目标MIME格式* *所有
                       图像写入到输出格式。如果--convert-
                       使用比一次,最后OutputFileExtension的价值
                       [:OutputFilterName] 有效。如果--outdir使用
                       超过一次,只有它最后的价值是有效的。例如:--
                    convert-to pdf * .odt
                    --convert-to epub * .doc
                    --convert-to pdf:writer_pdf_Export --outdir /home/user * .doc
                    --convert-to " html:XHTML Writer File :UTF8 " * .doc
                    --convert-to " txt:Text (encoded):UTF8 " * .doc
    --print-to-文件[--printer-name 打印机名称] [-- outdir output_dir]
                       批量打印文件到文件。如果未指定 --outdir,
                       则将当前工作目录用作 output_dir。
                       如果多次使用--printer-name 或 --outdir ,则只有
                       每个的最后一个值有效。此外,-- pt 开关的{Printername} 会
                       干扰--printer- name。
   -- cat               将以下文件的文本内容转储到控制台
                       (暗示--headless)。不能与--convert-一起使用。
   --script-        嵌入的脚本的转储文本内容文件到控制台
                       (暗示--headless)。不能与--convert-一起使用。
   - env :<VAR>[=<VALUE> ] 设置引导变量。例如:设置
                       非-默认用户配置文件路径:
                        - ENV:UserInstallation =文件/// TMP /测试

忽略开关:
   - psn 忽略(仅限 MacOS X)。
   - 忽略嵌入(COM+相关;仅限 Windows)。
   --nofirststartwizard什么也不做,只接受向后兼容性。
   --保护者 {arg1} {arg2}
                       仅用于单元测试并且应该有两个参数。
       
复制代码        

 

  安装后的命令是libreoffice6.0

 

5.为了使用libreoffice我们创建别名

复制代码        
[root@VM_0_12_centos ~]# alias libreoffice='libreoffice6.0' 
[root@VM_0_12_centos ~ ]# alias
alias cp = ' cp -i ' 
alias egrep = ' egrep --color=auto ' 
alias fgrep = ' fgrep --color=auto ' 
alias grep = ' grep --color=auto ' 
alias l. = ' ls -d .* --color=auto '
别名 libreoffice = ' libreoffice6.0 '
别名 ll = ' ls -l --color=auto '
别名ls = ' ls --color=auto '
       
复制代码        

 

 

2.linux下面命令行测试word转pdf(其参数与windows下的参数大体相同)

复制代码        
[root@VM_0_12_centos tmpFile]# ls
文档.docx
[root@VM_0_12_centos tmpFile]# libreoffice6. 0 --convert-to pdf:writer_pdf_Export ./ tt.docx 
func =xmlSecCheckVersionExt: file =xmlsec.c:line= 188 :obj=unknown:subj=unknown:error= 19 :invalid version:mode=abi compatible;expected minor version= 2 ;real Minor version= 2 ;expected subminor version= 25 ;real subminor version= 26
转换/root/tmpFile/tt.docx -> /root/tmpFile/ tt.pdf 使用过滤器:writer_pdf_Export
[root@VM_0_12_centos tmpFile]# ls
tt.docx tt.pdf
[root@VM_0_12_centos tmpFile]#
       
复制代码        

 

 

  我们将上面生成的pdf传回windows下面查看发现中文乱码。

 

3.关于word转pdf中文乱码问题的解决办法

1.查看fonts目录

复制代码        
[root@VM_0_12_centos tmpFile]# cat /etc/fonts/fonts.conf | grep fon
 <!DOCTYPE fontconfig SYSTEM " fonts.dtd " >
<!-- /etc/fonts/fonts.conf文件配置系统字体访问-->
<字体配置>
        位于 fontconfig.org 的 fontconfig bugzilla 系统的问题
        需要注意的是正常的“使安装”程序fontconfig的是
        用新版本替换任何现有的 fonts.conf文件。放置
        <dir>/usr/share/fonts</dir> 
        < dir >/usr/share/X11/fonts/Type1</ dir >< dir >/usr/share/X11/fonts/TTF</ dir >< dir >/usr/local/share/fonts</ dir >
        < dir prefix= " xdg " >fonts</ dir >
        < dir >~/.fonts</ dir >
        <include ignore_missing= " yes " >/etc/fonts/conf.d</include>
        <cachedir>/var/cache/fontconfig</cachedir>
        <cachedir prefix= " xdg " >fontconfig</cachedir>
        <cachedir>~/.fontconfig</cachedir>
  字体中。假定所有其他空白字符已损坏,并且
</fontconfig>
       
复制代码        

 

 

发现上面的字体存在/usr/share/fonts目录下。

 

2.把Windows下的字体C:\Windows\Fonts下的宋体,即simsun.ttc上传到linux服务器并赋值到上面的字体目录下赋予读写权限

[root@VM_0_12_centos libreoffice]# ll | grep的simsun.ttc
 -rw-R - R-- 1根根  18214472 10月的25  1319 simsun.ttc
   

 

cp simsun.ttc /usr/share/fonts
   

 

cd /usr/share/fonts
   

 

赋予权限(默认权限也可以,如果不可以就手动赋予权限即可)

chmod  644 simsun.ttc
   

 

3.更新字体缓存

fc-cache -fv
   

 

 

  再次转换pdf发现完美解决。

 

4.linux下Java程序调用libreoffice转换pdf

  文件的位置与输出目录通过主函数参数传递进去。    

 (1)先写一个简单的程序进行测试

复制代码        
导入java.io.IOException;

公共 测试{

    public  static  void main(String[] args)抛出NullPointerException {
        字符串文件路径= args[0 ];
        字符串 destDir = args [1 ];
        String osName = System.getProperty("os.name" );
        System.out.println(filePath);
        System.out.println(destDir);
        System.out.println(osName);
        String cmd = "libreoffice6.0 --convert-to pdf:writer_pdf_Export " + filePath + " --outdir " + destDir;
        System.out.println(cmd);
        试试{
            Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
    }

}
       
复制代码        

 

我们在linux下面进行编译并且运行:

复制代码        
[root@VM_0_12_centos tmpFile]# javac Test.java
[root@VM_0_12_centos tmpFile]# java 测试。/tt.docx ./ 
. / tt.docx
./
Linux
libreoffice6. 0 --convert-to pdf:writer_pdf_Export ./tt.docx --outdir ./ 
[root@VM_0_12_centos tmpFile]# ls 
Test.class Test.java tt.docx tt.pdf
       
复制代码        

 

 

 (2)接下来简单的编写程序获取转换时间:(使线程等待抓换完成)

复制代码        
导入java.io.IOException;

公共 测试{

    public  static  void main(String[] args) throws NullPointerException {
         long start = System.currentTimeMillis();
        字符串文件路径= args[0 ];
        字符串 destDir = args [1 ];
        String osName = System.getProperty("os.name" );
        System.out.println(filePath);
        System.out.println(destDir);
        System.out.println(osName);
        String cmd = "libreoffice6.0 --convert-to pdf:writer_pdf_Export " + filePath + " --outdir " + destDir;
        System.out.println(cmd);
        试试{
            Process process = Runtime.getRuntime().exec(cmd);
            try {
                // 获取返回状态
                int status = process.waitFor();
                // 销毁process
                process.destroy();
                进程=
                System.out.println( "状态->" +状态);
            } catch (InterruptedException e) {
                System.err.println(e.getMessage());
            }
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
        长尾= System.currentTimeMillis();
        System.out.println( "用时:" + (end - start) + "ms" );
    }

}
       
复制代码        

 

再次在linux下面编译运行:

复制代码        
[root@VM_0_12_centos tmpFile]# java Test ./tt.docx ./ 
. / tt.docx
./
Linux
libreoffice6. 0 --convert-to pdf:writer_pdf_Export ./tt.docx --outdir ./ 
status -> 0
用时:1463ms
[root@VM_0_12_centos tmpFile]# ls 
Test.class Test.java tt.docx tt.pdf
       
复制代码        

 

 

至此完成了使用libreoffice在windows与linux下面转换pdf,这种方式感觉比较稳定。同时也学会了Runtime 调用本地程序以单线程方式运行的方法。    

 

  文中用到的所有的tar包以及字体simsun.ttc下载地址:http://qiaoliqiang.cn/fileDown/linuxlibreoffice.zip    

 

补充:word也可以转为html,测试word转html    

word内容:

   

 

 

soffice.exe --headless --convert-to html .\通用功能需求收集20180723.docx
   

 

结果:

   

 

 补充:word可以转jpg    

soffice.exe --headless --convert-to jpg .\通用功能需求收集20180723.docx
   

 

 结果生成jpg:

   

 

 补充:word可以转txt    

soffice.exe --headless --convert-to txt .\通用功能需求收集20180723.docx
   

 

结果:    

   

 

补充:其实excel和ppt也可以转为pdf和html以及jpg,下面研究excel转换(只是边框被去掉,如果需要显示边框在excel中的样式需要显示边框;而且内容过长会折行,解决办法就是缩小列宽、减少列数)    

原来excel内容:    

   

 

 转换:

soffice.exe --headless -转换至JPG ./ TEST.XLS

soffice.exe --headless -转换到HTML ./ TEST.XLS

soffice.exe --headless --convert-to pdf ./test.xls
   

 

 (1)转换后的jpg

   

(2)转换的html

   

(3)转换后的pdf

   

     

补充:直接拷贝目录遇到的问题:    

  今天拷贝下载好的目录使用时,发现报错缺失VCRUNTIME140.dll和MSVCP140.dll,于是拷贝另外一台电脑到缺失的电脑上就可以了。记住是C:\Windows\System32目录和C:\Windows\SysWOW64目录下对应的dll,这两个文件夹下的dll不一样,虽然文件名一样,但是大小不一样,所以要复制对应的dll。

 

补充;java也可以用jodconverter进行转换,我用的是jodconverter2.2版本(该工具包依赖openoffice或libreoffice插件)    

依赖的jar包如下:

   

 

 代码如下:

复制代码        
导入java.io.File;
导入java.io.IOException;

导入com.artofsolving.jodconverter.DocumentConverter;
导入com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
导入com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
导入com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

公共 Office2Pdf {

    // 将word格式的文件转换为pdf格式
    public static void WordToPDF(String startFile, String overFile) throws IOException {
        // 源文件目录
        File inputFile = new File(startFile);
        if (!inputFile.exists()) {
            System.out.println("源文件不存在!");
            return;
        }

        //输出文件目录
        File outputFile = new File(overFile);
        如果(! outputFile.getParentFile().exists()) {
            outputFile.getParentFile().exists();
        }

        // 调用openoffice服务线程
        /** 我把openOffice下载到了 C:/Program Files (x86)/下 ,下面的写法自己修改编辑就可以 **/
        String command = "D:/zdc8/lo/program/soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8300;urp;\"";
        进程 p = Runtime.getRuntime().exec(command);

        // 连接openoffice服务
        OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8300);
        连接.connect();

        // 转换
        DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
        转换器.convert(输入文件,输出文件);

        // 关闭连接
        connection.disconnect();

        // 关闭进程
        p.destroy();
    }

    公共 静态 无效主(字符串 [] args){
        String start = "C:\\Users\\Administrator\\Desktop\\123.xlsx" ;
        String over = "C:\\Users\\Administrator\\Desktop\\123.xlsx.pdf" ;
        试试{
            WordToPDF(开始,结束);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
       
复制代码        

 

如果想去掉留痕,需要反编译jodconverter-2.2.2.jar,获取类OpenOfficeDocumentConverter.java,修改方法loadAndExport,如下:(加粗部分是添加的代码)

复制代码        
    private  void loadAndExport(String inputUrl, Map /* <String,Object> */ loadProperties, String outputUrl,
            Map /* <String,Object> */ storeProperties)抛出OpenOfficeException {
        XComponent 文件;
        试试{
            document = loadDocument (inputUrl, loadProperties);
        } catch (ErrorCodeIOException errorCodeIOException) {
             throw  new OpenOfficeException(
                     "转换失败:无法加载输入文档;OOo errorCode:" + errorCodeIOException.ErrCode,
                    errorCodeIOException);
        } catch (Exception otherException) {
             throw  new OpenOfficeException("转换失败:无法加载输入文档" , otherException);
        }
        if (document == null ) {
             throw  new OpenOfficeException("转换失败:无法加载输入文档" );
        }

        XPropertySet mxDocProps =(XPropertySet)UnoRuntime.queryInterface(XPropertySet。,文档);
        试试{
            mxDocProps.setPropertyValue( "RedlineDisplayType" , RedlineDisplayType.NONE);
        } catch (Exception e) {
             throw  new OpenOfficeException("dispose RedlineDisplay failed" , e);
        }

        刷新文档(文档);

        试试{
            storeDocument(文档,outputUrl,storeProperties);
        } catch (ErrorCodeIOException errorCodeIOException) {
             throw  new OpenOfficeException(
                     "转换失败:无法保存输出文档;OOo errorCode:" + errorCodeIOException.ErrCode,
                    errorCodeIOException);
        } catch (Exception otherException) {
             throw  new OpenOfficeException("转换失败:无法保存输出文档" , otherException);
        }
    }
       
复制代码        

 

补充:基于libreoffice和jodconverter的文件在线预览插件,这个插件功能强大,使用简单    

git地址:  https://github.com/kekingcn/kkFileView    

博客地址:  https://my.oschina.net/keking/blog/3064732    

 

【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】


来自  https://www.cnblogs.com/qlqwjy/p/9846904.html


https://www.cnblogs.com/qlqwjy/p/9846904.html


普通分类: