c# 数据保存为PDF(一) (spire pdf篇)
文章目录
- 前言
- 了解 Spire
- 使用Spire.PDF
- 1 创建简单的PDF文档
- 2 创建带有格式的PDF文档(使用Draw)
- 头部信息
- 页眉
- 页脚
- 测试数据
- 完整的代码
- 3 创建带有格式的PDF文档(使用Gird)
- 小结
先上一个效果图
前言
项目中需要将一些数据转存为PDF ,打开时不会乱码也不可编辑,方便用户使用和查阅。
然后在网上找了一些资料,发现一个国产开发的组件那就是Spire,功能挺丰富的,可以保存为Excel、PDF、图片、PPT、二维码还带有邮件发送功能。
了解 Spire
该组件是由蓝冰科技制作的,官网在https://www.e-iceblue.cn/
在.NET、Java和Android不同平台下都有对应的语言组件支持,可谓是太强悍了。

有免费版本和收费的专业版本,当然牛人众多也有很多破解版。免费版有10页的页数限制,还有红色的水印。将PDF转为图片时仅支持转换前3页。
使用Spire.PDF
常用的类
PdfDocumentpdf文档对象
PdfPageBasepdf页
PdfPageTemplateElement页面模板 页眉页脚
PdfMargins页边距
PdfPaddings内边距
PdfGrid网格对象
PdfGridRow网格行
PdfTrueTypeFont设置字体
PdfPen设置画笔
PdfStringFormat格式化字符串
1 创建简单的PDF文档
//初始化一个PdfDocument实例
PdfDocument document = new PdfDocument();//设置边距
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
PdfMargins margins = new PdfMargins();
margins.Top = unitCvtr.ConvertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margins.Bottom = margins.Top;
margins.Left = unitCvtr.ConvertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margins.Right = margins.Left;//添加新页
PdfPageBase page = document.Pages.Add(PdfPageSize.A4, margins);//自定义PdfTrueTypeFont、PdfPen实例
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", 11f), true);
PdfPen pen = new PdfPen(Color.Black);//使用DrawString方法在指定位置写入文本
string text = "我的第一个C# PDF文档";
page.Canvas.DrawString(text, font,pen,100,50);//保存文档
document.SaveToFile("PDF创建.pdf");

2 创建带有格式的PDF文档(使用Draw)
确定要生成PDF文件的格式和样式,包含页眉, 页脚,中间是数据内容,内容是4列。
头部信息
主要是字体大小不一样,计算高度时要加上字体的高度

