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
常用的类
PdfDocument
pdf文档对象
PdfPageBase
pdf页
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分钟即可搞定,以干货效率的学习方式带你更直观的玩转各种玩法! 行文不易,一字一句纯手打创造,倾注了不少精力,感谢支持。 目录 什么是函数?有哪些元素? 函数参数、返回值 小程序&…...

Qt - 从零到壹的 打地鼠 游戏
❤️🔥欢迎收看西北风的blog,好男人就是我,我就是西北风。✨ Gitee 地址 W_A_Mole NTC_jason/cc语言 - 码云 - 开源中国 (gitee.com) 目录 🟥一:创建一个主窗体 🟣二.:添加主窗口背景图片…...

代码自动发布系统
之前是jenkins发现gitlab代码更新了就自动获取直接部署到服务器 现在是jenkins自动获取Code之后打包成镜像上传到仓库然后通知docker去拉取更新的镜像 分析 旧∶ 代码发布环境提前准备,以主机为颗粒度静态 新: 代码发布环境多套,以容器为颗粒度编译 …...

qemu-基础篇(一)——安装
文章目录 env安装查看版本查看支持的开发板查看支持的CPU的型号 env ubuntu 安装 sudo apt-get install qemu sudo apt-get install qemu-system-arm sudo apt-get install qemu-system查看版本 qemu-img -V qemu-system-arm --version qemu-system-aarch64 --version返回结…...

从根本上理解Synchronized的加锁过程
作为一个Java开发,对于Synchronized这个关键字并不会陌生,无论是并发编程,还是与面试官对线,Synchronized可以说是必不可少。 在JDK1.6之前,都认为Synchronized是一个非常笨重的锁,就是在之前的《谈谈Java…...

CANOE入门到精通——CANOE系列教程记录1 第一个仿真工程
本系列以初学者角度记录学习CANOE,以《CANoe开发从入门到精通》参考学习,CANoe16 demo版就可以进行学习 概念 CANoe是一种用于开发、测试和分析汽车电子系统的软件工具。它通过在不同层次上模拟汽车电子系统中的不同部件,如ECU、总线和传感…...

JavaEE——单例模式
文章目录 一、介绍什么是单例模式二、饿汉模式三、懒汉模式四、讨论两种模式的线程安全问题 一、介绍什么是单例模式 在介绍单例模式之前,我们得先明确一个名词设计模式。 所谓设计模式其实不难理解,就是在计算机这个圈子中,呢些大佬们为了…...

关于数据倾斜
1、数据倾斜表现 1.1 hadoop中的数据倾斜表现 有一个多几个Reduce卡住,卡在99.99%,一直不能结束。各种container报错OOM异常的Reducer读写的数据量极大,至少远远超过其它正常的Reducer伴随着数据倾斜,会出现任务被kill等各种诡异…...

Shell第一次作业
要求: 1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 2、判断web服务是否运行(1、查看进程的方式判断该程序是否运行,2、通过查看端口的方式判断…...

实例解读nn.AdaptiveAvgPool2d((1, 1))
nn.AdaptiveAvgPool2d((1, 1))在PyTorch中创建一个AdaptiveAvgPool2d类的实例。该类在输入张量上执行2D自适应平均池化。 自适应平均池化是一种池化操作,它计算每个输入子区域的平均值并产生一个指定大小的输出张量。子区域的大小是根据输入张量的大小和输出张量的…...

泛型编程 之模板(template)
C另一种编程思想称为 泛型编程,主要利用的技术就是模板 目录 C另一种编程思想称为 泛型编程,主要利用的技术就是模板 一、概念 二、函数模板 1、语法与使用: 2、函数模板注意事项 3、普通函数与函数模板的区别 4、普通函数与函数模板的调用规…...