.net core-利用PdfSharpCore和SkiaSharp.QrCode 添加PDF二维码页眉
前序
由于去年的一个项目需要在PDF 添加公司二维码 ,当时在网上找了很多操作PDF方案,第一种Aspose.PDF,很遗憾 Aspose.PDF 有添加版权的背景还是页脚我忘记了,不适合公司项目,最终放弃此方案。第二种FreeSpire.PDF,很遗憾Free有限制放弃了,第三种选择OpenXml 自己去摸索太复杂放弃,最后选择了PdfSharpCore. 二维码选择的方案QRCoder,当时项目采用的.net core 3.1 ,目前项目升级到net 6.0 遇到问题,QRCoder依赖System.Drawing.Imaging,但是微软放弃 System.Drawing.Imaging,推荐使用SkiaSharp。
1.导入negut 包

2.生成二维码
生成二维码的高度和宽度,可以进行调整,以适应PDF的页眉大小
using var generator = new QRCodeGenerator();
var qr = generator.CreateQrCode("XXX", ECCLevel.M);
var info = new SKImageInfo(250, 250);
using var surface = SKSurface.Create(info);
var canvas = surface.Canvas;
canvas.Render(qr, info.Width, info.Height);
3. 用PdfSharpCore 打开 PDF文件
PdfSharpCore 有很多Open方法(支持PDF私有密码模式,读写模式)
PdfDocument doc = PdfReader.Open(@"a.pdf", PdfDocumentOpenMode.Modify);

4.写入二维码
循环PDF的每一页,增加PDF的页眉,再将二维码的流写入PDF中,页眉的高度请根据PDF进行调整.
using (SKImage image = surface.Snapshot())
{
PdfDocument doc = PdfReader.Open(@"a.pdf", PdfDocumentOpenMode.Modify);
using (SKData p = image.Encode(SKEncodedImageFormat.Png, 100))
{
using (MemoryStream stream = new MemoryStream())
{
p.SaveTo(stream);
float x = 90;
float y = 20;
stream.Position = 0;
XImage headerImage = XImage.FromStream(() => stream);
double width = headerImage.Size.Width / 7;
double height = headerImage.Size.Height / 7;
for (int i = 0; i < doc.Pages.Count; i++)
{
var renderer = XGraphics.FromPdfPage(doc.Pages[i]);
XSize pageSize = renderer.PageSize;
renderer.DrawImage(headerImage, x, y, width, height);
XPen pen = new XPen(XBrushes.Gray, 0.5f);
renderer.DrawLine(pen, x, y + height, pageSize.Width - x, y + height);
}
stream.Dispose();
stream.Close();
}
var filePath = $"b.pdf";
doc.Save(filePath);
}
}
例子是Hololens workshop 的PDF ,实现的如下,其实还可以加页码页脚这些,各位大佬可以研究一下进行分享。目前在博客园看到了另外一个QuestPDF 可以操作PDF.


