wkhtmltopdf 与 .Net Core

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
相关推荐
deriva9 小时前
.netcore+ef+redis+rabbitmq+dotcap先同步后异步再同步的方法,亲测有效
redis·rabbitmq·.netcore
棉晗榜16 天前
C# .net core添加单元测试项目,依赖注入接口测试
单元测试·c#·.netcore
时光追逐者16 天前
.NET初级软件工程师面试经验分享
经验分享·面试·职场和发展·c#·.net·.netcore
忧郁的蛋~18 天前
.NET Core 实现缓存的预热的方式
缓存·c#·.net·.netcore
csdn_aspnet19 天前
C# .NET Core 源代码生成器(dotnet source generators)
c#·.netcore
时光追逐者19 天前
C#/.NET/.NET Core技术前沿周刊 | 第 42 期(2025年6.9-6.15)
c#·.net·.netcore
csdn_aspnet20 天前
使用 C# 源生成器(Source Generators)进行高效开发:增强 Blazor 及其他功能
c#·.netcore
lgaof65822@gmail.com22 天前
Asp.Net Core SignalR导入数据
前端·后端·asp.net·.netcore
眸笑丶22 天前
.NET Core 数据库连接字符串加密与解密
数据库·oracle·.netcore
时光追逐者24 天前
C#/.NET/.NET Core技术前沿周刊 | 第 41 期(2025年6.1-6.8)
c#·.net·.netcore