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

# 微软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/lib64CMD ["/bin/bash"]

生成镜像类
shell

docker build -t wkhtml:2023 .

docker-compose.yml

version: "3.0" #  模板的版本
networks:core-net:#  网络driver: bridge
services:test:networks:core-net:aliases:- testimage: wkhtml:2023volumes:- ./test:/appcommand: dotnet ConsoleApp.dll

生成测试类

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

version: "3.0" #  模板的版本
networks:core-net:#  网络driver: bridge
services:test:networks:core-net:aliases:- testimage: wkhtml:2023volumes:- ./fonts:/usr/share/fontscommand: dotnet ConsoleApp.dll

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis数据结构——快速列表quicklist、快表

定义 Redis中的数据结构,链表和压缩列表这两种数据结构是列表对象的底层实现方式。 当时考虑到链表的附加空间太大,节点的内存都是单独分配的,还会导致内存碎片化问题严重。 因此从Redis3.2开始,对列表的底层数据结构进行了改造&…

【数据结构OJ题】用栈实现队列

原题链接:https://leetcode.cn/problems/implement-queue-using-stacks/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作。 出队操作: 当出队的栈…

Android JNI系列详解之JNI、NDK环境搭建和编译工具安装

本文主要介绍JNI、NDK环境变量的搭建,以及CMake工具的安装和ndk-build工具的安装。 一、JNI环境 JNI属于Java中的一部分,所以只需要搭建Java环境就有了JNI的环境,安装Java的环境可以网上查找教程,很多的安装JDK的博客。我电脑是安…

人脸老化预测(Python)

本次项目的文件 main.py主程序如下 导入必要的库和模块: 导入 TensorFlow 库以及自定义的 FaceAging 模块。导入操作系统库和参数解析库。 定义 str2bool 函数: 自定义函数用于将字符串转换为布尔值。 创建命令行参数解析器: 使用 argparse.A…

6种方法Word中的页眉横线如何删除

01 如何给Word添加页眉? 方法1: 打开Word文档,将鼠标放在Word顶部,双击鼠标,就可以进入页眉编辑状态,这时候,直接添加页眉内容就好了。 方法2: 在Word文档顶部菜单栏点击【插入】…

PostgreSQL空值的判断

PostgreSQL空值的判断 空值判断非空判断总结 空值判断 -- 查询为空的 is null,sql简写isnull select * from employees where manager_id isnull;select * from employees where manager_id is null;非空判断 -- 查询不为空的 is not null;sql简写notnull select * from empl…

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022.

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022&…

设计模式——里氏替换原则

文章目录 里氏替换原则OO 中的继承性的思考和说明基本介绍一个程序引出的问题和思考解决方法 里氏替换原则 OO 中的继承性的思考和说明 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的…

【JavaSE】面向对象之多态

文章目录 多态的概念多态实现条件重写向上转型和向下转型向上转型向下转型 避免在构造方法中调用重写的方法 多态的概念 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 多态实现条件 必须要…

微服务中间件--Nacos

Nacos 1. Nacos入门a.服务注册到Nacosb.Nacos服务分级存储模型c.NacosRule负载均衡d.服务实例的权重设置e.环境隔离 - namespacef.Nacos和Eureka的对比 2. Nacos配置管理a.统一配置管理b.配置热更新c.多环境配置共享 1. Nacos入门 Nacos是阿里巴巴的产品,现在是Spr…

3D与沉浸式技术,如何助力企业数字化转型?

说起3D,估计许多读者朋友会在第一时间想起《阿凡达》系列和《侏罗纪公园》系列电影大作。每一帧细节纤毫毕现的逼真画面,让观众几乎分不清虚拟与现实,完全沉浸在导演打造的视觉盛宴中。 事实上,除了大家所熟知的3D影视动画之外&am…

Linux Shell如果ping失败就重启网卡(详解)

直接上脚本 -------------------------------------------------------------------------- #vi /tmp/ping_check.sh #!/bin/bash IP="1.1.1.1" PacketLoss=`ping -c 4 -w 4 1.1.1.1 | grep packet loss | awk -F packet loss {print $1} | awk {print $NF}|se…

回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基…

零基础如何学习 Web 安全,如何让普通人快速入门网络安全?

前言 网络安全现在是朝阳行业,缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 【一一帮助安全学习(网络安全面试题学习路线视频教程工具)一一】 初级的现在有很多的运维人员转网络安全,初级…

leetcode做题笔记92. 反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 思路一&#xff1a;头插法 struct ListNode *reverseBetween(struct ListNode *h…

vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件

文章目录 ⭐前言⭐react 组件传值实例&#x1f496;父组件传值给子组件&#xff08;props&#xff09;&#x1f496;子组件传递事件给父组件props绑定事件&#x1f496;父组件触发子组件的事件Ref ⭐vue3 组件传值实例&#x1f496; 父组件传递数据给子组件props&#x1f496; …

神经网络改进:注重空间变化,权重参数调整,正则化, 熵的简单理解

目录 神经网络改进&#xff1a;注重空间变化 将高纬空间映射到地位空间便于表示&#xff08;供给数据&#xff09; 将地位空间映射到高纬空间进行分类聚合&#xff08;达到可分状态&#xff08;K-means&#xff09;&#xff09; 神经网络改进&#xff1a;权重参数调整 自注…

PHP自己的框架实现操作成功失败跳转(完善篇四)

1、实现效果&#xff0c;操作成功后失败成功自动跳转 2、创建操作成功失败跳转方法CrlBase.php /**成功后跳转*跳转地址$url* 跳转显示信息$msg* 等待时间$wait* 是否自动跳转$jump*/protected function ok($urlNULL,$msg操作成功,$wait3,$jump1){$code1;include KJ_CORE./tp…

excel 核心快捷键用法

1、wps怎样只复制公示计算出来的数据 1.1、按下快捷键“CtrlC”&#xff0c;复制该单元格。 1.2、按下快捷键“ShiftCtrlV”&#xff0c;即“粘贴为数值”&#xff0c;即可只复制数字而不复制该单元格的公式 1.3、wps怎样只复制公示计算出来的数据_百度知道https://zhidao.baid…

C++ 的关键字(保留字)完整介绍

1. asm asm (指令字符串)&#xff1a;允许在 C 程序中嵌入汇编代码。 2. auto auto&#xff08;自动&#xff0c;automatic&#xff09;是存储类型标识符&#xff0c;表明变量"自动"具有本地范围&#xff0c;块范围的变量声明&#xff08;如for循环体内的变量声明…