docker 模式,需要在 dockerfile 中添加如下配置
RUN apt-get update && apt-get -y install libfontconfig1
如需要指定字体,请将字段文件进行拷贝(比如雅黑)
COPY /xx/xxx/SIMHEI.TTF /usr/share/fonts/SIMHEI.TTF
SkiaSharp.QrCode 参考:https://www.cnblogs.com/berkerdong/p/16779385.html
QuestPDF 参考:https://www.cnblogs.com/qpjlove/p/16181232.html
PdfSharpCore 更多参考: https://github.com/ststeiger/PdfSharpCore
.net core-利用PdfSharpCore和SkiaSharp.QrCode 添加PDF二维码页眉的更多相关文章
- 利用QrCode.Net生成二维码 asp.net mvc c#
利用QrCode.Net生成二维码 asp.net mvc c# 里面介绍了.net的方式及js的方式,还不错. 里面用到的qrcode.net的类库下载地址:https://qrcodenet.co ...
- QRCode.js生成二维码
QRCode的GitHub地址: https://github.com/KeeeX/qrcodejs 该版本解决了主版本(https://github.com/davidshimjs/qrcodejs ...
- jquery.qrcode.js 生成二维码并支持中文的方法
GitHub地址: https://github.com/jeromeetienne/jquery-qrcode <div class="QR"></div> ...
- qrcode.js生成二维码因字符串过长而报错
前端使用qrcode.js生成二维码的时候.有时候是会出现 qrcode length overflow (1632>1056) 目前使用的有效的解决办法是重新下载新版的qrcode.js 下载 ...
- 利用vcard和qrcode.js生成二维码导入联系人
vCard是一种容许交换个人信息的数据规范,vCard数据格式的标识符是VCARD,vCard数据格式行是: 类型 [;参数]:值,具体的介绍百度都有,我们可以通过vcard来进行通讯录的保存,名片的 ...
- C#利用QrCode.Net生成二维码(Qr码
http://www.cnblogs.com/Soar1991/archive/2012/03/30/2426115.html 现在网上很多应用都是用二维码来分享网址或者其它的信息.尤其在移动领域,二 ...
- C#利用QrCode.Net生成二维码(Qr码)
在网上很多应用都是用二维码来分享网址或者其它的信息.尤其在移动领域,二维码更是有很大的应用场景.因为项目的需要,需要在网站中增加一个生成二维码分析网址的功能,在谷歌大幅度抽筋的情况下无奈使用百度.百度 ...
- .net Core 调用微信Jsapi接口,H5解析二维码
项目里需要用到扫描二维码,自己实现,不会. 找到了两种解决方案: 通过reqrcode.js,这是一个前端解析二维码内容的js库.如果二维码比较清晰,用这种效果也不错 调用微信扫一扫功能,这种效果很好 ...
- C# 利用ZXing.Net来生成条形码和二维码
本文是利用ZXing.Net在WinForm中生成条形码,二维码的小例子,仅供学习分享使用,如有不足之处,还请指正. 什么是ZXing.Net? ZXing是一个开放源码的,用Java实现的多种格式的 ...
随机推荐
- java的stream让我灵光一现
说实话,我是一个到了退役也没有搞明白C++的istream和ostream的. 刚开始的时候我把<iostream>直接拆解成ios和tream 真,果粉暴露 退役之后划水,倒是从java ...
- 腾讯云服务器安装rabbitmq及简单测试记录
一.安装 近期对消息队列的学习让我对消息中间件产生了兴趣,而作为消息队列的使用的rabbitmq,就是我学习中间件的第一步. rabbitmq和erlang的安装 安装之前先检查环境: [root@V ...
- Docker与GU 安装管理配置
Linux 下的 Docker 安装与使用 一.安装与配置 1.安装依赖包 1 sudo yum install -y yum-utils device-mapper-persistent-data ...
- java学习第五天异常机制.day14
异常处理机制 确保程序的正常执行.这种机制称为异常处理机制 异常对象 常用方法 方法介绍 toString 返回异常类型和异常信息 getMessage 返回异常信息 printStackTrace ...
- jsp获取下拉框组件的值
jsp获取下拉框组件的值 1.首先,写一个带有下拉框的前台页 1 <%@ page language="java" contentType="text/html; ...
- HCNP Routing&Switching之MAC安全
前文我们了解了GRE over IPSec 相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16601491.html:今天我们来聊一聊mac安全相关话 ...
- 因势而变,因时而动,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang泛型(generic)的使用EP15
事实上,泛型才是Go lang1.18最具特色的所在,但为什么我们一定要拖到后面才去探讨泛型?类比的话,我们可以想象一下给小学一年级的学生讲王勃的千古名篇<滕王阁序>,小学生有多大的概率可 ...
- 面试突击79:Bean 作用域是啥?它有几种类型?
Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看. PS:Java ...
- CodeForces - 1625C
Problem - 1625C - Codeforces 题意: 一条马路,有n个限速牌,表示的是从这个限速牌开始到下一个限速牌或者到马路尾的这段距离的速度,你可以拆除其中k个限速牌,问最少的时间是多 ...
- Html飞机大战(一):绘制动态背景
好家伙,飞机大战终于开始弄了 这会有很多很多复杂的东西,但是我们总要从最简单,和最基础的部分开始, 我们先从背景开始弄吧! 1.绘制静态背景 这里我们会用到canvas <!DOCTYPE ...