C#基于SkiaSharp实现印章管理(10)
向PDF文件插入印章图片比之前实现的向图片文件插入印章麻烦得多。
最初的想法是使用PDF浏览控件在线打开PDF文件,然后在控件中实现鼠标移动时动态显示印章,点击鼠标时向当前PDF页面的鼠标点击位置插入图片。由于是.net 8的Winform项目,选用PdfiumViewer模块的浏览控件打开并显示PDF文档,但是测试时发现无法触发控件的paint事件,也就难以实现印章图片随鼠标移动,同时虽然PdfiumViewer的扩展包Pdfium.Net.Free支持向PDF页面插入图片(参考文献4),但是同时安装PdfiumViewer、pdfium依赖包、Pdfium.Net.Free时打开PDF文件会报错,提示pdfium.dll文件版本出错,网上有解决办法,但比较麻烦,最终决定不用PDF浏览控件。
采用图片方式显示单页PDF文档,通过指定页码跳转到指定页面。采用iText7模块打开PDf文档、获取页码数量,同时安装ThomSoft.itext7.pdfimage包,支持将pdf文档的页面转换为图片,这样就类似于向图片盖印章的模式。iText7支持使用PdfCanvas向页面中绘制文本、形状、图片等,但是实际测试过程中使用PdfCanvas向已有内容的页面中绘制图片时遇到各种报错,最终也没有成功,百度出来的示例代码都是新建页面,然后向页面中从零开始绘制文本、形状、图片等元素,没有找到需要的代码。
itextsharp模块可以向pdf文件中插入图片,但是itextsharp模块用于.net framework项目,无法用于.net 8项目。
最终选用PdfSharpCore模块向PDF页面插入图片,使用比较简单,主要代码如下所示:
PdfSharpCore.Pdf.PdfDocument doc =PdfSharpCore.Pdf.IO.PdfReader.Open(pnlPdf.Tag.ToString(), PdfDocumentOpenMode.Modify);
XImage background = XImage.FromFile(comboSeal.Text);
PdfSharpCore.Pdf.PdfPage page = doc.Pages[Convert.ToInt32(nudPage.Value)-1];
XGraphics gfx = XGraphics.FromPdfPage(page, XGraphicsUnit.Point);XRect rect = new XRect(page.Width*(e.X - m_startX) / (m_scale*m_srcImageBmp.Width),page.Height * (e.Y - m_startY) / (m_scale * m_srcImageBmp.Height),page.Width*background.PixelWidth/m_srcImageBmp.Width,page.Height * background.PixelHeight / m_srcImageBmp.Height);//写入指定位置
gfx.DrawImage(background, rect);
doc.Save("test2022.pdf");
测试过程中遇到的问题是PdfSharpCore模块将PDF页面导出图片很麻烦,因此还是采用iText7及ThomSoft.itext7.pdfimage包打开PDF文件并将指定页面转换为图片后在窗口中显示。鼠标点击控件盖章时计算鼠标在当前页面位置,然后用PdfSharpCore模块打开PDF文档、获取当前页面对象,绘制印章图片。但是itext7生成的图片尺寸和PdfSharpCore模块的页面尺寸不一致,导致根据鼠标点击位置计算印章图片的插入位置及尺寸时始终不对,最后没有太好的办法,只能计算印章图片与窗口图片的相对位置及尺寸,再根据PdfSharpCore模块打开的页面尺寸计算在页面中的位置及尺寸,结果勉强能用,但算不上所见即所得。后续还得继续调整程序。
下面是窗口截图及导出的pdf文档中插入图片的效果。