private static float CreateTitle(PdfDocument document, PdfMargins margins){//获取页面大小SizeF pageSize = document.PageSettings.Size;//声明 x y 两个float变量// float x = margins.Left;float x = 0;float y = 0;string Report = "Parameter Settings Report(Program)";string dataTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");PdfPageBase page = document.Pages[0];PdfTrueTypeFont Font = new PdfTrueTypeFont(new Font("微软雅黑", 15f, FontStyle.Bold), true);PdfStringFormat Format = new PdfStringFormat(PdfTextAlignment.Left);//在footerSpace中绘制线段PdfPen pen = new PdfPen(PdfBrushes.Black, 0.1f);page.Canvas.DrawString(Report, Font, PdfBrushes.Black, x, y, Format);SizeF size = Font.MeasureString(Report);Format.Alignment = PdfTextAlignment.Right;Font = new PdfTrueTypeFont(new Font("微软雅黑", 12f, FontStyle.Bold), true);SizeF sizeTime = Font.MeasureString(dataTime);RectangleF Bounds = new RectangleF(pageSize.Width - 2*sizeTime.Width, y, sizeTime.Width, sizeTime.Height);page.Canvas.DrawString(dataTime, Font, PdfBrushes.Black, Bounds, Format);y += 2 + size.Height ;page.Canvas.DrawLine(pen, x, y, pageSize.Width, y);Font = new PdfTrueTypeFont(new Font("微软雅黑", 12f, FontStyle.Bold), true);PdfTrueTypeFont Font2 = new PdfTrueTypeFont(new Font("微软雅黑", 11f, FontStyle.Regular), true);Format.Alignment = PdfTextAlignment.Left;y += 2 ;size = Font.MeasureString("Program");SizeF size2 = Font2.MeasureString("Drive Type/");float endY = y + size.Height + 2 + size2.Height;PdfPen penRe = new PdfPen(PdfBrushes.Gray, 0.1f);page.Canvas.DrawRectangle(penRe, PdfBrushes.LightCyan, new RectangleF(x, y, pageSize.Width, endY - y));page.Canvas.DrawString(" Program(Drive Selected / Connected)", Font, PdfBrushes.Black, x, y, Format);y += 2 + size.Height;page.Canvas.DrawString(" Drive Type/Model: ", Font2, PdfBrushes.Black, x, y, Format);y += 2 + size2.Height;page.Canvas.DrawLine(pen, x, y, pageSize.Width, y);y += 2;page.Canvas.DrawString("Projetc: p1", Font2, PdfBrushes.Black, x, y, Format);y += 2 + size2.Height;page.Canvas.DrawString("User: ", Font2, PdfBrushes.Black, x, y, Format);y += 2 + size2.Height;page.Canvas.DrawLine(pen, x, y, pageSize.Width , y);y += 2;page.Canvas.DrawString("Information ", Font2, PdfBrushes.Black, x, y, Format);y += 100;return y;}
页眉
页眉就是标题行了,包含这4列,还有字体、背景颜色的设置

/// <summary>/// 绘制页眉/// </summary>/// <param name="document"></param>/// <param name="page"></param>/// <param name="startY"></param>/// <returns></returns>private static float DrawPDFCodeTitle(PdfDocument document, PdfPageBase page, float startY ){SizeF docSize = document.PageSettings.Size;float x = 0;float y = startY;PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("微软雅黑", 9f, FontStyle.Bold));SizeF strSize = font.MeasureString("Default");//绘制背景色RectangleF rectangle = new RectangleF(0, startY, docSize.Width, strSize.Height * 2 + 5);page.Canvas.DrawRectangle(new PdfPen(PdfBrushes.DarkGray, 0.1f), PdfBrushes.LightCyan, rectangle);PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Bottom);y += strSize.Height + 2;page.Canvas.DrawString(" Parameter", font, PdfBrushes.Black, x, y);x += (float)(docSize.Width * 0.31);page.Canvas.DrawString("Value", font, PdfBrushes.Black, x, y);x += (float)(docSize.Width * 0.098);page.Canvas.DrawString("Infomation", font, PdfBrushes.Black, x, y);x += (float)(docSize.Width * 0.3);page.Canvas.DrawString("Setting", font, PdfBrushes.Black, x, y);page.Canvas.DrawString("Default", font, PdfBrushes.Black, x, y - strSize.Height- 1);return (startY + strSize.Height * 2 + 5);}
页脚
页脚一般放置公司或个人的特征信息,加上页码

/// <summary>/// 页脚/// </summary>/// <param name="document"></param>/// <param name="margins"></param>/// <returns></returns>private static PdfPageTemplateElement CreateFooterTemplate(PdfDocument document, PdfMargins margins){//获取页面大小SizeF pageSize = document.PageSettings.Size;//创建PdfPageTemplateElement对象 footer,即页脚模板PdfPageTemplateElement footerSpace = new PdfPageTemplateElement(pageSize.Width, margins.Bottom);footerSpace.Foreground = false;//声明 x y 两个float变量float x = margins.Left;float y = 0;//在footerSpace中绘制线段PdfPen pen = new PdfPen(PdfBrushes.Black, 1f);footerSpace.Graphics.DrawLine(pen, x, y, pageSize.Width - x, y);//在footerSpace中绘制文字y = y + 5;PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("微软雅黑", 10f, FontStyle.Bold), true);PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Left);String footerText = "Test for Windows(C) by 唠嗑一夏 Electric Corporation";footerSpace.Graphics.DrawString(footerText, font, PdfBrushes.Black, x, y, format);//在footerSpace中绘制当前页码和总页码数PdfPageNumberField number = new PdfPageNumberField();PdfPageCountField count = new PdfPageCountField();PdfCompositeField compositeField = new PdfCompositeField(font,PdfBrushes.Black, "{0}/{1}", number, count);compositeField.StringFormat = new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Top);SizeF size = font.MeasureString(compositeField.Text);compositeField.Bounds = new RectangleF(pageSize.Width - x - size.Width, y, size.Width, size.Height);compositeField.Draw(footerSpace.Graphics);//返回页脚footerSpacereturn footerSpace;}
测试数据
在这里创建了100个数据做测试使用。
/// <summary>/// 数据表格/// </summary>/// <returns></returns>private DataTable CreateData(){DataTable dt = new DataTable();DataColumn col1 = new DataColumn("Num", typeof(string));DataColumn col2 = new DataColumn("Name", typeof(string));DataColumn col3 = new DataColumn("Val", typeof(string));DataColumn col4 = new DataColumn("Des", typeof(string));DataColumn col5 = new DataColumn("Set", typeof(string));dt.Columns.Add(col1);dt.Columns.Add(col2);dt.Columns.Add(col3);dt.Columns.Add(col4);dt.Columns.Add(col5);Random random = new Random();List<string> nameList = new List<string>{"A", "BB", "CCC", "D","E", "F", "G","H","II","JJ", "LL", "M"};List<string> tempList = new List<string>{"dsd", "sdfdgvre", "Hello", "Gilrs","Today", "YYYY", "dfgre","GSD","fdgfer","Wesd", "DLG", "fsdahfi;o"};for(int i=0; i<10; i++){for(int j=0; j<10; j++){DataRow dr = dt.NewRow();dr[0] = "KK" + i.ToString("d2") + "." + j.ToString("d2");dr[1] = nameList[j];if ( j % 3 == 0){dr[2] = random.NextDouble().ToString("f3");}else{dr[2] = i * j - random.Next(0, 30);}dr[3] = tempList[j];dr[4] = random.NextDouble().ToString("f2");//添加新行dt.Rows.Add(dr);}}return dt;}
完整的代码
包含页眉、页脚、页边距、数据内容。这里主要通过Canvas.DrawString绘制所有数据。需要注意一点的是里面涉及了简单位置和高度的计算,绘制到什么时候可以换页继续绘制,关注点在document.PageSettings.Size的高度。
其中涉及的调用函数 SpireHelper.ActivateMemoryPatching(); 是为了去掉dll自带的红色警告字体。可以注释掉该行,不影响使用。也可以访问http://t.csdn.cn/k97kx 这篇文章里面有具体的代码。
/// <summary>/// 保存到Pdf/// </summary>/// <param name="path">文件路径</param>public void SaveToPdfByDraw(string path){//临时数据DataTable dataTable = CreateData();//去掉dll自带的红色警告字体SpireHelper.ActivateMemoryPatching();//初始化PdfDocument实例PdfDocument document = new PdfDocument();//禁用IncrementalUpdatedocument.FileInfo.IncrementalUpdate = false;//设置PDF文档的压缩级别document.CompressionLevel = PdfCompressionLevel.Best;//指定页面大小document.PageSettings.Size = PdfPageSize.A4;//设置页边距为0document.PageSettings.Margins = new PdfMargins(0, 40, 0, 0);//创建PdfMargins 对象,指定期望设置的页边距PdfMargins margins = new PdfMargins(40, 60, 40, 60);//在文档模板的顶部和顶部应用页脚模板document.Template.Bottom = CreateFooterTemplate(document, margins);//在文档模板的左右部分应用空白模板document.Template.Left = new PdfPageTemplateElement(margins.Left, document.PageSettings.Size.Height);document.Template.Right = new PdfPageTemplateElement(margins.Right, document.PageSettings.Size.Height);//自定义字体 和画笔PdfTrueTypeFont fontBold = new PdfTrueTypeFont(new Font("微软雅黑", 9f, FontStyle.Bold), true);PdfTrueTypeFont fontNormal = new PdfTrueTypeFont(new Font("微软雅黑", 9f, FontStyle.Regular), true);SizeF fontSize = fontBold.MeasureString("KK00.00");//添加数据到表格int count = dataTable.Rows.Count;string str = "";string strBak = "";int j = 0;float y = 0;SizeF docSize = document.PageSettings.Size;//在文档中添加页PdfPageBase page = document.Pages.Add();{//绘制项目表头float tempH = CreateTitle(document, margins);//绘制页眉表头y = DrawPDFCodeTitle(document, page, tempH + 5);y += 2;#region 全部for (int i = 0; i < count; i++){if ((y + fontSize.Height + 2) > (document.PageSettings.Height - margins.Bottom)){//换页page = document.Pages.Add();//绘制页眉表头y = DrawPDFCodeTitle(document, page, 0) + 1;}DataRow dataRow = dataTable.Rows[i];strBak = dataRow[0].ToString().Substring(0, 4);if (strBak != str){//绘制组str = strBak;string converStr = strBak;fontSize = fontBold.MeasureString(converStr);page.Canvas.DrawString(converStr, fontBold, PdfBrushes.Black, 0, y);y += fontSize.Height + 2;page.Canvas.DrawLine(new PdfPen(PdfBrushes.Black, 0.5f), 0, y, fontSize.Width, y);}else{//绘制内容y += 2;string tempStr = dataRow[0].ToString() + " " + dataRow[1].ToString();fontSize = fontNormal.MeasureString(tempStr);if ((y + fontSize.Height + 2) > (document.PageSettings.Height - margins.Bottom)){//换页page = document.Pages.Add();//绘制页眉表头y = DrawPDFCodeTitle(document, page, 0) + 1;}float widthX = 0;page.Canvas.DrawString(tempStr, fontNormal, PdfBrushes.Black, widthX, y);widthX += (float)(docSize.Width * 0.31);page.Canvas.DrawString(dataRow[2].ToString(), fontNormal, PdfBrushes.Black, widthX, y);widthX += (float)(docSize.Width * 0.098);page.Canvas.DrawString(dataRow[3].ToString(), fontNormal, PdfBrushes.Black, widthX, y);widthX += (float)(docSize.Width * 0.3);page.Canvas.DrawString(dataRow[4].ToString(), fontNormal, PdfBrushes.Black, widthX, y);y += fontSize.Height + 2;}}#endregion}//保存document.SaveToFile(path, Spire.Pdf.FileFormat.PDF);//打开创建的PDFSystem.Diagnostics.Process.Start(path);}
第一页的效果图

3 创建带有格式的PDF文档(使用Gird)
上一种方式是使用Draw绘制内容的,这里呢介绍另外一种相对简单的方式,使用Grid
的绘制。
/// <summary>/// 保存到Pdf/// </summary>/// <param name="path">文件路径</param>public void SaveToPdfByGrid(string path){//获取临时数据DataTable dataTable = CreateData();//去掉dll自带的红色警告字体SpireHelper.ActivateMemoryPatching();//初始化PdfDocument实例PdfDocument document = new PdfDocument();//禁用IncrementalUpdatedocument.FileInfo.IncrementalUpdate = false;//设置PDF文档的压缩级别document.CompressionLevel = PdfCompressionLevel.Best;//指定页面大小document.PageSettings.Size = PdfPageSize.A4;//设置页边距为0document.PageSettings.Margins = new PdfMargins(0, 60, 0, 0);//创建PdfMargins 对象,指定期望设置的页边距PdfMargins margins = new PdfMargins(40, 60, 40, 60);//在文档模板的顶部和顶部应用页眉页脚模板document.Template.Bottom = CreateFooterTemplate(document, margins);//在文档模板的左右部分应用空白模板document.Template.Left = new PdfPageTemplateElement(margins.Left, document.PageSettings.Size.Height);document.Template.Right = new PdfPageTemplateElement(margins.Right, document.PageSettings.Size.Height);//在文档中添加两页并写入文字PdfPageBase page = document.Pages.Add();float spaceH = CreateTitle(document, margins);//自定义字体 和画笔PdfPen pen = new PdfPen(Color.Transparent, 0.001f);pen.DashStyle = PdfDashStyle.None;PdfPen titlePen = new PdfPen(Color.Gray, 0.05f);pen.DashStyle = PdfDashStyle.Solid;PdfPen groupPen = new PdfPen(Color.Black, 0.1f);pen.DashStyle = PdfDashStyle.Solid;//创建PdfGrid类对象PdfGrid grid = new PdfGrid();//设置单元格填充grid.Style.CellPadding = new PdfPaddings(1, 1, 1, 1);//添加表格列数grid.Columns.Add(4);SizeF pageSize = document.PageSettings.Size;//设置列宽grid.Columns[0].Width = (float)(pageSize.Width * 0.35);grid.Columns[0].Width = (float)(pageSize.Width * 0.098); ;grid.Columns[0].Width = (float)(pageSize.Width * 0.42); ;grid.Columns[0].Width = (float)(pageSize.Width * 0.117); ;//添加表头行以及表格数据PdfGridRow[] pdfGridRows = grid.Headers.Add(1);for (int i = 0; i < pdfGridRows.Length; i++){//指定字体pdfGridRows[i].Style.Font = new PdfTrueTypeFont(new Font("微软雅黑", 12f, FontStyle.Bold), true);pdfGridRows[i].Cells[0].Value = " Parameter";pdfGridRows[i].Cells[1].Value = "Value";pdfGridRows[i].Cells[2].Value = "Infomation";pdfGridRows[i].Cells[3].Value = "Default\r\n Setting";pdfGridRows[i].Style.BackgroundBrush = PdfBrushes.LightCyan;pdfGridRows[i].Style.TextBrush = PdfBrushes.Black;pdfGridRows[i].Height = 40f;pdfGridRows[i].Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Bottom);pdfGridRows[i].Cells[1].StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Bottom);pdfGridRows[i].Cells[2].StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Bottom);pdfGridRows[i].Cells[3].StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Bottom);pdfGridRows[i].Cells[0].Style.Borders.All = titlePen;pdfGridRows[i].Cells[0].Style.Borders.Right = pen;pdfGridRows[i].Cells[1].Style.Borders.All = titlePen;pdfGridRows[i].Cells[1].Style.Borders.Right = pen;pdfGridRows[i].Cells[1].Style.Borders.Left = pen;pdfGridRows[i].Cells[2].Style.Borders.All = titlePen;pdfGridRows[i].Cells[2].Style.Borders.Right = pen;pdfGridRows[i].Cells[2].Style.Borders.Left = pen;pdfGridRows[i].Cells[3].Style.Borders.All = titlePen;pdfGridRows[i].Cells[3].Style.Borders.Left = pen;}//设置重复表头(表格跨页时)grid.RepeatHeader = true;//添加数据到表格int count = dataTable.Rows.Count;string str = "";string strBak = "";int j = 0;bool IsGroup = false;for (int i = 0; i < count; i++){PdfGridRow row = grid.Rows.Add();DataRow dataRow = dataTable.Rows[i];strBak = dataRow[0].ToString().Substring(0, 4);if (strBak != str){IsGroup = true;str = strBak;string converStr = strBak ;//写入row.Cells[0].Value = strBak ;j++;//指定字体row.Cells[0].Style.Font = new PdfTrueTypeFont(new Font("微软雅黑", 9f, FontStyle.Bold), true);row.Cells[0].Style.Borders.Bottom = groupPen;row.Cells[0].Style.Borders.Top = pen;row.Cells[0].Style.Borders.Left = pen;row.Cells[0].Style.Borders.Right = pen;}else{//指定字体row.Style.Font = new PdfTrueTypeFont(new Font("微软雅黑", 9f, FontStyle.Regular), true);row.Cells[0].Value = dataRow[0].ToString() + " " + dataRow[1].ToString(); row.Cells[1].Value = dataRow[2].ToString();row.Cells[2].Value = dataRow[3].ToString();row.Cells[3].Value = dataRow[4].ToString(); ;if (IsGroup){IsGroup = false;row.Cells[0].Style.Borders.Top = titlePen;row.Cells[0].Style.Borders.Bottom = pen;row.Cells[0].Style.Borders.Left = pen;row.Cells[0].Style.Borders.Right = pen;}else{row.Cells[0].Style.Borders.All = pen;}}row.Cells[1].Style.Borders.All = pen;row.Cells[2].Style.Borders.All = pen;row.Cells[3].Style.Borders.All = pen;}//在pdf页面绘制表格grid.Draw(page, new PointF(0, spaceH + 20));//保存文档document.SaveToFile(path);//打开PDFSystem.Diagnostics.Process.Start(path);}

小结
1、关于该组件的红色警告字体可以参考文章:http://t.csdn.cn/k97kx
2、使用PdfGrid放置内容会比较方便,简单,但格式花样就没有那么多。
3、使用 PdfPageBase.Canvas.Draw函数类,可以自由自定义绘制格式,就是需要计算高度和宽度,相对复杂一点。
相关文章:
c# 数据保存为PDF(一) (spire pdf篇)
文章目录 前言了解 Spire使用Spire.PDF1 创建简单的PDF文档2 创建带有格式的PDF文档(使用Draw)头部信息页眉页脚测试数据完整的代码 3 创建带有格式的PDF文档(使用Gird)小结 先上一个效果图 前言 项目中需要将一些数据转存为PDF …...
Stable Diffusion使用方法
SD的本地安装教程有很多我就不重复了,这里主要是记录我在使用SD Webui的过程中遇到的问题,总结的一些提升出图效率,出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 ? Ok,以上只是一小部分成品 ,属…...
高性能:负载均衡
目录 什么是负载均衡 负载均衡分类 服务端负载均衡 服务端负载均衡——软硬件分类 服务端负载均衡——OSI模型分类 客户端负载均衡 负载均衡常见算法 七层负载均衡做法 DNS解析 反向代理 什么是负载均衡 将用户请求分摊(分流) 到不同的服务器上…...
Matplotlib 安装介绍
文章目录 安装步骤 Matplotlib 不止是一个数学绘图库,它也是可视化和分析工具中最流行之一。我们可用其制作简单的图表,如折线图和散点图。 安装步骤 先进入:python官网 跳转到界面: 录入并搜索 下载之前,看一下自…...
DNS:关于 DNS 基本概念的一些笔记整理
写在前面 分享一些 DNS 的笔记整理博文内容涉及: DNS 历史介绍DNS 解析顺序DNS 基本概念资源类型介绍DNS 安全 理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺…...
机器人学一些知识
机器人动力学模型是用数学方法描述机器人运动和力学特性的模型。它包含机器人的几何结构、质量、惯性、摩擦等物理特性,以及机器人的控制系统和传感器等。机器人动力学模型可以用于机器人的运动规划、控制算法设计、仿真和优化等应用中。 机器人动力学模型通常采用…...
应用,auto,内联函数
6.引用: //指针 int main() {int a 0;int& b a;int& c b;int& d c;cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;b;d;cout << a <<…...
Flask框架的学习---01
1.工程搭建: (1) 安装flask: pip3 install flask (2)命令行: (1)终端运行:flask run (2)绑定IP地址和端口:Flask run -h 127.0.0.1 -p 8083 修改端口号 (3࿰…...
免费gpt-4-国内使用gpt-4
如何用上gpt-4 GPT-4尚未正式发布和公开,因此我们无法提供对GPT-4的具体使用方法。但是,可以从GPT-4的前一代——GPT-3的使用经验和GPT-4的预期功能来看,建议如下: 了解GPT-4的语言处理能力和适用场景:GPT-4预计将进一…...
《程序员面试金典(第6版)面试题 16.09. 运算
题目描述 请实现整数数字的乘法、减法和除法运算,运算结果均为整数数字,程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算。 你的实现应该支持如下操作: Operations() 构造函数minus…...
asp.net基于web的校园美食派送配送系统
1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和验证码,然后对登录进来的用户判断身份信息,判断是管理员用户还是普通用户。 2.系统用户管理:不管是…...
【JAVA】#详细介绍!!! 文件操作之File对象(1)!
本文内容不涉及文件内容操作,主要是对指定文件元信息的获取,以及通过java代码如何创建一个文件或者删除文件 目录 文件操作的File对象 File对象的基本操作方法 得到文件(夹)对象的信息元 1.getParent 2. getName 3.getPath 4…...
Vue基本的内置指令
前言 除了常见的v-bind,v-for,v-if,v-on.v-model等,本次学习一些vue提供的其他内置指令 1 v-text 给标签插入文本,类似于插值语法 它会把全部的字符串当成文本去解析,不会当成标签的,哪怕写的是标签结构 效果和插值语法是一样的 插值语法比v-text更加…...
华为孟晚舟当值首秀:2030年AI算力将增长500倍!
作者 | 范智林 来源 | 华商观察 微信号:HuashangGC 孟晚舟当值首次亮相。 4月19日,华为副董事长、轮值董事长、CFO孟晚舟在华为第20届全球分析师大会上进行演讲,这是她当值华为轮值董事长以来的首次公开亮相。 按照华为内部规定,…...
关于python异常的总结
Python异常是在程序执行时发生的错误,可能会导致程序终止运行。 在Python中,异常处理是一种机制,它允许开发人员在程序发生异常时捕获、处理和报告这些异常,以便程序可以继续运行或在出现异常时进行优雅的退出。 在Python中&…...
基于Java+SpringBoot+vue学生学习平台详细设计实现
基于JavaSpringBootvue学生学习平台详细设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目…...
【云原生网关】Kong 使用详解
目录 一、前言 二、Kong介绍 三、Kong核心组件 3.1 kong组件介绍 3.1.1 Kong Server 3.1.2 Apache Cassandra/PostgreSQL 3.1.3 Kong dashboard 3.2 传统网关与Kong工作模式对比 四、Kong网关特征与架构 4.1 kong网关特征 4.1.1 可扩展性 4.1.2 模块化 4.1.3 在任…...
浅谈之Java多线程
Java多线程是Java语言中一个非常重要的特性,它允许程序同时执行多个任务。通过多线程,程序可以同时处理多项任务,从而缩短程序的执行时间。另外,多线程也有助于利用多核处理器,更好地发挥计算机硬件的性能。 那我们在…...
【Vue3学习笔记1】一个清单应用帮你入门Vue.js
Vue 目前已经是国内最流⾏的前端框架之⼀,Vue 3 带来的诸多优化更是让前端圈迎来了新的潮流,比如: 基于 Proxy 的全新响应式实现; Composition API <script setup> 组织代码的更优方式; 更有料的 TypeScript 支…...
go破冰之旅·8·go函数基本实践及各种玩法
一次5-10分钟即可搞定,以干货效率的学习方式带你更直观的玩转各种玩法! 行文不易,一字一句纯手打创造,倾注了不少精力,感谢支持。 目录 什么是函数?有哪些元素? 函数参数、返回值 小程序&…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
