C# PDF附件生成

news2025/1/9 0:34:37

最近项目上需要生成行业某证件,查阅了一下,大体有两个思路可以实现

1.图片格式

2.PDF格式

使用图片格式,GDI+绘图的形式,GDI+绘图相关库资料比较多,难度也还好,问题是生成的证不是很好看,看上去别扭。最后还是决定用PDF格式生成

查阅了PDF生成相关资料,C#的相当相当少。已有的库,查阅到了包括 Aspose.PDF,QuestPDF,IText7

Aspose.PDF是商业版,需要授权,资料很少,尝试着写了一点,不是很好实现。

QuestPDF,查了以下资料,让人眼前一亮的写法,全部靠lambda表达式的方式操作,使用起来较容易上手

本地写完之后,放到IIS中,发现与IIS冲突,未查到解决资料。大体报的异常:

Unable to load library 'libSkiaSharp'

QuestPDF.Drawing.FontManager”的类型初始值设定项引发异常

只能放弃

因此,今天主要介绍iText7库的使用。

1.iText7 字体处理

默认的字体,除了显示不好看以外,还容易不显示中文。一直觉得字体是最简单,最常用的部分,应该类似 .setFont("宋体")的形式就可以实现,而pdf相关操作库中,字体处理都稍微麻烦。

FontProgram fontProgram =FontProgramFactory.CreateFont(fontpath);
PdfFont fontTitle = PdfFontFactory.CreateFont(fontProgram, PdfEncodings.IDENTITY_H);

fontTitle对象可以在后续的代码中直接使用。

说明:上面主要参数是 字体库的路径。此处需要注意,对于windows默认的字体,可以直接通过路径 “C:/windows/Fonts/simhei.ttf” 引用,对于非操作系统自带的字体,用户自己安装的字体,不能从 “C:/windows/Fonts"路径找到安装后的路径加载,通过windows路径加载,会产生如下错误:

System.IO.IOException:“C:\Windows\Fonts\方正大标宋简体.ttf not found as file or resource.

 需要使用下载的原字体文件(比如:“D:\TEMP\fonts\SourceHanSansCN-Medium-2.otf”)进行直接加载。

另外,windows/fonts中,除了包含 .ttf的字体,还包括 .ttc的字体,该类字体大体是一种集合的形式,具体加载代码如下:

PdfFont titleFont = PdfFontFactory.CreateFont(@"C:\Windows\Fonts\simsun.ttc,0",PdfEncodings.IDENTITY_H);

以上路径字符,第一个是字体路径,第二个数值,代表的应该是字体在集合中的索引。

2.页面设置

PdfWriter writer = new PdfWriter(@"D:\TEMP\nn.pdf");
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
pdf.SetDefaultPageSize(PageSize.A4.Rotate());

3.背景图片设置

//背景图片
PdfCanvas canvas = new PdfCanvas(pdf.AddNewPage());
canvas.AddImageFittedIntoRectangle(ImageDataFactory.Create(backgroundimg), PageSize.A4.Rotate(), false);

4.表格相关

Table table = new Table(UnitValue.CreatePercentArray(new float[] { 3,5,4f,5})).UseAllAvailableWidth();
table.SetMarginLeft(120);
table.SetMarginRight(100);
table.SetMarginTop(16);

第一行数组指代表格的列数,每列宽度所占比。Cell的SetWidth()方法测试无效(可能是我用法不对)

上述setMarginLeft之类的方法,与html中 margin类似

5.一个Paragraph中多个样式

Paragraph py = new Paragraph("2023").SetFont(fontTNR).SetFontSize(valFontSize);
Paragraph pyc = new Paragraph("年").SetFont(fontDX).SetFontSize(valFontSize);
Paragraph pm = new Paragraph("05").SetFont(fontTNR).SetFontSize(valFontSize);
Paragraph pmc = new Paragraph("月").SetFont(fontDX).SetFontSize(valFontSize);
Paragraph groupPP = new Paragraph();
groupPP.Add(py).Add(pyc).Add(pm).Add(pmc);

6.图片插入

var ii = QRAssister.GetQRCode("http://www.baidu.com", 100, 100);
            Image img = new Image(ImageDataFactory.Create(ii, System.Drawing.Color.Transparent));
            img.SetWidth(70);
            img.SetHeight(70);
            img.SetMarginTop(-85);
            img.SetMarginLeft(190);
            document.Add(img);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32学习笔记 -- ESP32-S3使用自定义分区表

什么是分区表? 分区表(Partition Table),主要是用来对ESP32-S3外挂的SPI FLASH进行区域划分的一个表格,通过这个表格,可以根据多个不同的功能,将SPI FLASH划分为不同的区域,方便开发者存储数据。 分区表主要有两种格式,一种是方便开发人员进行更改的.csv格式,一种是…

【Spring框架全系列】初识Spring MVC(上)

🌃哈喽,大家好,我是小浪。接着上篇博客,我们学习了springboot配置日志文件,到此,那么springboot的内容也更新的差不多了,由于是初学阶段,所以不学习那么深入,那么我们学习…

数据结构:单链表增、删、查、改的实现

