tieguowei 2023-02-06 17:46 采纳率: 0%
浏览 122
已结题

docx4j word转pdf

docx4j word转pdf

WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is);
这行代码 首次加载很慢 需要8s左右。第二次请求就正常,有什么办法能优化?


```java



public static void word2Pdf(InputStream is, String pdfPath) {
        OutputStream os = null;
        try {
            WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is);
            Mapper fontMapper = new IdentityPlusMapper();

            //加载字体文件(解决linux环境下无中文字体问题)
            if (PhysicalFonts.get("SimSun") == null) {
                PhysicalFonts.addPhysicalFonts("FangSong_GB2312", WordUtils.class.getResource("/font/GB2312.ttf"));
            }

            fontMapper.put("隶书", PhysicalFonts.get("LiSu"));
            fontMapper.put("宋体", PhysicalFonts.get("SimSun"));
            fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));
            fontMapper.put("黑体", PhysicalFonts.get("SimHei"));
            fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));
            fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));
            fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));
            fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));
            fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
            fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));
            fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));
            fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));
            fontMapper.put("等线", PhysicalFonts.get("SimSun"));
            fontMapper.put("等线 Light", PhysicalFonts.get("SimSun"));
            fontMapper.put("华文琥珀", PhysicalFonts.get("STHupo"));
            fontMapper.put("华文隶书", PhysicalFonts.get("STLiti"));
            fontMapper.put("华文新魏", PhysicalFonts.get("STXinwei"));
            fontMapper.put("华文彩云", PhysicalFonts.get("STCaiyun"));
            fontMapper.put("方正姚体", PhysicalFonts.get("FZYaoti"));
            fontMapper.put("方正舒体", PhysicalFonts.get("FZShuTi"));
            fontMapper.put("华文细黑", PhysicalFonts.get("STXihei"));
            fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));
            fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
            fontMapper.put("新細明體", PhysicalFonts.get("SimSun"));
            //解决宋体(正文)和宋体(标题)的乱码问题
            PhysicalFonts.put("PMingLiU", PhysicalFonts.get("SimSun"));
            PhysicalFonts.put("新細明體", PhysicalFonts.get("SimSun"));
            PhysicalFont simsunFont = PhysicalFonts.get("SimSun");
            fontMapper.put("SimSun", simsunFont);
            mlPackage.setFontMapper(fontMapper);
            os = new java.io.FileOutputStream(pdfPath);
            FOSettings foSettings = Docx4J.createFOSettings();
            foSettings.setWmlPackage(mlPackage);
            Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
            is.close();//关闭输入流
            os.close();//关闭输出流
        } catch (Exception e) {
            e.getMessage();
            try {
                if (is != null) {
                    is.close();
                }
                if (os != null) {
                    os.close();
                }
            } catch (Exception ex) {
                ex.getMessage();
            }
        }
    }

  • 写回答

7条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-06 18:04
    关注
    获得7.50元问题酬金

    第一次加载耗时长是因为docx4j需要初始化一些内容。可以通过以下方式来优化:

    1.第一次请求后预加载docx4j,使不必每次请求都重新初始化;
    2.减少字体映射的数量,只加载实际使用的字体;
    3.使用预先配置的docx4j的配置文件,而不是每次请求都重新配置;
    4.关闭debug模式,减少打印信息的量。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月14日
  • 赞助了问题酬金15元 2月6日
  • 创建了问题 2月6日

悬赏问题

  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计