基于linux系统的通用格式转换

Posted by mjTree on November 8, 2023

更新于:2023-11-21 20:10

一、简介

本章是继 《文档结构化解析》 之后的文章,之所以要先写这篇文章主要是为了引入微软的官方VBA接口开发文档,方便后续文章的概念便于理解,另外该接口后续也是用于 word/excel 解析使用。

本章主要介绍在 Linux 系统以及在 Docker 容器内部运行的一种文档格式转换的服务,因为有了转换服务,就可以将其他格式转换成 PDF 格式文件,专心解决 PDF 解析即可。虽然也有其他的 Windows 系统的工具框架,但是在国内做小众需求卖给企业,就要考虑到军政机构、国产化这些点。

二、常用工具介绍

1、Universal Office Converter

该服务的简称叫 unoconv ,一个可以在 linux、macos 上面运行的工具,放在容器里面然后编写一下代码进行调用即可完成一个格式转换的服务镜像。

不过目前网络上面的资料很多,有他人封装好的镜像,推荐网络查询去使用他人提供的即可。Unoconv 服务自身转换会有些效果问题,考虑到国内金融领域文档版面天花乱坠,该服务恐难以招架的住,目前官网已经有多年未更新。

2、Gotenberg

一款支持通过 Docker 启动服务后,通过接口将其他文件转换成 PDF 文件服务。该服务通过 API 与 Chromium、LibreOffice 进行交互。轻松通过调用接口,轻松地将网页、HTML、Markdown、Word、Excel 等格式的文档转换为 PDF 文件,官网更新频率较高,符合开箱即用,非常推荐。

3、WPS

该工具是金山软件公司自主研发的一款办公软件品牌,堪称是国民级的软件(虽然有广告诟病),由上世纪求伯君、雷军等人创造的产品。本篇文章要讨论的是 wps for linux 。考虑到 Word、Excel、PPT 等文件转换成 PDF 效果,Linux 场景下 WPS 应该位居前列吧。

针对 C++ 代码,有提供 jar 包接口去调用,不过时间很早不清楚还能不能支持新版本接口功能,可以尝试使用 python 版本接口封装包 pywpsrpc 。该包是金山员工制作的开源包,个人使用 linux-wps 没什么问题,商业涉及版权问题,推荐购买企业版。在此也引入微软官方定义的 OfficeVBA ,以 Word 定义的结构为主,后续可以参考定义一套自己简单的数据结构。

4、其他工具

doctron、libreoffice、pymupdf、wkhhtmltopdf 等都是单独组件,就不做一一介绍了。

三、基于WPS快速搭建docker服务

1、版权说明

WPS 做为国内的金山公司开发的一款办公软件,免费提供给大家使用。下面步骤只适用于个人学习使用,禁止商用,尊重版权,侵权可耻。

accredit

2、基础镜像选择

首先选择市面上的开源镜像,优先去 dockerhub 去查询,推荐使用 VNC-SERVER 的基础镜像(有arm镜像版本)。个人验证过非桌面镜像的下转换的文件无法使用,所以需要基础镜像携带桌面的这种需要渲染的镜像用于基础镜像使用。

3、依赖安装

首选是安装wps安装包前的一些必要依赖,然后是相关字体的安装。

sudo apt-get -y --allow-releaseinfo-change update
sudo apt-get install -y -qq libfreetype6 libcups2 libglib2.0-0 libglu1-mesa libsm6 libxrender1 libfontconfig1 libxext6 libxcb1 libgtk2.0-0 libcanberra-gtk-module xdg-utils
sudo apt-get -y install qt5-default

sudo apt-get -y install ttf-mscorefonts-installer fontconfig
mv *.ttf /usr/share/fonts/chinese/TrueType
sudo mkfontdir
sudo mkfontscale
sudo fc-cache -f -v

必要依赖:不同版本的wps依赖可能不一样,如果安装失败,可通过apt-get -f install修复安装依赖的同时查看缺失什么依赖自行添加。
字体:可以去免费开源的字体商店下载一些字体(ttf 、TTF、otf、ttc),注意不要擅自使用收费字体,侵权违法的事不要做。

4、配置问题

联系金山企业购买正版的软件没这个问题,个人版涉及一个AcceptedEULA开关配置和一个模式切换配置,配置文件路径是/UserName/.config/Kingsoft/Office.conf
个人建议不用在意配置开关的名称,只需要进入容器的桌面环境,先手动的去打开软件、手动勾选相关弹窗,修改软件的配置等信息,之后把上面的配置路径下的文件内容复制出来即可,下次通过docker的外挂配置即可完成。

5、依赖库和代码

依赖库:pywpsrpc

下面提供一小段pywpsrpc官方的格式转换代码,仅做参考使用,请勿在生产环境使用。

from pywpsrpc.rpcetapi import createEtRpcInstance, etapi
from pywpsrpc.rpcwppapi import createWppRpcInstance, wppapi
from pywpsrpc.rpcwpsapi import createWpsRpcInstance, wpsapi


print("word -> pdf")
hr, wps_rpc = createWpsRpcInstance()
hr, wps_application = wps_rpc.getWpsApplication()
wps_application.Visible = False
hr, document = wps_application.Documents.Open('test.docx')
document.SaveAs2('test.pdf', FileFormat=wpsapi.wdFormatPDF)

print("excel -> pdf/xlsx")
hr, et_rpc = createEtRpcInstance()
hr, et_application = et_rpc.getEtApplication()
et_application.Visible = False
hr, workbook = et_application.Workbooks.Open('test.xls')
workbook.ExportAsFixedFormat(etapi.xlTypePDF, Filename='test.pdf')
workbook.SaveAs2('test.xlsx', FileFormat=etapi.xlWorkbookDefault)

print("ppt -> pdf")
hr, wpp_rpc = createWppRpcInstance()
hr, wpp_application = wpp_rpc.getWppApplication()
hr, presentation = wpp_application.Presentations.Open('test.ppt', WithWindow=False)
presentation.SaveAs('test.pdf', wppapi.ppSaveAsPDF)

四、小结

本篇文章主要介绍了在国内做文档解析,为什么需要有一款服务基于Linux格式转换的服务。介绍了一些市面上的开源组件,着重讲解了WPS的高可用性以及如何搭建一个个人学习和使用的Docker服务。并且文章引入了微软官方的 OfficeVBA 接口文档,为后续的文章做好铺垫。