/JIMU-ConvertOffice

将常见办公文档格式文件,转换为PDF、OFD,支持添加图片水印、文字水印。

Primary LanguageJava

ConvertOffice Service

Office格式文件转换PDF/OFD服务

简介

本服务用于将常见的文档转换为PDF或OFD文件。支持path、url方式获取源文件;支持对文件加图片水印、文字水印;支持path、ftp、url方式回写文件。

本服务支持的输入文件格式为:Office系列(doc、docx、xls、xlsx、ppt、pptx)、OpenOffice系列(odt、odp、ods)、WPS系列(wps)、csv、tsv、ofd(转pdf)。

转换后输出格式为:PDF、OFD。

配置说明

LibreOffice配置

本服务依赖LibreOffice将各类文档转换为PDF。

使用本服务前,需要现在服务器端安装LibreOffice。

可以访问 下载 LibreOffice | LibreOffice 简体中文官方网站 - 自由免费的办公套件 下载对应版本的软件。

Windows环境安装

Windows64位版下载地址:https://www.libreoffice.org/donate/dl/win-x86_64/7.2.4/zh-CN/LibreOffice_7.2.4_Win_x64.msi

下载后,运行安装程序,安装到本地文件夹即可。

Linux环境安装和卸载

Linux系统下的安装包请到下载页面获取。有两种打包方式:适用于 Debian/Ubuntu 的 ".deb" 包,以及适用于 Fedora/SUSE/Mandriva 的 ".rpm" 包。请选择适合您的操作系统的类型。

Linux64位(deb)下载地址:https://www.libreoffice.org/donate/dl/deb-x86_64/7.2.4/zh-CN/LibreOffice_7.2.4_Linux_x86-64_deb.tar.gz

Linux64位(rpm)下载地址:https://www.libreoffice.org/donate/dl/rpm-x86_64/7.2.4/zh-CN/LibreOffice_7.2.4_Linux_x86-64_rpm.tar.gz

安装

Debian/Ubuntu系统 (.deb包):
# 切换到安装包所在的目录$ cd ~/下载/# 安装主安装程序的所有deb包
$ sudo dpkg -i ./LibreOffice_X.Y.Z_Linux_x86_deb/DEBS/*.deb
# 安装中文语言包中的所有deb包 */
$ sudo dpkg -i ./LibreOffice_4.x.x_Linux_x86_deb_langpack_zh-CN/DEBS/*.deb
/* 安装中文离线帮助文件中的所有deb包 */
$ sudo dpkg -i ./LibreOffice_4.x.x_Linux_x86_deb_helppack_zh-CN/DEBS/*.deb
Fedora/SUSE/Mandriva系统 (.rpm包):
$ cd ~/下载/ /* 切换到安装包所在的目录 *
$ sudo yum install ./LibreOffice_4.x.x_Linux_x86_rpm/RPMS/*.rpm  /* 安装主安装程序的所有rpm包 */
$ sudo yum install ./LibreOffice_4.x.x_Linux_x86_rpm_langpack_zh-CN/RPMS/*.rpm  /* 安装中文语言包中的所有rpm包 */
$ sudo yum install ./LibreOffice_4.x.x_Linux_x86_rpm_helppack_zh-CN/RPMS/*.rpm  /* 安装中文离线帮助文件中的所有rpm包 */

卸载

Debian/Ubuntu系统 (.deb包):
$ sudo apt-get remove --purge libreoffice4.x-*  /* 移除所有类似libreoffice4.x-*的包。--purge表示卸载的同时移除所有相关的配置文件 */
Fedora/SUSE/Mandriva系统 (.rpm包):
$ sudo yum remove libreoffice4.x-*  /* 移除所有类似libreoffice4.x-*的包。 */

微服务配置

本服务的所有配置信息均在于jar包同级文件夹中的application.yml中,默认内容如下:

# Tomcat
server:
  tomcat:
    uri-encoding: UTF-8
    max-threads: 1000
    min-spare-threads: 30
  # 端口号
  port: 8080
  # 超时时间
  connection-timeout: 5000

