java关于word转PDF的实现

2024-04-13 1247阅读

温馨提示:这篇文章已超过404天没有更新,请注意相关的内容是否还可用!

       word转PDF这个功能在工作中还是非常常用的,但是word转PDF大部分都是需要收费的,或者说就是对页面的转换页数有限制,那么身为程序员当然是能白嫖就白嫖的了,那么具体怎么实现呢,小编这里有几种实现方式,希望可以帮到你。

        1.第一种则是使用aspose-words实现转换,这是一个免安装office工具的实现方式

            com.aspose
            aspose-words
            21.11-jdk17
            
                
                    logback-classic
                    ch.qos.logback
                
                
                    org.springframework.boot
                    spring-boot-starter-logging
                
            
        

引入依赖之后将名为license.xml的文件放在resource文件夹下,文件内容如下:

    
        
            Aspose.Total for Java
            Aspose.Words for Java
        
        Enterprise
        20991231
        20991231
        8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7
    
    sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=

 依赖引入之后转换工具类:

 /**
     * 获取 license 去除水印
     * 若不验证则转化出的pdf文档会有水印产生
     */
    public static void getLicense() {
        String licenseFilePath = "license.xml";
        try {
            InputStream is = DocUtil.class.getClassLoader().getResourceAsStream(licenseFilePath);
            License license = new License();
            license.setLicense(Objects.requireNonNull(is));
        } catch (Exception e) {
            log.error("license verify failed");
            e.printStackTrace();
        }
    }
/**
     * word 转 pdf
     *
     * @param wordFile word 文件路径
     * @param pdfFile  生成的 pdf 文件路径
     */
    public static void word2Pdf(String wordFile, String pdfFile) {
        File file = new File(pdfFile);
        if (file.getParentFile() != null && !file.getParentFile().exists()) {
            file.getParentFile().mkdir();
        }
        getLicense();
        try (FileOutputStream os = new FileOutputStream(new File(pdfFile))) {
            Document doc = new Document(wordFile);
            // 检查文档页数
            if (doc.getPageCount() == 0) {
                throw new BizException(BaseCode.ERROR, "Word文档没有内容或格式不受支持。");
            }
            doc.save(os, SaveFormat.PDF);
        } catch (Exception e) {
            log.error("word转pdf失败", e);
            throw new BizException(BaseCode.ERROR, "word转换PDF失败");
        }
    }

 

 2.第二种的话那便是poi转换了,poi转换需要添加以下依赖包

            com.documents4j
            documents4j-local
            1.0.3
        
        
            com.documents4j
            documents4j-transformer-msoffice-word
            1.0.3
        

引入依赖添加工具类:

public static void documents4jWordToPdf(String wordPath, String pdfPath) {
        File inputWord = new File(wordPath);
        File outputFile = new File(pdfPath);
        try {
            InputStream docxInputStream = new FileInputStream(inputWord);
            OutputStream outputStream = new FileOutputStream(outputFile);
            IConverter converter = LocalConverter.builder().build();
            if (wordPath.split("\\.")[1].equals("doc")) {
                converter.convert(docxInputStream).as(DocumentType.DOC).to(outputStream).as(DocumentType.PDF).execute();
            } else {
                converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();
            }
            outputStream.close();
            docxInputStream.close();
        } catch (Exception e) {
            throw new BizException(BaseCode.ERROR, "PDF转换失败");
        }
    }

        上面两种方式都可以实现word转换PDF,不过第一种方式转换PDF会有一部分特殊的PDF转换不了,毕竟也是别人开发的,可能会有一些地方没有考虑全面,你懂得,不过可以根据自己需求看看,你们的word是否全部支持转换,第一种方式是不用再Linux上安装office工具支持的。

        第二种方式的话是poi实现的,众所周知poi很强大,但是poijar包版本管理却是个令人头疼的事情,搞不好,poi的某些jar包之间就相互冲突了,而且poi这种实现方式在转换过程中去调用了Windows底层文件去转换的,如果你要部署在Linux上面的话,那这个底层文件肯定是调不到了,导致转换失败,

        那前面两种都实现不了怎么办呢,别急,小编这里还有第三种实现方式,可能不是最优的,不过一定够用了,要通过下面这种方式在Linux上面实现的话,思路就是在java中调用Linux命令在office工具中实现转换,所以听了这个思路大概很多小伙伴应该就知道了,对,没错,这种方式实现的话是借助office工具,所以必然要在Linux上面安装office工具,以及至少一种字体,话不多说,上代码:

        首先安装libreoffice 安装时候需要注意:export LD_LIBRARY_PATH=/usr/lib64配上这条环境变量,你那个可执行文件名称是名为soffice.bin的文件,另外当你下载完成之后会发现libreoffice依赖不全

java关于word转PDF的实现

这时候就要你手动去安装这些,完成操作之后就可以使用了

public static int poiWord2PDF(String source, String targetDir, String libreOfficeCommand) {
//   libreOfficeCommand Linux可执行文件的路径  source word完整路径  targeDir 则是PDF的存放目录,不带文件名称噢,文件名称会自动取source的文件名称作为名称
        String[] cmdArray = {
                libreOfficeCommand,
                "--headless",
                "--convert-to", "pdf:writer_pdf_Export",
                source,
                "--outdir", targetDir
        };
        int exitCode = 0;
        try {
            Process process = Runtime.getRuntime().exec(cmdArray);
            // simhei.ttf
            // 获取命令执行的输出
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            while ((line = reader.readLine()) != null) {
                log.info(line);
            }
            exitCode = process.waitFor();
            log.error("转换码:"+exitCode);
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new BizException(BaseCode.ERROR, "网络繁忙,请重试!");
        }
        return exitCode;
    }

都看到这里了,还希望各位老板动动发财的小手给老弟点点赞,分享给更多需要的人!

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]