首页 > 编程语言 >docx4j转换pdf样式问题~Java Libreoffice转换pdf

docx4j转换pdf样式问题~Java Libreoffice转换pdf

时间:2024-09-20 16:49:00浏览次数:9  
标签:Java String word command pdf docx4j 转换

背景

本篇文章主要是介绍我在使用docx4j过程中遇到的问题,并最终如何通过Libreoffice来实现pdf的转换。

问题

在使用docx4j转换pdf过程中发现word文档中表格、加粗样式无法实现,国内、国外都找了一遍也没找到解决办法,真实把人急坏了。如果有同学通过docx4j解决了下方问题的可以留言分享。
docx4j转换pdf主要出现的问题:

  1. 表格边框显示异常,无法跟word文档中保持一致
  2. word文档字体加粗,无法展示

解决方法

在花了好几天时间,无法解决docx4j转pdf样式问题后,决定更换转换方案,于是在网上查找其他pdf转换方案,发现Java生态中开源的三方包对word转pdf样式偏差都很大,商用版本偏差小但是不考虑。针对这种情况,决定更换思路,采用非依赖包方式实现,按照这个思路,进行网上搜索,果真发现可以通过调用wps等三方office软件来实现,沿着这个路径找到了开源的【Libreoffice】,使用Java,lang包下的【Runtime】类,执行命令行命令,实现pdf转换,通过这种方式转换后,pdf样式保持了与word文档一样的样式。

使用【Libreoffice】转换pdf需要先安装该软件。官网 Windows、Linux都有对应版本。安装后建议配置环境变量。如果不配置,则需要在执行命令行时指定全路径。具体安装步骤可以网上查找。

下面是,Java代码中,通过【Libreoffice】实现word转pdf代码:

    /**
     *  通过libreoffice 转换word文档为pdf
     * @param exportWordFile        word文档
     * @param exportPdfFile          pdf文档
     */
    public static void generateClausesPdf(File exportWordFile, File exportPdfFile) throws Exception {
        String path = exportPdfFile.getAbsolutePath();
        path = path.substring(0,path.lastIndexOf(File.separator));
        try {
            String command = String.format("soffice --headless --convert-to pdf  --outdir  %s %s", path, exportWordFile.getAbsolutePath());
            log.info("libreoffice word转pdf  command命令行:{},pdf绝对路径:{}",command,exportPdfFile.getAbsolutePath());
            String redirectError = executeCommand(command);
            if (StringUtil.isNotBlank(redirectError) || redirectError.contains("writer_pdf_Export")) {
                log.error("libreoffice word转pdf失败,失败原因:{}", redirectError);
                throw new RuntimeException("libreoffice word转pdf失败,失败原因:" + redirectError);
            }
            log.info("libreoffice word转pdf成功:::{}",redirectError);
        } catch (Exception e) {
            log.error("libreoffice word转pdf异常,异常信息,::: ",e);
            throw e;
        }

    }
    /**
     *  执行linux或windows命令
     * @param command   命令
     * @return  命令行执行结果
     * @throws IOException  io异常
     * @throws InterruptedException 异常
     */
    public static String executeCommand(String command) throws IOException, InterruptedException {
        StringBuilder output = new StringBuilder();
        Process p;
        InputStreamReader inputStreamReader = null;
        BufferedReader reader = null;
        try {
            p = Runtime.getRuntime().exec(command);
            // 等待命令执行完成
            p.waitFor();
            inputStreamReader = new InputStreamReader(p.getErrorStream(), StandardCharsets.UTF_8);
            reader = new BufferedReader(inputStreamReader);
            String line = "";

            // 处理错误输出
            while ((line = reader.readLine()) != null) {
                output.append(line).append("\n");
            }
        }  finally {
            IOUtils.closeQuietly(reader);
            IOUtils.closeQuietly(inputStreamReader);
        }
        return output.toString();
    }


标签:Java,String,word,command,pdf,docx4j,转换
From: https://www.cnblogs.com/easonchean/p/18422785

相关文章

  • java pom两个模块需要互相引用怎么办
    1.JavaPOM模块化是什么在Java项目中,特别是在使用Maven作为构建工具时,"POM模块化"是一个重要的概念,它指的是将大型项目拆分成多个更小、更易于管理的模块(或称为子项目)。每个模块都有自己的pom.xml文件,该文件定义了模块的构建配置,包括依赖关系、插件、目标平台等。1.1POM(Project......
  • 转发:国产麒麟、UOS在线打开pdf加盖印章
    PageOffice支持两种电子印章方案,可实现对Word、Excel、PDF文档加盖PageOffice自带印章或ZoomSeal电子印章(全方位保护、防篡改、防伪造)。Word和Excel的盖章功能请参考:Word和Excel加盖印章和签字功能(目前只支持windows)简易印章管理平台。PageOffice内置了简易印章管理平台功能,也......
  • unity调用java静态方法
    在uni-app中使用NFC功能,可以通过调用微信小程序的NFCAPI(目前只在微信小程序中有效)。uni-app是多平台框架,而NFC功能的具体实现依赖于微信小程序的NFCAPI。以下是如何在uni-app中使用NFC功能,包括发现NFC设备、连接以及写入数据的详细步骤。​前置条件确保已经......
  • 【后端开发】JavaEE初阶——计算机是如何工作的???
    前言:......
  • java计算机毕业设计面向爱宠人群的宠物资讯系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,随着生活水平的提高和情感需求的多元化,宠物已成为众多家庭不可或缺的重要成员。爱宠人群对宠物健康的关注、生活品质的追求以及个性化需求......
  • java计算机毕业设计课程教学评估数据分析 (开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在高等教育日益重视教学质量与学生学习成效的当下,课程教学评估作为衡量教育效果、促进教学改进的重要手段,其重要性日益凸显。随着信息技术的飞速发展......
  • java计算机毕业设计考研加油站(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着教育竞争的日益激烈,考研已成为众多本科毕业生及在职人员进一步提升学术水平和职业竞争力的重要途径。然而,考研过程中信息繁杂、资料众多,考生往往......
  • java计算机毕业设计酒店物联网平台系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着科技的飞速发展,物联网技术正逐步渗透到各行各业,其中酒店业作为服务业的重要组成部分,其智能化转型已成为不可逆转的趋势。传统酒店管理模式面临着......
  • JavaSE——String类
    一、字符串构造注意:String是引用类型,内部并不存储字符串本身。有三种方式:publicclassTest1{publicstaticvoidmain(String[]args){//使用常量串构造Strings1="hellojava";System.out.println(s1);//直接newString......
  • JavaWeb纯小白笔记02:Tomcat的使用:发布项目的三种方式、配置虚拟主机、配置用户名和密
    通过Tomcat进行发布项目的目的是为了提供项目的访问能力:Tomcat作为Web服务器,能够处理HTTP请求和响应,将项目的内容提供给用户进行访问和使用。一.Tomcat发布项目的三种方式:第一种:直接在Tomcat文件夹里的webapps目录创建一个文件夹new放进html文件。f在文件里可以写简单的网......