当前位置: 首页 > news >正文

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绑定字符串&#xff1a;scope.index.列名&#xff08;注意有个点&#xff09; 4. el-form-item需要单独设置rules属性 代码示例 <el-form :mod…...

【Node.js】内置模块FileSystem的保姆级入门讲解

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Vscode 本文代码都经由博主PleaSure乐事实操后得出&#xff0c;可以放心使用。 1.FileSystem介绍 Node.js 的 fs&#xff08;filesystem&#xff09;模块是一个核心模块&#xff0c…...

问:LINUXWINDOWS线程CPU时间如何排序?

Linux 在Linux上&#xff0c;你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式&#xff0c;-e选项表示显示所有进程&#xff0c;--sort选项用于排序。 ps -e -o pid,tid,comm,…...

postgresql-重复执行相同语句,试试 prepare!

文章目录 每次你向 PostgreSQL 发送 SQL 语句时&#xff0c;数据库都必须对其进行解析(parse)。解析虽然很快&#xff0c;但如果同样的语句被解析一千次&#xff0c;这种操作累积起来可能会占用大量时间&#xff0c;而这些时间本可以用于处理其他事务。为避免这种情况&#xff…...

wpf加载带材料的3D模型(下载的3D预览一样有纹理)

背景&#xff1a;最近真的是忙啊&#xff0c;累出汁水了 整体效果&#xff1a; 放大可以看清砖头&#xff1a; 1、需要自己准备好3D模型&#xff0c;比如我这里是下载的这里的3D Warehouse&#xff0c;下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…...

【k8s之深入理解调度】调度框架扩展点理解

参考自 K8s 调度框架设计与 scheduler plugins 开发部署示例&#xff08;2024&#xff09; 调度插件扩展点 等待调度阶段PreEnqueuePod 处于 ready for scheduling 的阶段。 内部工作原理&#xff1a;sig-scheduling/scheduler_queues.md。在 Pod 被放入调度队列之前执行的插…...

音视频基础理论

1. 音频基础 1.1 音频基本概念 1.1 频率&#xff1a;声波的频率&#xff0c;即声音的音调&#xff0c;人类听觉的频率(音调)范围为20Hz--20KHz 1.2 振幅&#xff1a;即声波的响度&#xff0c;通俗的讲就是声音的高低&#xff0c;一般男生的声音振幅(响度)大于女生。 1.3 波形…...

《江苏科技大学学报(自然科学版)》

《江苏科技大学学报&#xff08;自然科学版&#xff09;》&#xff08;双月刊&#xff0c;国内外公开发行&#xff09;是由江苏省教育厅主管、江苏科技大学主办的理工类学术期刊&#xff0c;1986年创刊&#xff0c;国际刊号&#xff1a;ISSN1673-4807&#xff0c;国内刊号&…...

C++初学者指南-5.标准库(第二部分)–随机数生成

C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值&#xff08;“抛硬币”&#xff09;正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…...

Unity2017在安卓下获取GPS位置时闪退的解决办法

在Unity使用低功耗蓝牙通信&#xff08;BLE&#xff09;需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。 解决办法&#xff1a;调用原生安卓接口。 参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin&#xff0c;在插件中提供获取GPS位…...

OpenGL ES 索引缓冲区(4)

OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区&#xff0c;索引缓冲区和顶点缓冲区类似&#xff0c;也是显存上的一段内存&#xff0c;只不过上面的数据用处不同&#xff0c;索引缓冲区故名思义里面的数据是用于索引&#xff0c;主要作用是用于复用顶点缓冲区里的数据。…...

01:(寄存器开发)点亮一个LED灯

寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板&#xff0c;教程来源B站up“嵌入式那些事”。…...

.Net 6.0 Windows平台如何判断当前电脑是否联网

最近在工作中开发需要判断当前电脑是否联网的需求&#xff0c;在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍&#xff1a; 1.方法一&#xff08;调用winAPI&#xff09; [DllImport("wininet")] public static extern bool InternetGetConnec…...

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用

Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序&#xff0c;并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…...

MacOS 终端执行安装 Brew

在配置新的 Mac 环境时&#xff0c;如果你发现终端中无法识别 brew 命令&#xff0c;可以按照以下步骤进行解决。 步骤 1&#xff1a;确保网络稳定 为了避免安装过程中出现中断&#xff0c;建议使用 Wi-Fi 或有线连接&#xff0c;不推荐使用移动网络。 步骤 2&#xff1a;打…...

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式&#xff0c;用于定义一种语言的文法&#xff0c;并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类&#xff0c;使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…...

51单片机应用开发(进阶)---数码管+按键+蜂鸣器(电磁炉显示模拟)

