Office 文档格式转换

之前用到 Office 的 word 转 pdf,doc 转 docx,试过了很多种方法,但是很多方法都有种种缺陷,或者不满足某种条件,其中用到 Aspose Words 和 Plutext-Enterprise 提供的 jar 包挺好用的,试用时没有一点问题,满足种种需求,但是都是商用付费的,最后看到了一种 word 转 pdf 的方法,就是在服务器上安装一个 LibreOffice 这个开源 Office 软件,然后调用一行命令就可以转换了,不仅速度快,而且转换质量高,然后用这种方法去将 doc 转成 docx 同样也是很好。

使用的是 Windows 服务器,Linux/Unix 服务器命令有所不同。

将 word(doc/docx) 转换成 pdf 的命令:

1
D:\Program Files\LibreOffice\program>soffice.bin --headless --invisible --convert-to pdf c:\Users\wu\xxx.doc --outdir c:\Users\wu

类似的可以将一种格式文档转换成另一种格式,只需要将 --convert-to 后的格式换成需要的目标格式即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import lombok.Cleanup;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.concurrent.TimeUnit;

@Component
public class OfficeConverter {

/**
* 服务器需要安装 LibreOffice 软件
* 需要配置 LibreOffice 的环境变量,如:D:\Program Files\LibreOffice\program
*/

/**
* word(doc/docx) 转 pdf
* D:\Program Files\LibreOffice\program>soffice.bin --headless --invisible --convert-to pdf c:\Users\xx.doc --outdir c:\Users
*
* @param docLocation
* @param deleteResource
* @return
*/
public String wordToPdfByLibreOffice(String docLocation, boolean deleteResource) {
String targetLocation = docLocation.substring(0, docLocation.lastIndexOf(File.separator));
return convertOfficeByLibreOffice(docLocation, targetLocation, "pdf", deleteResource);
}

/**
* doc 转 docx
* D:\Program Files\LibreOffice\program>soffice.bin --headless --invisible --convert-to docx c:\Users\xx.doc --outdir c:\Users
*
* @param docLocation
* @param deleteResource
* @return
*/
public String docToDocxByLibreOffice(String docLocation, boolean deleteResource) {
String targetLocation = docLocation.substring(0, docLocation.lastIndexOf(File.separator));
return convertOfficeByLibreOffice(docLocation, targetLocation, "docx", deleteResource);
}

private String convertOfficeByLibreOffice(String docLocation, String targetLocation, String targetFormat, boolean deleteResource) {
if (StringUtils.isBlank(docLocation) || docLocation.contains(" ")) {
return "Error:word 文件名不能包含空格";
}
try {
String osName = System.getProperty("os.name");
StringBuilder command = new StringBuilder();
if (osName.contains("Windows")) {
command.append("soffice.bin --headless --invisible --convert-to ").append(targetFormat).append(" ").append(docLocation)
.append(" --outdir ").append(targetLocation);
} else {

command.append("");
}

exeLibreOfficeCMD(command.toString());
String txtName = FileUtils.getExt(docLocation);
return docLocation.replace(txtName, targetFormat);

} finally {
if (deleteResource) {
FileUtils.delete(docLocation);
}
}
}

private void exeLibreOfficeCMD(String command) {
try {
ProcessBuilder builder = new ProcessBuilder(
"cmd.exe", "/c", command);
builder.redirectErrorStream(true);
Process process = builder.start();

@Cleanup InputStream fis = process.getInputStream();
@Cleanup InputStreamReader isr = new InputStreamReader(fis);
@Cleanup BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
process.waitFor(10, TimeUnit.SECONDS);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
分享到:
Disqus 加载中...

如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理