Java面對office轉(zhuǎn)pdf這種需求,大多采用POI依鸥、pdfbox等工具進(jìn)行轉(zhuǎn)換亥至,轉(zhuǎn)換精度和效率取決于相關(guān)工具的支持程度,難免有些樣式不符贱迟、錯位等現(xiàn)象姐扮,如果需要完全一致的office轉(zhuǎn)pdf的體驗,還是得依賴office軟件关筒,目前OpenOffice和Libreoffice均提供了對應(yīng)的命令行工具來實現(xiàn)office文件轉(zhuǎn)pdf溶握。本文介紹Libreoffice轉(zhuǎn)pdf的方法及java調(diào)用Libreoffice命令行的方法。
一蒸播、安裝Libreoffice
windows:直接下載Libreoffice
下載 LibreOffice | LibreOffice 簡體中文官方網(wǎng)站 - 自由免費的辦公套件
centos:使用yum安裝:
yum install -y libreoffice
alpine:使用apk安裝:
apk add libreoffice
其他操作系統(tǒng)可以參考官方安裝說明或自行搜索安裝方法睡榆。
注意,windows在安裝完成之后袍榆,找到libreoffice安裝目錄胀屿,將對應(yīng)目錄加入PATH參數(shù),一般安裝位置在C:\Program Files\LibreOffice\program
包雀,添加入PATH和JDK添加PATH一樣的操作:
安裝/配置完成后宿崭,在命令行中輸入soffice --help
,確認(rèn)該命令行可以使用:
二才写、Libreoffice轉(zhuǎn)換Office到PDF的命令
soffice --invisible --convert-to pdf --outdir "輸出文件夾" "PDF文件所在位置"
例如:
soffice --invisible --convert-to pdf --outdir "/home/pdfconvertor/result/" "/home/pdfconvertor/pdf/1.docx"
執(zhí)行后葡兑,會在輸出文件夾下生成與源文件名同名的pdf文件(文件后綴會改為pdf)奖蔓,如上面的例子,輸出文件為/home/pdfconvertor/result/1.pdf
三讹堤、Java調(diào)用命令行轉(zhuǎn)換為PDF
添加Commons-exec依賴:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-exec</artifactId>
<version>${commons-exec.version}</version>
</dependency>
進(jìn)行轉(zhuǎn)換:
public static File convert(File officeFile) throws Exception {
DefaultExecutor exec = new DefaultExecutor();
File tempFolder = new File(System.getProperty("java.io.tmpdir"), "office2pdf-" + UUID.randomUUID());
// 同步等待
Semaphore semaphore = new Semaphore(1);
semaphore.acquire();
ExecuteResultHandler erh = new ExecuteResultHandler() {
@Override
public void onProcessComplete(int i) {
semaphore.release();
//轉(zhuǎn)換完成邏輯
}
@Override
public void onProcessFailed(ExecuteException e) {
semaphore.release();
//轉(zhuǎn)換失敗邏輯
e.printStackTrace();
}
};
String command = "soffice --invisible --convert-to pdf --outdir \"" + tempFolder.getAbsolutePath() + "\" \"" + officeFile.getAbsolutePath() + "\"";
System.out.println("執(zhí)行office文件轉(zhuǎn)換任務(wù)吆鹤,命令為" + command);
exec.execute(CommandLine.parse(command), erh);
// 等待執(zhí)行完成
semaphore.acquire();
File file = new File(tempFolder.getAbsolutePath() + File.separator + officeFile.getName().substring(0, officeFile.getName().indexOf(".")) + ".pdf");
if (!file.exists()) {
// 轉(zhuǎn)換失敗邏輯
}
return file;
}
四、字體相關(guān)問題
因Libreoffice轉(zhuǎn)換會依賴本地字體洲守,因此如果部署在服務(wù)器上使用時疑务,沒有對應(yīng)的字體會造成字體異常,此時需要在服務(wù)器上安裝對應(yīng)的字體梗醇。
centos上解決方法如下:
拷貝常用的字體文件到linux的字體文件夾/usr/share/fonts
刷新字體緩存fc-cache -fv
隨后重啟應(yīng)用即可知允。