Word转PDF简单示例,分别在windows和centos中完成转换

概述

本篇博客以简单的示例代码分别在Windows和Linux环境下完成Word转PDF的文档转换。

文章提供SpringBoot + Vue3的示例代码。

文章为什么要分为Windows和Linux环境?

因为在如下提供的Windows后端示例代码中使用documents4j库做转换,此库需要调用命令行工具,并且需要安装Microsoft Word,但在Linux上无法安装Microsoft Word,因此如下提供了两份后端代码。

 过程

前端传入word文件 -> 后端处理 -> 返回转换后的字节数组(byte[])

Windows后端代码

maven依赖


<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-local</artifactId>
    <version>1.0.3</version>
</dependency>

<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-word</artifactId>
    <version>1.0.3</version>
</dependency>

 示例代码

// controller接口
@PostMapping("/upload")
    public byte[] convertDocxToPdf(@RequestParam("file") MultipartFile file) throws IOException {
        if (!file.getOriginalFilename().endsWith(".docx")) {
            throw new IllegalArgumentException("文件类型不支持");
        }

        try (InputStream docxInputStream = file.getInputStream();
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {

            IConverter converter = LocalConverter.builder().build();
            converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();

            return outputStream.toByteArray();
        }
    }

CentOS后端代码

maven依赖

<dependency>
    <groupId>org.jodconverter</groupId>
    <artifactId>jodconverter-local</artifactId>
    <version>4.4.2</version>
</dependency>

示例代码

    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public byte[] uploadFile(@RequestParam("file") MultipartFile file) throws IOException, OfficeException {
        if (file.getOriginalFilename().endsWith(".docx")) {
            LocalOfficeManager officeManager = LocalOfficeManager.install();
            try {
                officeManager.start();
                DocumentConverter converter = LocalConverter.builder().officeManager(officeManager).build();
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                converter.convert(file.getInputStream()).as(DefaultDocumentFormatRegistry.DOCX).to(out).as(DefaultDocumentFormatRegistry.PDF).execute();
                return out.toByteArray();
            } finally {
                OfficeUtils.stopQuietly(officeManager);
            }
        } else {
            throw new IOException("文件类型不支持");
        }
    }

*** 当使用上方的代码进行word转pdf之后,输出的很大可能会出现中文文字不能正确显示,文字全部变成小矩形框。

这是因为在linux上没有中文字体库导致的。

 在centos7中安装中文字体库 

1.首先检查安装所需要的工具

yum -y install fontconfig

yum -y install ttmkfdir

 2.之后检查/usr/share目录是否有fonts 和 fontconfig

3.创建chinese目录,用于存放我们需要的字体

在/usr/share/fonts下创建chinese

4.下载需要的字体

我们到自己的windows电脑上查找想要的字体,访问C:\Windows\Fonts

可以搜索自己文档转换过程中需要的字体,例如:宋体

将字体拷贝放到centos的/usr/share/fonts/chinese目录中,并修改chinese目录的权限:

chmod -R 755 /usr/share/fonts/chinese

5.执行命令,生成 TrueType 字体的字体度量

ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir

6.配置刚才创建中文字体目录,使之生效即可。

vi /etc/fonts/fonts.conf 

7.执行命令,刷新字体缓存

fc-cache 

 至此,重新访问后端服务进行word转pdf会发现字体成功显示。

前端测试代码

 在此提供与后端代码配套测试的前端代码(vue3) 

<template>
  <div>
    <div id="my_ipt">
  <label for="ipt" class="upload-button">上传文件(Word 或 PDF)</label>
  <input id="ipt" type="file" @change="uploadFile" accept=".pdf,.docx">
</div>
    <hr>
    <iframe v-if="fileSrc" :src="fileSrc" width="100%" height="600px"></iframe>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import axios from 'axios'; 

const fileSrc = ref(null);

const uploadFile = async (event) => {
  const file = event.target.files[0];
  if (file) {
    if (file.type === 'application/pdf') {
      fileSrc.value = URL.createObjectURL(file);
    } else if (file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
      const formData = new FormData();
      formData.append('file', file);
      const response = await axios.post('/doc/upload', formData, {
        responseType: 'blob',
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      });
      fileSrc.value = URL.createObjectURL(new Blob([response.data], { type: 'application/pdf' }));
    } 
  }
};
</script>

<style scoped>
.upload-button {
  background-color: #4CAF50;
  border: none;
  color: white;
  padding: 10px 20px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 16px;
  cursor: pointer;
  border-radius: 5px;
}

.upload-button:hover {
  background-color: #3e8e41;
}

</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/141082.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何制作一个有吸引力的电商小程序

随着互联网的快速发展&#xff0c;电商行业也在不断壮大&#xff0c;越来越多的商家开始进入电商领域。在这个竞争激烈的市场中&#xff0c;一个有吸引力的电商小程序能够为商家带来巨大的优势。那么&#xff0c;如何制作一个有吸引力的电商小程序呢&#xff1f;下面我们将以乔…

2023nacos源码解读第2集——nacos-server的启动

nacos 是一个典型的server-client中间件&#xff0c;server这里安装最新的nacos-server 2.3.0-BETA版本 1.docker启动nacos-server 镜像详情参考nacos-docker项目的readme &#xff0c;很方便&#xff0c;但是官方提供的nacos-server镜像往往可能滞后&#xff0c;且不便于后续…

【Git】第一篇:Git安装(centos)

git查看安装版本 以我自己的centos7.6为例&#xff0c;我们可以输入以下指令查看自己是否安装了git. git --version安装了的话就会显示自己安装的版本。 git 安装 安装很简单&#xff0c;一条命令即可 sudo yum install git -ygit 卸载 sudo yum remove git -y

本地生活直播的下个红利期来了!虚拟直播遇上本地生活擦出新火花

近年来&#xff0c;本地生活直播发展迅猛&#xff0c;作为一种全新的线下实体店营销方式&#xff0c;它比电商直播更贴近消费者的生活需求。比如消费者通过直播购买套餐或消费券&#xff0c;并在实体店核销。这种情况就可以归属于本地生活直播的服务范围。因此&#xff0c;对于…

基于SpringBoot+Vue的高校心理教育管理系统

基于SpringBootVue的高校心理教育管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 测试列表 测试结果 用户界面 管理员界面 摘要 本文设计并实现了一款…

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上&#xff0c;属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery&#xff0c;这位前端开发的巫师&#xff0c;通过简洁而强大的语法&#xff0c;为我们提供了便捷的属性操作工具。在这篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的属性操作&…

【时间复杂度和空间复杂度】

文章目录 前言时间复杂度大O的渐进表示法推导大O阶方法练习 空间复杂度练习 前言 衡量算法的效率分为两种情况&#xff1a; 1.时间复杂度 2.空间复杂度 时间复杂度 含义&#xff1a;算法中的基本操作的执行次数&#xff0c;为算法的时间复杂度 大O的渐进表示法 计算时间复…

网络安全专用产品有哪些?能一一列举出来吗?

网络安全专用产品是专门为网络安全设计的防护产品。那你知道网络安全专用产品有哪些&#xff1f;这里我们小编就给大家汇总了一下&#xff0c;仅供参考哈&#xff01; 网络安全专用产品有哪些&#xff1f; 1、数据备份与恢复产品 2、防火墙 3、入侵检测系统 4、入侵防御系统…

IDEA 2023搭建 SpringMVC +FreeMarker+JDBC

1.IDEA的版本&#xff0c;目前最新是2023&#xff0c;要选择旗舰版。笔者曾选择社区版&#xff0c;发现少了很多功能。只能重新安装。 2.安装好以后的第1件事&#xff0c;是设置Maven&#xff0c;并将下载地址改为淘定站&#xff0c;参照这篇一次包会——最新IDEA配置Maven指南…

网络渗透测试(被动扫描)

被动扫描 主要是指的是在目标无法察觉的情况下进行信息搜集。在Google上进行人名的搜素就是一次被动扫描。最经典的被动扫描技术就是"Google Hacking"技术。由于Google退出中国&#xff0c;暂时无法使用。在此介绍三个优秀的信息搜集工具 被动扫描范围 1.企业网络…

Redis应用之二分布式锁2

一、前言 前一篇 Redis应用之二分布式锁 我们介绍了使用SETNX来实现分布式锁&#xff0c;并且还遗留了一个Bug&#xff0c;今天我们对代码进行优化&#xff0c;然后介绍一下Redisson以及数据库的乐观锁悲观锁怎么用。 二、SetNX分布式锁优化后代码 RedisService.java Inven…

Python数据容器之[列表]

Python数据容器 Python中的数据容器&#xff1a; 一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素 每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支…

Python数据容器(序列操作)

序列 1.什么是序列 序列是指&#xff1a;内容连续、有序。可以使用下标索引的一类数据容器 列表、元组、字符串。均可以视为序列 2.序列的常用操作 - 切片 语法&#xff1a;序列[起始下标:结束下标:步长]起始下标表示从何处开始&#xff0c;可以留空&#xff0c;留空视作从…

python 根据经纬度绘制点图 极投影

参考了python cartopy手动导入地图数据绘制底图/python地图上绘制散点图&#xff1a;Downloading:warnings/散点图添加图里标签_python add_feature-CSDN博客 点的颜色按照时间显示 # -*- coding: utf-8 -*- """ Created on Mon Nov 13 11:32:48 2023"&quo…

数据结构—数组栈的实现

前言&#xff1a;各位小伙伴们我们前面已经学习了带头双向循环链表&#xff0c;数据结构中还有一些特殊的线性表&#xff0c;如栈和队列&#xff0c;那么我们今天就来实现数组栈。 目录&#xff1a; 一、 栈的概念 二、 栈的实现 三、 代码测试 栈的概念&#xff1a; 栈的概念…

TSINGSEE视频智能分析人员入侵AI检测算法如何让城市管理更加高效、智慧?

在城市管理场景中&#xff0c;经常面临着禁区垂钓、非法捕捞、行人闯红灯、小区盗窃、车辆乱停乱放等一系列管理难题&#xff0c;这给城市发展带来了不小的阻力&#xff0c;同时也极易增加管理的人力、物力和财力。传统的人员巡逻监管效率低并且存在时间差&#xff0c;很难及时…

2023年数维杯国际大学生数学建模挑战赛

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 cs数模团队在数维杯前为大家提供了许多资料的内容呀&#xff0…

Python 如何实现 Command(命令)模式?什么是 Command(命令)设计模式?

什么是命令设计模式&#xff1f; 命令模式&#xff08;Command Design Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而允许参数化客户端对象&#xff0c;排队请求&#xff0c;或者对请求进行操作。命令模式支持撤销操作&#xff0…

傅里叶分析(2)

在《傅里叶分析&#xff08;1&#xff09;》中&#xff0c;讲述了连续信号的傅里叶分析方法&#xff0c;本文讲述离散信号的傅里叶分析方法。 虽然电、声、光、机械振动等信号在物理上是连续函数&#xff0c;但在实际工程中&#xff0c;其通常为离散信号&#xff0c;即若干离散…

设计模式之模版方法(TemplateMethod)

模版方法 钩子函数 回调函数 在父类里面有一个模版方法&#xff0c;在这个方法里面调用了op1&#xff0c;op2&#xff0c;op3… 在子类里面如果想要改变父类的op1和op2 只需要重写op1和op2&#xff0c;那么这个重写之后的方法&#xff0c;可以在父类里面直接调用的到 例子: J…
最新文章