spring:
  # RabbitMQ设置
  rabbitmq:
    # 访问地址
    host: 127.0.0.1
    # 端口
    port: 5672
    # 用户名
    username: guest
    # 密码
    password: guest
    # 监听设置
    listener:
      # 生产者
      direct:
        # 自动启动开关
        auto-startup: false
      # 消费者
      simple:
        # 自动启动开关
        auto-startup: false

  application:
    # 应用名称。如果启用nacos,此值必填
    name: com.thinkdifferent.convertoffice
  cloud:
    # Nacos的配置。
    # 如果启用Nacos服务作为配置中心,
    # 则此部分之后的内容均可以在Nacos配置中心中管理,
    # 不必在此配置文件中维护。
    nacos:
      config:
        # 配置服务地址
        server-addr: 127.0.0.1:8848
        # 启用状态
        enabled: false
      discovery:
        # 服务发现服务地址
        server-addr: 127.0.0.1:8848
        # 启用状态
        enabled: false


# log4j2设置
logging:
  # 配置文件名
  config: log4j2.xml
  level:
    com.thinkdifferent: trace

# 线程设置参数 #######
ThreadPool:
  # 核心线程数10:线程池创建时候初始化的线程数
  CorePoolSize: 10
  # 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
  MaxPoolSize: 20
  # 缓冲队列200:用来缓冲执行任务的队列
  QueueCapacity: 200
  # 保持活动时间60秒
  KeepAliveSeconds: 60
  # 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
  AwaitTerminationSeconds: 60

jodconverter:
  local:
    enabled: true
    # libreOffice根目录
    office-home: D:/LibreOffice
    # 端口(线程)
    portNumbers: [2001,2002,2003]
    # LibreOffice进程重启前的最大进程数
    maxTasksPerProcess: 100
    # 任务执行的超时时间
    taskExecutionTimeout: 86400000
    # 任务队列的超时时间
    taskQueueTimeout: 86400000
    # 一个进程的超时时间
    processTimeout: 86400000


# 本服务设置
convert:
  office:
    # 接收的输入文件存储的临时文件夹
    inPutTempPath: D:/cvtest/temp/
    # 默认本地输出文件所在文件夹
    outPutPath: D:/cvtest/

可以根据服务器的实际情况进行修改。

重点需要修改的内容:

  • Nacos服务设置:设置是否启用、服务地址和端口。
  • 线程参数设置:需要根据实际硬件的承载能力,调整线程池的大小。
  • RabbitMQ设置:根据实际软件部署情况,控制是否启用RabbitMQ;如果启用RabbitMQ,一定要根据服务的配置情况修改地址、端口、用户名、密码等信息。
  • jodconverter设置:重点修改“office-home”的值,一定要写LibreOffice在本服务器中安装的路径
  • 本服务设置:根据本服务所在服务器的实际情况,修改本地文件输出路径。

使用说明

本服务提供REST接口供外部系统调用,提供了直接转换接口和通过MQ异步转换的接口。

图片转换接口说明

直接生成JPG/PDF接口URL:http://host:port/api/convert

MQ异步生成JPG/PDF接口URL:http://host:port/api/convert4mq

接口调用方式:POST

传入参数形式:JSON

传入参数示例:

{
	"inputType": "path",
	"inputFile": "D:/1.docx",
	"outPutFileName": "1-online",
	"outPutFileType": "ofd",
	"waterMark": {
		"waterMarkType": "text",
		"waterMarkText": "内部文件",
		"degree": "45",
		"alpha": "0.5f",
		"fontName": "宋体",
		"fontSize": "20",
		"fontColor": "gray"
	},
	"writeBackType": "path",
	"writeBack": {
		"path": "D:/cvtest/"
	},
	"callBackURL": "http://10.11.12.13/callback"
}

以下分块解释传入参数每部分的内容。

输入信息

系统支持本地文件路径输入(path)和http协议的url文件下载输入(url)。

当使用文件路径输入时,配置示例如下:

	"inputType": "path",
	"inputFile": "D:/1.docx",
  • inputType:必填,值为“path”。
  • inputFile:必填,值为需转换的图片文件(输入文件)在当前服务器中的路径和文件名。(如果输入的文件是ofd,则支持输出转换为pdf)

当使用url文件下载输入时,配置示例如下:

	"inputType": "url",
	"inputFile": "http://localhost/file/1.docx",
  • inputType:必填,值为“url”。
  • inputFile:必填,值为需转换的图片文件(输入文件)在Web服务中的URL地址。(如果输入的文件是ofd,则支持输出转换为pdf)

