我需要能够使用java将docx转换为pdf。我尝试过使用docx4j,但尽管它很好,但我拥有的docx比它所能处理的要复杂得多(格式化)。我决定看看PDF打印机是否能处理它们,尽管它们并不完美,但它们是可以接受的。现在我面临着如何从JAVA自动化的问题,我找到的唯一解决方案是使用MS Word的COM(我尝试使用Open Office API,但也无法处理docx格式)。
我找到了几个用于java的COM映射,比如jacob,并尝试了它们,但似乎找不到适合Word打印的COM命令。我正在使用的代码(我把在网上找到的几个片段堆叠在一起)是:
String sInputDoc = "fi.docx";
boolean tVisible = false;
ActiveXComponent oWord = new ActiveXComponent("Word.Application");
oWord.setProperty("Visible", new Variant(tVisible));
Object oDocuments = oWord.getProperty("Documents").toDispatch();
Object oDocument = Dispatch.call((Dispatch)oDocuments, "Open", sInputDoc).toDispatch();
Dispatch oSelection = oWord.getProperty("Selection").toDispatch();
Dispatch oFind = oWord.call(oSelection, "Find").toDispatch();
Dispatch oWordBasic = (Dispatch) Dispatch.call(oWord, "WordBasic").getDispatch();
Dispatch.call(oWordBasic, "FilePrint");
然而,这段代码只会导致程序尝试保存文件而不打印(不确定原因)。
现在可能的问题是:如何将打印操作发送到Word?(我做了研究,但大多数时候评论基本上都是公开的,并打印成pdf,但从来没有实际打印的方法)如果有更好的选择,它们是什么?我很乐意使用任何有免费许可证的软件。
提前谢谢。
您可以尝试ODF转换器和JOD转换器的组合。ODF转换器可以提供合理的DOCX到ODT的转换,JOD转换器可以提供适当的ODT到pdf的输出。打印是另一回事,但我想你只需要打印,因为你正在尝试特定的解决方案。
您可以使用docto将docx文件转换为PDF/CSV/Text。下载.exe文件并将其放置在外部位置或您的项目中。
下面的代码段包含两种将docx转换为PDF的方法,一种是使用Sofice,您需要在文件系统上安装libre;另一种是Docto(仅适用于windows机器)。
private String convertToPDF(String docPath) throws CustomException, IOException {
try {
File docFile = new File(docPath);
String tempDirectory = docFile.getParent();
String cmdLinePDFConvertionCommand = "soffice --convert-to pdf -outdir " + tempDirectory + " " + docPath;
if (OSUtil.OS.WINDOWS.equals(OSUtil.getOS())) {
cmdLinePDFConvertionCommand = "." + File.separator + tempDirectory + File.separator + "Docto -f "" + docPath + "" -o "" + tempDirectory + "" -t wdFormatPDF";
}
log.info("Command to convert docx to pdf: {}", cmdLinePDFConvertionCommand);
Process process = Runtime.getRuntime().exec(cmdLinePDFConvertionCommand);
int output = process.waitFor();
log.info("Conversion process output: {}", output);
String baseFileName = FilenameUtils.getBaseName(docPath);
String pdfFilePath = tempDirectory + File.separator + baseFileName + ".pdf";
File pdfFile = new File(pdfFilePath);
log.info("PDF File {} Exists: {}", pdfFilePath, pdfFile.exists());
return pdfFilePath;
} catch (IOException | InterruptedException e) {
log.error("Some error while converting to PDF", e);
throw new CustomException(e.getMessage());
} finally {
Files.deleteIfExists(Path.of(docPath));
}
}