使用docx4j实现docx转pdf(解决linux环境下中文乱码问题)

摘要:
1.在pom中,在xml<dependency><groupId>org中添加docx4j依赖项。docx4jdocx4j JAXB内部8.3.1org。docx4j˂artifactId

1.在pom.xml中添加docx4j相关依赖

  <dependency>
			<groupId>org.docx4j</groupId>
			<artifactId>docx4j-JAXB-Internal</artifactId>
			<version>8.3.1</version>
		</dependency>
		<dependency>
			<groupId>org.docx4j</groupId>
			<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
			<version>8.3.1</version>
		</dependency>
		<dependency>
			<groupId>org.docx4j</groupId>
			<artifactId>docx4j-export-fo</artifactId>
			<version>8.3.1</version>
		</dependency>

2.新增WordUtils工具类

import lombok.extern.slf4j.Slf4j;
import org.docx4j.Docx4J;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFont;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.org.apache.poi.util.IOUtils;
 
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;
@Slf4j
public class WordUtils {
 
    public static void main(String[] args) throws Exception {
        WordUtils.convertDocxToPdf("D:/test/test.docx","D:/test/test.pdf");
    }
 
    /**
     * docx文档转换为PDF
     * @param body 文档
     * @param response 响应给前端
     * @return pdf 输出流
     * @throws Exception 可能为Docx4JException, FileNotFoundException, IOException等
     */
    public static void convertDocxToPdf(byte[] body , HttpServletResponse response) throws Exception {
        response.setContentType("application/pdf");
        File docxFile = FileUtil.byteToFile(body, UUID.randomUUID().toString() + ".docx");
        try {
            WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(docxFile);
            setFontMapper(mlPackage);
            Docx4J.toPDF(mlPackage, response.getOutputStream());
        }catch (Exception e){
            e.printStackTrace();
            log.error("docx文档转换为PDF失败");
        }
       FileUtil.deleteTempFile(docxFile);
    }
 
 
 
    /**
     * docx文档转换为PDF
     *
     * @param pdfPath PDF文档存储路径
     * @throws Exception 可能为Docx4JException, FileNotFoundException, IOException等
     */
    public static void convertDocxToPdf(String docxPath, String pdfPath) throws Exception {
 
        FileOutputStream fileOutputStream = null;
        try {
            File file = new File(docxPath);
            fileOutputStream = new FileOutputStream(new File(pdfPath));
            WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(file);
            setFontMapper(mlPackage);
            Docx4J.toPDF(mlPackage, new FileOutputStream(new File(pdfPath)));
        }catch (Exception e){
            e.printStackTrace();
            log.error("docx文档转换为PDF失败");
        }finally {
            IOUtils.closeQuietly(fileOutputStream);
        }
    }
 
    private static void setFontMapper(WordprocessingMLPackage mlPackage) throws Exception {        
        Mapper fontMapper = new IdentityPlusMapper();
        //加载字体文件(解决linux环境下无中文字体问题)
        if(PhysicalFonts.get("SimSun") == null) {
        	System.out.println("加载本地SimSun字体库");
//        	PhysicalFonts.addPhysicalFonts("SimSun", WordUtils.class.getResource("/fonts/SIMSUN.TTC"));
        }
		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);
    }
    
}

3.在linux环境中安装windows字体

(1)在linux(CentOS7)环境中新建文件夹/usr/share/fonts/win_font

(2)将C:WindowsFonts(win10)中的字体文件拷贝到/usr/share/fonts/win_font文件夹中

(3)加载字体文件

mkfontscale       //字体扩展
mkfontdir           //新增字体目录
fc-cache -fv      //刷新缓存

(4)查看字体安装情况

fc-list :lang=zh

4.打包部署并启动程序即可查看最终效果,亲测通过,希望对你有所帮助。

如有疑问,可留言给我,看到后会回复。

免责声明:文章转载自《使用docx4j实现docx转pdf(解决linux环境下中文乱码问题)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android开发 ExpandableListView 可折叠列表详解Web自动化遇到shadowDOM节点操作(还没试)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.net framework 4.5为啥在IIS中找不到了

今天心血来潮,下了个VS2012安装玩玩,整个过程很傻瓜化,一切是那么的顺呀!   有一点需要注意,VS2012中的组件安装都是集成在一起的,这不像2010以及之前版本,你不会在控制面板中看到一大堆的安装组件出现,这也包括了MVC4。如果你之前独立安装过MVC4的beta或RC版本,那你安装的只是对Vs2010有用,和2012种的没有半毛的关系,也就是说...

Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova。它能让你使用HTML5轻松调用本地API接口和发布应用到商店的应用开发平台。有低成本,低开发周期,轻量化等优点。它统一封装了Andriod,IOS,WindowsPhone,Symbian等几大移...

CAA工程创建

CAA工程创建 一、新建Workspace 选择New CAA V5 Workspace新建CAA工程,弹出对话框,第一项默认使用Mkmk编译,第二项选择工程存储路径,不同工程分开用0不同路径,第三项选择所基于CATIA版本,点击Next。 点击Close弹出下图,选择Create new framework,->Finish。 弹出下图,按如下配...

【前端】本地调试H5页面方案总结

背景 大学毕业快要一年了,用leader的话说我也是有一年开发经验的前端开发工程师了,输出是检验输入的最好方法,那我就慢慢来总结这一年来在工作中总结的经验教训,分享给大家,有不专业和不完善的地方,请大家多多指点反馈,比心~ 做过一段时间的运营需求,一些主要在手机上浏览的页面,遇到的最大问题是调试的问题: 对于简单的网络、APP环境的调试,我们可以通过Chr...

Cordova自定义插件开发

一、创建Cordova项目 在创建项目前请确保安装Cordova Cordova环境配置:https://www.w3cschool.cn/cordova/cordova_environment_setup.html 在即将创建的Cordova项目存放目录打开命令窗口,输入创建命令 cordova create CordovaProject io.cord...

linux下的venv使用

首先安装该模块: sudo apt-get install python3-venv  之后创建用于存储工程的文件夹 mkdir [filename] 创建环境: python3 -m venv venv 激活环境: source venv/bin/activate 退出虚拟环境: deactivate 参考链接: https://www.c...