水印设置

系统支持在转换的PDF/OFD文件中加入图片水印或文字水印。

如果需要加入图片水印,设置如下:

    "waterMark":{
        "waterMarkType":"pic",
        "waterMarkFile":"watermark.png",
        "degree": "45",
        "alpha":"0.5f",
        "LocateX":"150",
        "LocateY":"150",
        "waterMarkWidth":"100",
        "waterMarkHeight":"100"
    },
  • waterMarkType:必填,图片水印为“pic”。
  • waterMarkFile:必填,为本服务“watermark”文件夹中已经存放的水印文件。建议使用png格式的文件(支持半透明)。
  • degree:必填,旋转角度。不旋转,则为0。
  • alpha:非必填,透明度。默认值“0.5f”。浮点小数,添加的值必须以“f”结尾。
  • LocateX:非必填,水印在文档中横轴的位置。默认值为宽度的1/6位置(左下角)。
  • LocateY:非必填,水印在文档中纵轴的位置。默认值为高度的1/6位置(左下角)。
  • waterMarkWidth:非必填,水印图片的宽度。默认值为150。
  • waterMarkHeight:非必填,水印图片的高度。默认值为150。

如果需要加入文字水印,设置如下:

	"waterMark": {
		"waterMarkType": "text",
		"waterMarkText": "内部文件",
		"degree": "45",
		"alpha": "0.5f",
		"fontName": "STSONG.TTF",
		"fontSize": "20",
		"fontColor": "gray"
	},
  • waterMarkType:必填,文字水印为“text”。

  • waterMarkText:必填,水印的文字内容。

  • degree:必填,旋转角度。不旋转,则为0。

  • alpha:非必填,透明度。默认值“0.5f”。浮点小数,添加的值必须以“f”结尾。

  • fontName:非必填,字体名称。

    • 如果输出格式为“pdf”,则此处默认值为“STSONG.TTF”。此处的字体名称为系统font文件夹中的字体文件名,后续可自行添加扩展。
    • 如果输出格式为“ofd”,则此值无需填写,系统自动取服务中字库的“宋体”。
  • fontSize:必填,字号大小。PDF字体可为20;OFD字体可为10。

  • fontColor:非必填,字体颜色。默认值“gray”(灰色)。

输出信息

可以设置输出的Pdf/Ofd文件的文件名(无扩展名)和输出的文件类型,如下:

	"outPutFileName": "1-online",
	"outPutFileType": "pdf",
  • outPutFileName:必填,为文件生成后的文件名(无扩展名)。
  • outPutFileType:必填,为文件生成后的扩展名。本服务支持:pdf、ofd。

本例中,即转换后生成名为 1-online.pdf 的文件。

回写信息

本服务支持以下回写方式:文件路径(path)、http协议上传(url)、FTP服务上传(ftp)。

注意:返回Base64接口无此部分回写信息。

当使用文件路径(Path)方式回写时,配置如下:

	"writeBackType": "path",
	"writeBack": {
		"path": "D:/cvtest/"
	},
  • writeBackType:必填,值为“path”。
  • writeBack:必填。JSON对象,path方式中,key为“path”,value为文件回写的路径。

当使用http协议上传(url)方式回写时,配置如下:

	"writeBackType": "url",
	"writeBack": {
		"url": "http://localhost/uploadfile.do"
	},
	"writeBackHeaders": {
		"Authorization": "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0"
	},
  • writeBackType:必填,值为“url”。
  • writeBack:必填。JSON对象,url方式中,key为“url”,value为业务系统提供的文件上传接口API地址。
  • writeBackHeaders:非必填。如果Web服务器访问时需要设置请求头或Token认证,则需要在此处设置请求头的内容;否则此处可不添加。

当使用FTP服务上传(ftp)方式回写时,配置如下:

	"writeBackType": "ftp",
	"writeBack": {
         "passive": "false",
		"host": "ftp://localhost",
         "port": "21",
         "username": "guest",
         "password": "guest",
         "filepath": "/2021/10/"
	},
  • writeBackType:必填,值为“ftp”。
  • writeBack:必填。JSON对象。
    • passive:是否是被动模式。true/false
    • host:ftp服务的访问地址。
    • port:ftp服务的访问端口。
    • username:ftp服务的用户名。
    • password:ftp服务的密码。
    • filepath:文件所在的路径。

