docx4j实现word文件转换pdf文件

前言

前段时间在项目中遇到了导出pdf的问题,之前在项目中遇到导出文件莫不是excle或者word文件的导出,所以在遇到需要导出pdf文件时,我搜索了许多的网页内容,但是很多网页给出的答案也不是正解,走了许多的歪路后才最终实现了pdf文件的导出,下面提供的pdf文件导出希望能帮助到你

PDF文件导出

word文件转换pdf文件

通过使用word转换pdf的方式实现pdf文件的导出,因为项目在需求前是要求导出word文件的,然后客户方要求导出为pdf文件,所以在此基础上我使用的是用word文件转换pdf。

  1. 第一步 :通过freemaker模板导出word文件
  2. 导入doc4j的jar包
    <dependency>
           <groupId>org.docx4j</groupId>
           <artifactId>docx4j</artifactId>
           <version>3.2.1</version>
    </dependency>
    
  3. java代码
    	/**
     *  根据ftl模板导出word文件
     * @param wordPath word文件存放路径
     * @param pdfPath 导出pdf文件存放路径
     * */
    public static void exportPdfForDoc4j(String wordPath,String pdfPath){
    
        InputStream is = null;
    
        OutputStream target=null;
    
        try {
    
            is=new FileInputStream(new File(wordPath));
    
            target=new FileOutputStream(new File(pdfPath));
    
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(is);
            //设置字体
            Mapper fontMapper = new IdentityPlusMapper();
    		/**
    			*你的模板中使用了什么字体,需要往项目中放入字体格式文件,
    			*没设置时可能在windows上不会出现问题,但是linux上没有该
    			*字体的话就会使用其默认字体。
    			**/
            URL fontUrl=ExportPdfUtils.class.getResource("/font/FangSong_GB2312.ttf");
    
            PhysicalFonts.addPhysicalFont("FangSong_GB2312",fontUrl);
    
            fontMapper.put("仿宋_GB2312",PhysicalFonts.get("FangSong_GB2312"));
    
            FOSettings foSettings = Docx4J.createFOSettings();
    
            foSettings.setWmlPackage(wordMLPackage);
    
            List<SectionWrapper> sections = wordMLPackage.getDocumentModel().getSections();
            //去掉页脚
            for (SectionWrapper section : sections) {
    
                FooterPart footerPart = section.getHeaderFooterPolicy().getDefaultFooter();
    
                if(footerPart!=null){
    
                    List<Object> content = footerPart.getContent();
    
                    for (int i = 0; i < content.size(); i++) {
    
                        footerPart.getContent().remove(i);
    
                    }
    
                }
    
            }
    
            Docx4J.toFO(foSettings, target, Docx4J.FLAG_EXPORT_PREFER_XSL);
    
        } catch (Exception e) {  e.printStackTrace();
    
        }finally {
    
            try {
    
                if(is!=null) is.close();
    
                if(target!=null) target.close();
    
            }catch (IOException e){  e.printStackTrace(); }
    
        }
    
    }
    
  4. 以上就是通过word文件转换pdf的过程,但是转换的pdf的格式等可能会出现错乱等问题,所以以下是一些问题的解决
    在这里插入图片描述
    • 换行问题:首先看到的是身份证号码过长而没有换行行,但是word中格式确实是换行了的,所以我能找到的办法就是数据中强制的换行,值的注意的是换行符一定要拼接上去否则换行符无效:
      在这里插入图片描述

    • 边框变粗:这个问题也是转换pdf遇到的最大的问题,但是我没有找到具体的解决方案,只能通过加粗整体边框线来使这少许的加粗看起来不明显(加粗后的打印不会有边框变粗的问题),这里你可以通过全局替换w:sz="x"来加粗或变细你的边框,转换比例为:1磅==4,
      在这里插入图片描述

    • 空格被省略:我们看到年月日中应该出现的样子是如下图展示的一样,但是在pdf转换后年月日位置更换不说,中间的空格也被缩减了;所以在做模板时要使用全角的输入法进行空格的输入,这样在导出pdf时就不会对空格进行缩减。
      在这里插入图片描述

    • 以上问题解决后导出pdf概览:
      在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值