# 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:
其实好多时候我们采用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 12:13 LibreOffice_6。0 .6_Linux_x86-64_rpm_langpack_zh-CN。焦油。广州 -rw-R - R-- 1根根 36919386 10月的25 12:24 LibreOffice_6。0 .6_Linux_x86-64_rpm_sdk。焦油.gz -rw-r--r--1个根213845646 10月的25 10:33 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.0。6.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 13:19 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