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

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


http://www.kler.cn/news/325597.html

相关文章:

  • 【Linux的内存管理】
  • zy81_C#中在窗体中实现坐标变换
  • 基于SSM的“银发在线教育云平台”的设计与实现(源码+数据库+文档)
  • Race Karts Pack 全管线 卡丁车赛车模型素材
  • CSS 中的@media print 是干什么用的?
  • Spark_UDF处理缺失值或空值
  • node实现大文件切片上传的方法
  • R整理数据技巧
  • 解决sortablejs+el-table表格内限制回撤和拖拽回撤失败问题
  • Redis string类型hash类型
  • 在pycharm中怎样调试HTML网页程序
  • B-树(不是B减树)原理剖析(1)
  • 有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?
  • Qt 学习第十一天:QTableWidget 的使用
  • 启动hadoop集群出现there is no HDFS_NAMENODE_USER defined.Aborting operation
  • 基于HTML、CSS和JavaScript的滚动数字显示效果,类似于老式计数器或电子表上的数字滚动效果
  • JAVA并发编程高级——JDK 新增的原子操作类 LongAdder
  • 渗透测试实战—教育攻防演练信息收集
  • Bugku 渗透测试1
  • 03. 前端面试题之ts : typescript 的数据类型有哪些?
  • LeetCode 热题 100 回顾2
  • 3种方法解决Docker容器中配置运行环境问题
  • 使用Python实现图形学的法线映射算法
  • 磁盘管理器
  • Qt网络编程——QUdpSocket
  • golang学习笔记24-文件操作
  • 实用好软-----电脑端 从视频中导出音频的方便工具
  • 微信小程序-数据模型与动态赋值
  • 女性向游戏的新战场:AI陪伴系统
  • CSS中的字体样式、文本样式、列表样式以及背景和渐变