参考文献:
[1]https://learn.microsoft.com/zh-cn/dotnet/api/skiasharp?view=skiasharp-2.88
[2]https://www.cnblogs.com/sexintercourse/p/17010294.html
[3]https://github.com/ststeiger/PdfSharpCore/tree/master
[4]https://www.cnblogs.com/xiaohemiao/p/17997370
[5]https://blog.csdn.net/weixin_43918803/article/details/85344624
相关文章:
C#基于SkiaSharp实现印章管理(10)
向PDF文件插入印章图片比之前实现的向图片文件插入印章麻烦得多。 最初的想法是使用PDF浏览控件在线打开PDF文件,然后在控件中实现鼠标移动时动态显示印章,点击鼠标时向当前PDF页面的鼠标点击位置插入图片。由于是.net 8的Winform项目,选…...
通过栈实现字符串中查找是否有指定字符串的存在
题目示例: 分析 由与没有给出字符串的长度,所以只能通过getline一次性处理,而在输入后恰好能倒序处理字符串,以标点符号为分界点,将数字当成字符放到栈里,遇到下一个标点符号时执行查找操作,…...
MongoDB伪分布式部署(mac M2)
1. 序言 本博客是上一博客的进阶版:mac M2安装单机版 MongoDB 7.x,上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB,实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集? …...
Golang | Leetcode Golang题解之第454题四数相加II
题目: 题解: func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }...
[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷
在数字艺术和创意领域,[ComfyUI]Flux以其独特的虚实结合技术,已经成为艺术家和设计师们手中的利器。今天,我们激动地宣布,[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品,经典中文元素通过AI技术重现,包…...
Linux 系统 nvm 管理node无法使用
文章目录 一、报错说明二、报错原因三、解决办法四、验证 一、报错说明 centos7服务器使用nvm安装的node之后,只要使用npm或者node,均会出现以下问题。 npm -v node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by node) node: /lib64…...
信号处理快速傅里叶变换(FFT)的学习
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来&am…...
vue3项目el-table表格行内编辑加输入框校验
核心点 1. el-form的model属性需要跟el-form-item的prop要对应 2. el-form的model属性绑定tableData 3. el-form-item的prop绑定字符串:scope.index.列名(注意有个点) 4. el-form-item需要单独设置rules属性 代码示例 <el-form :mod…...
【Node.js】内置模块FileSystem的保姆级入门讲解
作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:Vscode 本文代码都经由博主PleaSure乐事实操后得出,可以放心使用。 1.FileSystem介绍 Node.js 的 fs(filesystem)模块是一个核心模块,…...
问:LINUXWINDOWS线程CPU时间如何排序?
Linux 在Linux上,你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式,-e选项表示显示所有进程,--sort选项用于排序。 ps -e -o pid,tid,comm,…...
postgresql-重复执行相同语句,试试 prepare!
文章目录 每次你向 PostgreSQL 发送 SQL 语句时,数据库都必须对其进行解析(parse)。解析虽然很快,但如果同样的语句被解析一千次,这种操作累积起来可能会占用大量时间,而这些时间本可以用于处理其他事务。为避免这种情况ÿ…...
wpf加载带材料的3D模型(下载的3D预览一样有纹理)
背景:最近真的是忙啊,累出汁水了 整体效果: 放大可以看清砖头: 1、需要自己准备好3D模型,比如我这里是下载的这里的3D Warehouse,下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…...
【k8s之深入理解调度】调度框架扩展点理解
参考自 K8s 调度框架设计与 scheduler plugins 开发部署示例(2024) 调度插件扩展点 等待调度阶段PreEnqueuePod 处于 ready for scheduling 的阶段。 内部工作原理:sig-scheduling/scheduler_queues.md。在 Pod 被放入调度队列之前执行的插…...
音视频基础理论
1. 音频基础 1.1 音频基本概念 1.1 频率:声波的频率,即声音的音调,人类听觉的频率(音调)范围为20Hz--20KHz 1.2 振幅:即声波的响度,通俗的讲就是声音的高低,一般男生的声音振幅(响度)大于女生。 1.3 波形…...
《江苏科技大学学报(自然科学版)》
《江苏科技大学学报(自然科学版)》(双月刊,国内外公开发行)是由江苏省教育厅主管、江苏科技大学主办的理工类学术期刊,1986年创刊,国际刊号:ISSN1673-4807,国内刊号&…...
C++初学者指南-5.标准库(第二部分)–随机数生成
C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值(“抛硬币”)正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…...
Unity2017在安卓下获取GPS位置时闪退的解决办法
在Unity使用低功耗蓝牙通信(BLE)需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。 解决办法:调用原生安卓接口。 参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin,在插件中提供获取GPS位…...
OpenGL ES 索引缓冲区(4)
OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区,索引缓冲区和顶点缓冲区类似,也是显存上的一段内存,只不过上面的数据用处不同,索引缓冲区故名思义里面的数据是用于索引,主要作用是用于复用顶点缓冲区里的数据。…...
01:(寄存器开发)点亮一个LED灯
寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板,教程来源B站up“嵌入式那些事”。…...
.Net 6.0 Windows平台如何判断当前电脑是否联网
最近在工作中开发需要判断当前电脑是否联网的需求,在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍: 1.方法一(调用winAPI) [DllImport("wininet")] public static extern bool InternetGetConnec…...
ASCII码表深度解析:从基础到扩展的全面指南
1. ASCII码的前世今生:计算机世界的通用语言 第一次接触ASCII码是在大学计算机基础课上,教授用"65A"这个简单公式瞬间点燃了我的好奇心。这个看似简单的编码系统,实际上是现代数字通信的基石。ASCII(American Standard …...
这家“冠军机器狗”企业广募人才 | 智身科技:邀你一起玩转具身智能
不止于工作,这是一场定义未来的邀约,一起奔赴具身智能的广阔未来。 01 我们是谁 智身科技成立于2023年,是一家专注于具身智能领域的高新技术企业。我们以自主研发为核心,构建了从核心部件、整机制造到场景化落地的全链条能力。 技…...
能源企业必看:人力资源系统选用友、北森,还是红海云?
能源企业的人力资源系统选型,往往不是比功能多不多,而是看能否扛住集团级组织复杂度、倒班工时与薪酬联动、强合规审计,以及对私有化与信创的要求。用友、北森、红海云是常被放在同一张桌面上对比的选择,但适配路径并不相同。下面…...
突破3大资源壁垒:UABEA工具实战指南
突破3大资源壁垒:UABEA工具实战指南 【免费下载链接】UABEA UABEA: 这是一个用于新版本Unity的C# Asset Bundle Extractor(资源包提取器),用于提取游戏中的资源。 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 当你…...
如何快速改善论文写作的语言能力?
对于许多非英语母语的科研工作者而言,从实验数据到最终发表,横亘在中间的最大障碍往往不是创新性不足,而是语言表达上的“无力感”。每当完成一篇心血之作,面对屏幕上的文字,内心总充满了自我怀疑:这句话的…...
虚拟机异常断电后卡在initramfs阶段?手把手教你用xfs_repair修复系统分区
1. 虚拟机异常断电的常见后果 最近在调试一个基于KVM的虚拟机集群时,遇到了一个典型问题:机房突然断电后,几台虚拟机重启时卡在了initramfs阶段,屏幕上不断刷出"generating /run/initramfs/rdsosreport.txt"的提示。这种…...
5个技巧让文件识别效率翻倍:Magika智能检测工具深度解析
5个技巧让文件识别效率翻倍:Magika智能检测工具深度解析 【免费下载链接】magika 项目地址: https://gitcode.com/GitHub_Trending/ma/magika 还在为文件类型识别烦恼吗?传统工具常常误判,而手动检查又太耗时。让我们一起探索Magika—…...
Win10 22H2多合一版本实测:家庭版/专业版/企业版到底有什么区别?
Win10 22H2多合一版本深度解析:如何根据需求选择最佳系统版本 当你面对一个包含家庭版、专业版、企业版等多个版本的Win10 22H2多合一ISO镜像时,是否曾感到困惑:这些版本之间究竟有什么区别?哪个版本最适合我的使用场景࿱…...
如何高效管理微信读书笔记:终极免费工具wereader完全指南
如何高效管理微信读书笔记:终极免费工具wereader完全指南 【免费下载链接】wereader 一个功能全面的微信读书笔记助手 wereader 项目地址: https://gitcode.com/gh_mirrors/we/wereader 微信读书助手wereader是一款专为微信读书用户设计的免费开源工具&#…...
K型热电偶的5个常见设计坑:从运放选型到单片机ADC采样的避坑指南
K型热电偶的5个常见设计坑:从运放选型到单片机ADC采样的避坑指南 在工业测温领域,K型热电偶凭借其宽温区、高性价比和良好的线性度,成为工程师们的首选传感器之一。然而,许多初入行业的硬件工程师在实际应用中常常踩入一些"…...
