问题
报错如下:
代码
首先要保证你的Java代码没问题,可以参考下面代码
maven依赖
<!--documents4j-->
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-local</artifactId>
<version>1.0.3</version>
</dependency>
<!-- documents4j-->
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-transformer-msoffice-word</artifactId>
<version>1.0.3</version>
</dependency>
DocxToPdfUtil工具类
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DocxToPdfUtil {
/**
* 通过documents4j 实现word转pdf
*
* @param sourcePath 源文件地址 如 /root/example.doc
*/
public static File documents4jWordToPdf(String sourcePath) {
return documents4jWordToPdf(new File(sourcePath));
}
/**
* 通过documents4j 实现word转pdf
*
* @param file 源文件
*/
public static File documents4jWordToPdf(File file) {
String os = System.getProperty("os.name").toLowerCase();
log.info("当前系统:{}", os);
if (os.contains("win")) {
// Windows操作系统
return winDocuments4jWordToPdf(file);
} else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
// Unix/Linux/Mac操作系统
return linuxDocuments4jWordToPdf(file);
} else {
// 未知操作系统
throw new RuntimeException("不支持当前操作系统转换文档");
}
}
/**
* 通过documents4j 实现word转pdf -- Windows 环境 需要有 Microsoft Office 服务
*
* @param file 源文件
*/
public static File winDocuments4jWordToPdf(File file) {
String parentPath = file.getParent();
File outputFile = new File(parentPath + File.separator + file.getName().replaceAll("\\.(docx?|\\w+)$", "") + ".pdf");
try {
// 这种方式在Linux服务器不可用,所以除非你是window服务器
InputStream docxInputStream = new FileInputStream(file);
OutputStream outputStream = new FileOutputStream(outputFile);
IConverter converter = LocalConverter.builder().build();
converter.convert(docxInputStream)
.as(DocumentType.DOCX)
.to(outputStream)
.as(DocumentType.PDF).execute();
docxInputStream.close();
outputStream.close();
return outputFile;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 通过documents4j 实现word转pdf -- linux 环境 需要有 libreoffice 服务
*
* @param file 源文件
*/
public static File linuxDocuments4jWordToPdf(File file) {
// 获取文件的绝对路径和目录路径
String absolutePath = file.getAbsolutePath();
String parentPath = file.getParent();
// 构建LibreOffice的命令行工具命令
String commands = "libreoffice --convert-to pdf "
+ absolutePath + " --outdir " + parentPath;
// 执行转换命令
try {
boolean result = executeLinuxCmd(commands);
if (result) {
// 转换成功,返回转换后的PDF文件
String pdfFilePath = parentPath + File.separator + file.getName().replaceAll("\\.(docx?|\\w+)$", "") + ".pdf";
log.info(pdfFilePath);
log.info(pdfFilePath);
return new File(pdfFilePath);
} else {
return null;
}
} catch (Exception e) {
// 转换失败
log.error("Word文档转换为PDF失败,原因:执行命令时出现异常。", e);
return null;
}
}
/**
* 执行命令行
*
* @param cmd 命令行
* @return
* @throws IOException
*/
private static boolean executeLinuxCmd(String cmd) throws IOException {
// 执行命令行工具命令
Process process = Runtime.getRuntime().exec(cmd);
try {
process.waitFor();
} catch (InterruptedException e) {
log.error("执行 Linux 命令异常:", e);
return false;
}
return true;
}
}
测试
@SpringBootApplication
public class PdfdemoApplication {
public static void main(String[] args) {
//Linux服务器
String inputFile = "/usr/local/a.docx";
//本地
// String inputFile = "C:\\zhushanglin\\test\\a.docx";
DocxToPdfUtil.documents4jWordToPdf(inputFile);
System.out.println("Done! Pdf ");
SpringApplication.run(PdfdemoApplication.class, args);
}
}
发现本地win没问题,到服务器Linux就有问题,原因是 documents4j 利用 Microsft Office 的 APIs 来进行文档转换,因此需要在Linux上安装 OpenOffice/LibreOffice 编辑器
Ubuntu:
sudo apt-get install libreoffice
CentOS:
sudo yum install libreoffice
把这装上后,再测试,发现可以完美转换。
下课!