1.概念 链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表 中的 指针链接 次序实现的 。 2.形式 我们使用链表一般都是创建一个结构体。 typedef int SLTDataType; typedef struct SListNode {SLTDataType data;struct SListN…

USB2.0 HUB的MTT与STT

HUB:集线器 以前呀,我也不清楚MTT与STT的区别,记得有一次选型的时候,很懵逼,结果还是按照以前同事的方案去选了,到后面想起来才抽空整明白了。 所以今天就来说下USB HUB里面的MTT与STT,并在文…

【GO】31. websocket实现

一. 引入gin、gorilla websocket包 go get github.com/gin-gonic/gin go get github.com/gorilla/websocket 二. 服务端代码 package mainimport ("bytes""fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""log&…

从字节出来的测试总监,让我们用这份《测试用例规范》,再也没加班过。

经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对编写测试用例感到困扰?例如: 固然,编写一份好的测试用例需要:充分的需求分析能力 理论及经验加持,作为测试职场摸爬打滚的老人&…

RobotStudio教程:ABB机器人TCP路径轨迹跟踪功能介绍与使用方法

目录 功能介绍 机器人工作站创建 TCP路径轨迹全局跟踪 基于事件管理器的TCP路径轨迹局部跟踪 基于Smart组件的TCP路径轨迹局部跟踪 仿真运行 功能介绍 干涉检查是虚拟仿真工作中非常重要的一个步骤,尤其是机器人工具与工件、工装夹具之间的碰撞干涉&#xff…

Java高阶数据结构 图的最短路径问题

图的最短路径问题! 文章目录 Java高阶数据结构 & 图的最短路径问题1. Dijkstra算法【单源最短路径】1.1 Dijkstra算法证明1.2 Dijkstra算法代码实现1.3 堆优化的Dijkstra算法1.4 堆优化Dijkstra算法代码实现 2. Bellman-Ford算法【单源最短路径】2.1 BF算法证明…

常见的基础模块电路,你都能看懂吗?

文章开始前,先来考考大家~ 下面的五副电路图,你能看懂几个? 目录 01.电源电路 02.运算放大器电路 03.信号产生电路 04.信号处理电路 05.传感器及其应用电路 06.显示电路 TDA2030电路图 34063电路图 555电路 TDA2030电路图 三极管分立元…

音视频八股文(11)-- ffmpeg 音频重采样

1重采样 1.1 什么是重采样 所谓的重采样,就是改变⾳频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样?当然是原有的⾳频参数不满⾜我们的需求,⽐如在FFmpeg解码⾳频…

从头开始学习Python接口自动化测试:编写测试用例,执行测试以及生成测试报告

Python接口自动化测试详解 随着Web服务和移动应用不断增多,以及对API和微服务的需求不断增加,API已成为现代应用程序中必不可少的组件。自动化测试框架可以大大简化API测试的过程,并确保其正确性和稳定性。Python是一种非常流行的编程语言&a…

洛谷B2100 同行列对角线的格

同行列对角线的格 题目描述 输入三个自然数 N N N, i i i, j j j( 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n, 1 ≤ j ≤ n 1 \le j \le n 1≤j≤n),输出在一个 N N N \times N NN 格的棋盘中(行…

西门子1200PLC如何在威纶通HMI上进行时间显示

先生成定时器DB,然后在引脚绑定变量,在西门子PLC中,DINT和TIME之间可以隐含转化。 第一种方法:触摸屏元件设置成DINT类型 数值元件资料格式为32-bit Signed,对应PLC中即为DINT类型。小数点以下没有位数。这是我们测试…

Android RecyclerView实现侧滑删除,附 Demo

距上次写博客有半年多了,回忆起来都觉得不可思议,中间也想憋俩大招,总是被耽误,这俩月忙完之后,终于空下来了,恰好新项目我和UI俩人商量一下,用MD来实现app。中间有个需求是RecyclerView中侧滑显…

ch06-Pytorch的正则化与归一化

ch06-Pytorch的正则化与归一化 0.引言1.weight decay 和 dropout1.1.Regularization1.2.Dropout 2.Normalization2.1.Batch Normalization2.2.Batch Normalization in PyTorch2.2.1.nn.BatchNorm1d()2.2.2.nn.BatchNorm2d()2.2.3.nn.BatchNorm3d() 2.3.其他常见的Normalization…

java servlet jsp 农产品价格信息搜集系统 python开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 jsp 农产品价格信息搜集系统 python是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助 系统采用 serlvetdaobean 模式开发 利用python 进行网站爬取 ,系统具有完整的源代码和数据库,系统主要采用B/S模式开…

Redis常见命令有哪些?怎么使用?

一、概述: 在了解Redis命令之前,我们要先了解Redis的数据结构,Redis是NoSQL数据库,采用了json存储模式,比MySQL等关系数据库更易于扩展,拥有丰富的数据类型,分基本类型与特殊类型。基本类型包括…

【Linux】网络---->套接字编程(TCP)

套接字编程TCP TCP的编程流程TCP的接口TCP的代码(单线程、多进程、多线程代码)单线程多进程多线程 TCP的编程流程 TCP的编程流程:大致可以分为五个过程,分别是准备过程、连接建立过程、获取新连接过程、消息收发过程和断开过程。 …

【youcans的深度学习 07】PyTorch入门教程:张量的基本操作 2

欢迎关注『youcans的深度学习』系列,持续更新中… 【youcans的深度学习 01】安装环境之 miniconda 【youcans的深度学习 02】PyTorch CPU版本安装与环境配置 【youcans的深度学习 03】PyTorch CPU版本安装与环境配置 【youcans的深度学习 04】PyTorch入门教程&#…

面向对象程序设计概述

🧑‍💻CSDN主页:夏志121的主页 📋专栏地址:Java核心技术专栏 目录 一、类 二、对象 三、识别类 四、类之间的关系 面向对象程序设计(Object-Oriented Programming,OOP)是当今的主流程序设计范型&#x…