回调信息

业务系统可以提供一个GET方式的回调接口,在视频文件转换、回写完毕后,本服务可以调用此接口,传回处理的状态。

注意:返回Base64接口无此部分信息。

	"callBackURL": "http://10.11.12.13/callback.do",
	"callBackHeaders": {
		"Authorization": "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0"
	},
  • callBackURL:回调接口的URL。回调接口需要接收两个参数:
    • file:处理后的文件名。本例为“1-online”。
    • flag:处理后的状态,值为:success 或 error。
  • callBackHeaders:如果回调接口需要在请求头中加入认证信息等,可以在此处设置请求头的参数和值。

接口url示例:

http://10.11.12.13/callback.do?file=1-online&flag=success

返回信息

接口返回信息示例如下:

{
  "flag": "success",
  "message": "Convert Office to PDF success."
}
  • flag:处理状态。success,成功;error,错误,失败。
  • message:返回接口消息。

生成PDF后转换为Base64字符串返回

生成一个PDF后返回Base64字符串接口URL:http://host:port/api/convert2base64

生成多个PDF后返回Base64字符串接口URL:http://host:port/api/convert2base64s

接口调用方式:POST

传入参数形式:JSON

传入参数示例:

{
	"inputType": "path",
	"inputFile": "D:/cvtest/1.docx",
	"outPutFileName": "1-online",
	"outPutFileType": "pdf"
}

以下分块解释传入参数每部分的内容。

输入信息

系统支持本地文件路径输入(path)和http协议的url文件下载输入(url)。

配置示例请见上述章节。

输出信息

可以设置输出的Pdf/Ofd文件的文件名(无扩展名)和输出的文件类型,如下:

	"outPutFileName": "1-online",
	"outPutFileType": "pdf",
  • outPutFileName:必填,为文件生成后的文件名(无扩展名)。
  • outPutFileType:必填,为文件生成后的扩展名。本接口中,可以设置:pdf、ofd。

返回信息

convert2base64接口返回信息示例如下:

JVBERi0xLjQKJeLjz9MKNCAwIG9iago8PC9TdWJ0eXBlL0Zvcm0vRmlsdGVyL0ZsYXRlRGVjb2RlL1R5………………
  • 返回Base64编码后的Jpg/Pdf文件的内容。可供前端页面直接将其放入iframe的src属性中显示。

convert2base64s接口返回信息示例如下:

{
    "flag": "success",
    "message": "Convert Office to PDF success",
    "base64": [
        {
            "filename": "1-online.pdf",
            "base64": "JVBERi0xLjQKJeLjz9MKNCAwIG9iago8PC9TdWJ0eXBlL0Zvcm0vRmlsdGVy…………"
        },
        {
            "filename": "2-online.pdf",
            "base64": "JVBERi0xLjQKJeLjz9MKNCAwIG9iago8PC9TdWJ0eXBlL0Zvcm0vRmlsdGVy…………"
        }
    ]
}
  • flag:处理状态。success,成功;error,错误,失败。
  • message:返回接口消息。
  • base64
    • filename:文件名
    • base64:文件Base64编码之后的字符串。

代码结构说明

本项目所有代码均在 com.thinkdifferent.convertpic 之下,包含如下内容:

  • config
    • ConvertOfficeConfig:本服务自有配置读取。
    • RabbitMQConfig:RabbitMQ服务配置读取。
  • consumer
    • ConvertOfficeConsumer:MQ消费者,消费队列中传入的JSON参数,执行任务(Task)。
  • controller
    • ConvertOffice:REST接口,提供直接转换Jpg/Pdf接口,和调用MQ异步生成PDF/OFD的接口。
  • service
    • ConvertOfficeService:文档转换为Pdf/Ofd文件、文件回写上传、接口回调等核心逻辑处理。
    • RabbitMQService:将JSON消息加入到队列中的服务层处理。
  • task
    • Task:异步多线程任务,供MQ消费者调用,最大限度的提升并行能力。
  • utils
    • ConvertOfficeUtil:文档转换处理的工具类,可以将传入的图片转换为Pdf或Ofd。
    • SpringUtil:获取服务实例工具类。
    • WaterMarkUtil:水印处理工具类,支持图片水印、文字水印。
    • WriteBackUtil:回写文件、回调接口的工具类。