最近项目中遇到了生成PDF的问题,我们选用了先生成Excel, 再将Excel文件转换成PDF的方式。使用这种方式的好处是可以让客户更方便的制作模板,这在我们的业务场景中很重要。

为了跨平台,我们选用的Excel操作库是LibXL , 需要付费使用。

那么如何将Excel文件转换成PDF就成了我们的子问题。

Windows

如果客户服务器 是Windows, 我们可以直接调用Office 接口来实现。

这样做的前提是需要在使用的电脑安装好Office软件。

下面是一段C#代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Microsoft.Office.Interop.Excel.Application excelApplication;
Microsoft.Office.Interop.Excel.Workbook excelWorkbook;
excelApplication = new Microsoft.Office.Interop.Excel.Application();
excelApplication.ScreenUpdating = false;
excelApplication.DisplayAlerts = false;
excelWorkbook = excelApplication.Workbooks.Open(workbookPath);
if (excelWorkbook == null) {
excelApplication.Quit();
excelApplication = null;
excelWorkbook = null;
return false;
}
var exportSuccessful = true;
try {
excelWorkbook.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF, outputPath);
} catch (System.Exception ex) {
exportSuccessful = false;
} finally {
excelWorkbook.Close();
excelApplication.Quit();
excelApplication = null;
excelWorkbook = null;
}

更详细的代码在这里

在Windows 服务中运行可能遇到的问题

在我们的实际情况中,需要在Windows服务中运行。

经测试,在Windows Server 2016 / Windows 10中会出现调用COM组件的权限问题。

解决方案

服务以特定账户登录,如下图:

且保证有以下系统目录

C:\Windows\System32\config\systemprofile\Desktop

C:\Windows\SysWOW64\config\systemprofile\Desktop

Linux

使用 GOTENBERG

GOTENBERG 是 一个 开源项目,当前开源协议是 MIT. 它支持将 HTML, Markdown, Office文件转换成 PDF。

下面的测试以 CentOS 7 环境为例。

先拉取docker镜像。

1
$ docker pull thecodingmachine/gotenberg

再run一个容器。

1
$ docker run --name excel2pdf --rm -p 9182:3000 -d thecodingmachine/gotenberg

一个示例的Python代码:

1
2
3
4
5
def excel2pdf(xlsx_path, pdf_path):
url = "http://192.168.0.118:9182/convert/office"
files = { "files" : (os.path.basename(xlsx_path), open(xlsx_path, "rb"))}
response = requests.post(url, files=files)
open(pdf_path, "wb").write(response.content)

使用 Wine

Wine是在x86x86-64容许类Unix操作系统X Window System运行Microsoft Windows程序的软件。

此方案未测试。此处不详述。

References