wkhtmltopdf 是使用webkit引擎转化为pdf的开源小插件.
其有.NET CORE版本的组件,DinkToPdf,但该控件对跨平台支持有限 。
是由于各系统平台会产生不同的编译结果,故windows上使用.dll,而Linux上的动态链接库是.so
所以你需要在Linux系统上安装相关wkhtmltox软件。
我这里准备了 mcr.microsoft.com/dotnet/sdk:6.0 的docker镜像。
准备工作
虚拟机:Linux version 3.10.0-1160.el7.x86_64
wkhtmltox开发包:wkhtmltox_0.12.6.1-2.bullseye_amd64.deb
运行环境:mcr.microsoft.com/dotnet/aspnet:6.0
Debian 11 镜像
Dockerfile
shell
# 微软Debian 11 镜像
FROM mcr.microsoft.com/dotnet/sdk:6.0
WORKDIR /app
# 设置清华源
RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# 安装依赖项
RUN apt-get update && apt-get install -y \
fontconfig \
libfreetype6 \
libjpeg62-turbo \
libpng16-16 \
libx11-6 \
libxcb1 \
libxext6 \
libxrender1 \
xfonts-75dpi \
xfonts-base
# 安装wkhtmltox
COPY wkhtmltox_0.12.6.1-2.bullseye_amd64.deb .
RUN dpkg -i wkhtmltox_0.12.6.1-2.bullseye_amd64.deb
# 设置环境变量
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64
CMD ["/bin/bash"]
生成镜像类
shell
docker build -t wkhtml:2023 .
docker-compose.yml
yml
version: "3.0" # 模板的版本
networks:
core-net:
# 网络
driver: bridge
services:
test:
networks:
core-net:
aliases:
- test
image: wkhtml:2023
volumes:
- ./test:/app
command: dotnet ConsoleApp.dll
生成测试类
csharp
using System.Runtime.InteropServices;
public class Program
{
// 声明CAPI函数
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int wkhtmltopdf_init(int use_graphics);
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr wkhtmltopdf_create_global_settings();
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr wkhtmltopdf_create_object_settings();
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void wkhtmltopdf_set_global_setting(IntPtr settings, string name, string value);
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void wkhtmltopdf_set_object_setting(IntPtr settings, string name, string value);
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr wkhtmltopdf_create_converter(IntPtr settings);
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void wkhtmltopdf_add_object(IntPtr converter, IntPtr objectSettings, byte[] data);
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int wkhtmltopdf_convert(IntPtr converter);
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void wkhtmltopdf_destroy_converter(IntPtr converter);
[DllImport("libwkhtmltox.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void wkhtmltopdf_deinit();
public static void Main(string[] args)
{
Console.WriteLine("123");
try
{
// 初始化wkhtmltopdf库
wkhtmltopdf_init(0);
// 创建全局设置和对象设置
IntPtr gs = wkhtmltopdf_create_global_settings();
IntPtr os = wkhtmltopdf_create_object_settings();
// 设置全局设置和对象设置
wkhtmltopdf_set_global_setting(gs, "out", "output.pdf");
wkhtmltopdf_set_object_setting(os, "page", "1.html");
// 创建转换器
IntPtr converter = wkhtmltopdf_create_converter(gs);
// 添加要转换的对象
wkhtmltopdf_add_object(converter, os, null);
// 执行转换
wkhtmltopdf_convert(converter);
// 清理资源
wkhtmltopdf_destroy_converter(converter);
wkhtmltopdf_deinit();
}catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
通过 Volumn 挂载将dll直接放置在容器中,并启动dll程序。则得到如此结果。
关于中文字体等
你可以使用Windows中的字体库 C:\Windows\Fonts 将其拷贝到 容器的 /usr/share/fonts
当然我是使用的容器挂载. 然后将其放到宿主机相关目录就可以了。
因为这里是用的相对路径,所以放置在docker-compose.yml所在目录的fonts就可以了。
docker-compose.yml
yml
version: "3.0" # 模板的版本
networks:
core-net:
# 网络
driver: bridge
services:
test:
networks:
core-net:
aliases:
- test
image: wkhtml:2023
volumes:
- ./fonts:/usr/share/fonts
command: dotnet ConsoleApp.dll