java中的Docx到PDF的转换



我需要能够使用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));
    }
}

相关内容

  • 没有找到相关文章

最新更新