wkhtmltopdf 与 .Net Core

news2024/11/16 20:57:56

wkhtmltopdf 是使用webkit引擎转化为pdf的开源小插件.
其有.NET CORE版本的组件,DinkToPdf,但该控件对跨平台支持有限。
故打算在Linux上安装相关插件直接调用.

准备工作

虚拟机: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

Dockerfile

# 微软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"]

生成测试类

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程序。则得到如此结果。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/887100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】链表常见题目-ToDone

文章目录 合并两个有序链表反转链表链表内指定区间反转复制带随机指针的链表环形链表环形链表II相交链表移除链表元素链表中倒数第k个节点链表分割链表的回文结构链表的中间节点旋转链表链表排序链表求和 (逆序求)链表求和II (正序求)重排链表链表的奇偶重排奇偶链表反转链表II…

V2X——行动胜于概念

摘要: 本文从信号灯服务入手,简单介绍了车路协同工程化落地过程中的一些关键问题和解决方案,包括设备接入、V2X消息层编解码、C-V2X通信,车端消费以及车路协同安全防护等,类似的问题还有很多,需要从业者做…

打开vim的语法高亮

在一个Ubuntu中自带的vim版本是8.2.4919,默认就是开始了语法高亮的,打开一个Java文件效果如下: 它不仅仅对Java文件有语法高亮,对很多的文件都有,比如vim的配置文件也有语法高亮,有语法高亮时读起来会容易…

re学习(33)攻防世界-secret-galaxy-300(动态调试)

下载压缩包: 下载链接:https://adworld.xctf.org.cn/challenges/list 参考文章:攻防世界逆向高手题之secret-galaxy-300_沐一 林的博客-CSDN博客 发现这只是三个同一类型文件的三个不同版本而已,一个windows32位exe&#xff0…

Webpack node、output.jsonpFunction 配置详解

Webpack node、output.jsonpFunction 配置详解 最近尝试给一些用到 webpack 的项目升级到最新 webpack5 版本,其中遇到了一些问题,我挑了两个比较典型的问题,其中主要涉及到了 webpack 的 node 属性跟 output.jsonpFunction (web…

opencv图像轮廓检测

效果展示: 代码部分: import cv2 import numpy as np img cv2.imread(C:/Users/ibe/Desktop/picture.PNG,cv2.IMREAD_UNCHANGED) # 类型转换 img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 结构元 kernel cv2.getStructuringElement(cv2.MORPH_REC…

【网络架构】华为hw交换机网络高可用网络架构拓扑图以及配置

一、网络拓扑 1.网络架构 核心层:接入网络----路由器 汇聚层:vlan间通信 创建vlan ---什么是vlan:虚拟局域网,在大型平面网络中,为了实现广播控制引入了vlan,可以根据功能或者部门等创建vlan,再把相关的端口加入到vlan.为了实现不用交换机上的相同vlan通信,需要配置中继,为了…

考公-判断推理-逻辑判断-削弱类

否定论点,根本排除 例题 例题 例题 例题 例题 例题 变化小,胖了瘦了 例题 例题 拆桥 例题 例题 例题 例题 例题 例题 例题 例题 例题 A类比非常弱 D削弱了论据 例题 因果倒置例题 例题 例题

css学习2(利用id与class修改元素)

1、id选择器可以为标有特定id的html元素指定特定的样式。 2、选择器以#开头,后跟某id的属性值。 3、class选择器用于描述一组元素的样式,class可以在多个元素使用。 4、类选择器用.选择。 5、指定特定的元素使用class。 6、元素的多个类用空格分开&…

python测试 unittest 实践要点

目录 命名篇 命令行篇 测试断言篇 常见测试断言 特殊测试断言 测试前后篇 在每个测试方法前后执行 在每个测试类的所有方法前后执行 不运行测试篇 参考 命名篇 测试模块应以 test_开头 测试类应以Test开头或结尾 测试类中的测试方法应该以test_开头 命令行篇 测…

第二章 Linux系统-系统接口管理

第二章 Linux系统-系统接口管理 ​ 操作系统接口时架构在硬件上的第一层软件,时计算机底层硬件和用户之间的接口,利用操作系统才能使用应用程序(或用户)对系统硬件的访问。任何操作系统都会想上层提供接口,操作系统接…

应用层自定义协议(组织数据的格式)

概念 在进行网络传输数据的时候,通常是将要传输的数据组织成一个字符串,再将字符串转换为一个字节流进行网络传输数据,而数据组织的格式是多种多样的,我们只需要保证,客户端和服务器对于字符串的组织和解析统一即可 现…

使用mysql、java开发的平台软件一键安装

前言 一般web项目会使用mysql数据库、java开发应用程序打包成jar包。 有些项目会需要导入初始化的行政区域信息。 流程图 说明 1. 脚本中提供变量去配置当前项目的区域 2. 安装包里需要包含全国所有的区域信息 3. 运行程序的时候就可以根据配置 ,调用接口&am…

Linux fork 和 exec 联合使用创建一个全新的进程

复制和替换结合在一起(forkexec)是产生一个新进程的主要方式。 将复制和替换结合在一起(forkexec): 先fork,使系统中多出一个进程,默认情况下,fork之后,父进程和子进程的…

爬虫逆向实战(十四)--某培训平台登录

一、数据接口分析 主页地址:某培训平台 1、抓包 通过抓包可以发现登录是表单提交到j_spring_security_check 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有一个j_password加密参数 请求头是否加密? 无响应是…

【bug】Unity无法创建项目

bug UnityHub无法创建项目 UnityHub无法创建项目 出现的问题:在创建新项目时弹出来一个 无法创建项目 尝试的方法: 刷新许可证 ❌没用退出账号重新登陆 ❌没用重启电脑 ❌没用 最后发现是什么问题呢? 2021.3.3这个版本我之前在资源管理器中…

mysql binlog 回滚

mysqlbinlog 严格来说mysqlbinlog 不能算回滚,他只是将过去的数据修改记录 重新执行一遍,但是从结果上来看,他也算把数据恢复到任意时间点了,举例来说在昨天的某一刻误删除了一条数据,导致其他数据存储都是异常&#…

C++Qt动态增加垂直滚动条

本博文源于笔者正在工作的一个小内容,内容涉及到为qt动态增加垂直滚动条。文章分为三个部分,问题起源,问题解决方案,问题解决成功效果。思路清晰,文章干货满满,复制源码即可使用。 问题起源 qt中一个页面…

0143 串

目录 4.串 4.1串的定义和实现 4.2串的模式匹配 部分习题 4.串 4.1串的定义和实现 4.2串的模式匹配 部分习题 1.设有两个串S1和S2,求S2在S1中首次出现的位置的运算称为() A.求字串 B.判断是否相等 C.模式匹配 D.连…

7-10 奇偶分家

分数 10 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定N个正整数,请统计奇数和偶数各有多少个? 输入格式: 输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。 输…