实现目标 1、加强数码管、按键的学习&#xff0c;实现数码显示变量数据&#xff08;四位数的显示&#xff09;&#xff1b; 2、4位数码2个按键无源蜂鸣器实现模拟电磁炉功率调节及显示&#xff1b; 一、内容描述 功能描述&#xff1a;1、开机显示电磁炉功率300&#xff0c;每…...

Emergency Stop (ES)

文章目录 1. 介绍2. Feature List3. 紧急停止信号触发方式3.1 Port触发紧急停止信号3.2 SMU事件触发紧急停止信号3.3 软件触发紧急停止信号 4. 应用场景4.1 Port4.2 MSC 1. 介绍 Emergency Stop (ES)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-…...

[C++][第三方库][gtest]详细讲解

目录 1.介绍2.安装3.使用1.头文件包含2.框架初始化接口3.调用测试样例4.TEST宏5.断言宏6.示例 1.介绍 gtest是一个跨平台的C单元测试框架&#xff0c;由Google公司发布gtest是为了在不同平台上为编写C单元测试而生成的&#xff0c;它提供了丰富的断言、致命和非致命判断、参数…...

【Java数据结构】 链表

【本节目标】 1. ArrayList 的缺陷 2. 链表 3. 链表相关 oj题目 一. ArrayList的缺陷 上节课已经熟悉了ArrayList 的使用&#xff0c;并且进行了简单模拟实现。通过源码知道&#xff0c; ArrayList 底层使用数组来存储元素&#xff1a; public class ArrayList<E>…...

前端——Ajax和jQuery

一、Ajax Ajax即“Asynchronous Javascript And XML”&#xff08;异步 JavaScript 和 XML&#xff09;&#xff0c; 通过 JS 异步的向服务器发送请 求并接收响应数据。 同步访问&#xff1a;当客户端向服务器发送请求时&#xff0c;服务器在处理的过程中&#xff0c;浏览器…...

C++-vector模拟实现

###vector底层相当于是数组&#xff0c;查看源码可以发现&#xff0c;这个类的私有成员变量是三个迭代器&#xff1b;在实现时迭代器就可以当作是vector里面的元素的指针类型&#xff1b; ###vector是一个类模板&#xff0c;实现时也应当按照这样的写法用一个模板去实现&#…...

Activity

69[toc] 1.启停活动页面 1.Activity启动和结束 从当前页面跳到新页面 startActivity(new Intent(this, ActFinishActivity.class));从当前页面返回上一个页面&#xff0c;相当于关闭当前页面 finish();2.Activity生命周期 官方描述生命周期 onCreate&#xff1a;创建活…...

网站建设综合实践 教材/网络营销的一般流程

Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism一、引言二、实现细节三、实验一、引言 本文通过估计锚框的离群度定义一个动态聚焦机制&#xff08;FM&#xff09; f(β)&#xff0c;β LIoULIoU\frac{L_{IoU}}{L_{IoU}}LIoU​LIoU​​。FM通过将小…...

wordpress api post/seo技术建站

写好了代码&#xff0c;交付给他人使用的时候&#xff0c;查看代码固然可以了解各类和函数的功能细节&#xff0c;但接口文档能更方便的查找和说明功能。所以&#xff0c;一价与代码同步的接口文档是很有必要的。sphinx可以根据python中的注释&#xff0c;自动的生成接口文档&a…...

山东平台网站建设价位/百度全网营销

原文地址&#xff1a; http://www.infoq.com/news/2012/03/websocket-windows 鉴于Windows 8客户预览版已经很好的支持WebSocket协议和WebSocket API asp.net 开发人员可以使用System.Web.Websockets类库来实现双向通信的功能 在windows 8客户预览版和Server beta版本中 IE10、…...

模拟黑客网站/济南seo整站优化厂家

一、题目描述 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 二、C语言代码 int firstUniqChar(char * s){int lenth strlen(s);int ret -1;int letters[26] {0}; // 统计字母出现次数的数…...

wordpress主题安装报错/百度认证营销顾问

DevExpress WPF v21.1高速下载 表达式概述 表达式是一个字符串&#xff0c;经过解析和处理后&#xff0c;会返回一个值。 表达式由列/字段名称、运算符、函数和常量组成。 请参阅以下表达式示例&#xff1a; “[Quantity] * [UnitPrice] * (1 - [BonusAmount])”“[FirstNam…...

php做的网站源代码在哪里/友情链接交换形式有哪些

在页面布局中&#xff0c;有两个非常常用的CSS属性。它们巧妙的控制着块级元素们之间的位置&#xff0c;灵活的让块级元素在一行内显示或者另起一行。说到这里&#xff0c;相信大家已经猜出来了&#xff0c;这两个属性就是控制块级元素浮动的属性。整个页面布局过程中&#xff…...