Unity之创建与导出PDF

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity之创建与导出PDF
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 PDF 的创建与导出

为初学者节省宝贵的学习时间,避免困惑!


TechX 教程效果:

在这里插入图片描述


文章目录

  • 一、第三方库iTextSharp导入
    • 1、通过Visual Studio的NuGet包管理器下载iTextSharp库
    • 2、导入DLL文件到Unity中
  • 二、使用iTextSharp生成和写入PDF文件的示例
  • 三、写入和导出PDF实战


一、第三方库iTextSharp导入


在Unity中生成PDF文件并写入内容,需要使用第三方库,因为Unity本身不提供直接操作PDF的API。一个常用的库是iTextSharp,这是一个强大的PDF处理库。iTextSharp是iText的C#版本,可以用于创建、修改和读取PDF文档。

1、通过Visual Studio的NuGet包管理器下载iTextSharp库


  1. 打开NuGet包管理器:

    在Visual Studio中,点击Tools菜单,选择NuGet Package Manager,然后选择Manage NuGet Packages for Solution…。

  2. 搜索iTextSharp:

    在打开的NuGet包管理器窗口中,点击Browse选项卡,然后在搜索框中输入iTextSharp。

  3. 安装iTextSharp:

    在搜索结果中找到iTextSharp包,点击Install按钮进行安装。根据提示完成安装过程。

在这里插入图片描述

2、导入DLL文件到Unity中


上一步下载的iTextSharp包在工程目录的Packages下,共包含两个文件夹:BouncyCastle.Cryptography.2.4.0和iTextSharp.5.5.13.4。

在这里插入图片描述

进入BouncyCastle.Cryptography.2.4.0\lib\net461和iTextSharp.5.5.13.4\lib\net461目录中找到BouncyCastle.Cryptography.dll和itextsharp.dll

在这里插入图片描述

将两个DLL文件复制到你的Unity项目的Assets/Plugins文件夹中。如果没有Plugins文件夹,可以创建一个。

在这里插入图片描述



二、使用iTextSharp生成和写入PDF文件的示例


在Unity项目中创建一个C#脚本,例如PDFGenerator.cs。

在脚本中使用iTextSharp来生成和写入PDF。

以下是完整的示例代码:

using UnityEngine;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using Image = iTextSharp.text.Image;public class PDFGenerator : MonoBehaviour
{void Start(){// 设置PDF保存路径string path = Application.dataPath + "/GeneratedPDF.pdf";// 图片路径string imgPath = Application.streamingAssetsPath+ "/path_to_image.jpg";using (FileStream fileStream = new FileStream(path, FileMode.Create)){// 创建一个文档对象Document document = new Document();// 创建一个PDF写入流PdfWriter pdfWriter = PdfWriter.GetInstance(document, fileStream );// 打开文档document.Open();// 添加内容到文档document.Add(new Paragraph("Hello, World!"));document.Add(new Paragraph("This is a PDF generated in Unity."));// 添加图片Image image = Image.GetInstance(imgPath );document.Add(image);// 添加表格PdfPTable table = new PdfPTable(3); // 3列的表格table.AddCell("Cell 1");table.AddCell("Cell 2");document.Add(table);//关闭写入流pdfWriter.Close();// 关闭文档document.Close();}Debug.Log("PDF generated at: " + path);}
}


三、写入和导出PDF实战


using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using UnityEngine;
using Font = iTextSharp.text.Font;
using Rectangle = iTextSharp.text.Rectangle;namespace PDFExport
{/// <summary>/// PDF文档操作类/// </summary>public class PDFOperation{#region 私有字段private Font font = default;private PdfWriter pdfWriter;private Rectangle documentSize;   //文档大小private Document document;//文档对象private BaseFont basefont;//字体#endregion#region 构造函数/// <summary>/// 构造函数/// </summary>public PDFOperation(){documentSize = PageSize.A4;document = new Document(documentSize);}/// <summary>/// 构造函数/// </summary>/// <param name="type">页面大小(如"A4")</param>public PDFOperation(Rectangle size){documentSize = size;document = new Document(size);}/// <summary>/// 构造函数/// </summary>/// <param name="type">页面大小(如"A4")</param>/// <param name="marginLeft">内容距左边框距离</param>/// <param name="marginRight">内容距右边框距离</param>/// <param name="marginTop">内容距上边框距离</param>/// <param name="marginBottom">内容距下边框距离</param>public PDFOperation(Rectangle size, float marginLeft, float marginRight, float marginTop, float marginBottom){documentSize = size;document = new Document(size, marginLeft, marginRight, marginTop, marginBottom);}#endregion#region 文档操作/// <summary>/// 创建写入流/// </summary>/// <param name="os">文档相关信息(如路径,打开方式等)</param>public PdfWriter OpenPdfWriter(FileStream os){pdfWriter = PdfWriter.GetInstance(document, os);return pdfWriter;}/// <summary>/// 关闭写入流/// </summary>/// <param name="writer"></param>public void ClosePdfWriter(){pdfWriter.Close();}/// <summary>/// 打开文档/// </summary>public void Open(){document.Open();}/// <summary>/// 关闭打开的文档/// </summary>public void Close(){document.Close();}#endregion#region 设置字体/// <summary>/// 设置字体/// </summary>public void SetBaseFont(string path){basefont = BaseFont.CreateFont(path, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);}/// <summary>/// 设置字体/// </summary>/// <param name="size">字体大小</param>public Font SetFont(float size){font = new Font(basefont, size);return font;}/// <summary>/// 设置字体/// </summary>/// <param name="size"></param>/// <param name="style"></param>public Font SetFont(float size, int style){font = new Font(basefont, size, style);return font;}/// <summary>/// 设置字体/// </summary>/// <param name="size"></param>/// <param name="style"></param>/// <param name="fontColor"></param>public Font SetFont(float size, int style, BaseColor fontColor){font = new Font(basefont, size, style, fontColor);return font;}/// <summary>/// 获取字体/// </summary>/// <returns></returns>public Font GetFont(){return font;}#endregionpublic void AddPage(){document.NewPage();}#region 添加段落/// <summary>/// 空格/// 加入空行,用以区分上下行/// </summary>public void AddNullLine(int nullLine=1,int lightHeight=12){// Change this to the desired number of empty linesint numberOfEmptyLines = nullLine; for (int i = 0; i < numberOfEmptyLines; i++){Paragraph emptyLine = new Paragraph(" ", new Font(Font.FontFamily.HELVETICA, lightHeight));document.Add(emptyLine);}}/// <summary>/// 插入文字内容/// </summary>/// <param name="content">内容</param>/// <param name="alignmentType">对齐格式,0为左对齐,1为居中</param>/// <param name="indent">首行缩进</param>public void AddParagraph(string content, int alignmentType = 0,float indent = 0){Paragraph contentP = new Paragraph(new Chunk(content, font));contentP.FirstLineIndent = indent;contentP.Alignment = alignmentType;document.Add(contentP);}/// <summary>/// 添加段落/// </summary>/// <param name="content">内容</param>/// <param name="Alignment">对齐方式(1为居中,0为居左,2为居右)</param>/// <param name="SpacingAfter">段后空行数(0为默认值)</param>/// <param name="SpacingBefore">段前空行数(0为默认值)</param>/// <param name="MultipliedLeading">行间距(0为默认值)</param>public void AddParagraph(string content, int Alignment, float SpacingAfter, float SpacingBefore, float MultipliedLeading){Paragraph pra = new Paragraph(content, font);pra.Alignment = Alignment;if (SpacingAfter != 0){pra.SpacingAfter = SpacingAfter;}if (SpacingBefore != 0){pra.SpacingBefore = SpacingBefore;}if (MultipliedLeading != 0){pra.MultipliedLeading = MultipliedLeading;}document.Add(pra);}#endregion#region 添加图片/// <summary>/// 添加图片/// </summary>/// <param name="path">图片路径</param>/// <param name="Alignment">对齐方式(1为居中,0为居左,2为居右)</param>/// <param name="newWidth">图片宽(0为默认值,如果宽度大于页宽将按比率缩放)</param>/// <param name="newHeight">图片高</param>public Image AddImage(string imagePath, int Alignment, float newWidth, float newHeight){if (!File.Exists(imagePath)){Debug.Log("该路径下不存在指定图片,请检测路径是否正确!");return null;}Image img = Image.GetInstance(imagePath);img.Alignment = Alignment;if (newWidth != 0){img.ScaleAbsolute(newWidth, newHeight);}else{if (img.Width > PageSize.A4.Width){img.ScaleAbsolute(documentSize.Width, img.Width * img.Height / documentSize.Height);}}document.Add(img);return img;}/// <summary>/// 添加图片/// </summary>/// <param name="path">图片路径</param>/// <param name="Alignment">对齐方式(1为居中,0为居左,2为居右)</param>/// <param name="newWidth">图片宽</param>/// <param name="newHeight">图片高</param>public Image AddImage(string imagePath, int Alignment, int fitWidth, int fitHeight){if (!File.Exists(imagePath)){Debug.Log("该路径下不存在指定图片,请检测路径是否正确!");return null;}Image image = Image.GetInstance(imagePath);image.ScaleToFit(fitWidth, fitHeight);image.Alignment = Alignment;document.Add(image);return image;}#endregion #region Table表public void AddTable(PdfPTable table){document.Add(table);}#endregion}
}
using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.IO;
using UnityEditor;
using UnityEngine;
using Font = iTextSharp.text.Font;
using Image = iTextSharp.text.Image;namespace PDFExport
{public class ReportExporterPDF: MonoBehaviour{private string fontPath = Application.streamingAssetsPath + "/Fonts/SIMFANG.TTF";string imagePath1 = Application.streamingAssetsPath + "/Images/logo.png";private void Start(){GenerateReportPDF();}public  void GenerateReportPDF(){CreatePDF(Application.streamingAssetsPath + "/Report.pdf");}private void CreatePDF(string filePath){using (FileStream fileStream = new FileStream(filePath, FileMode.Create)){PDFOperation pdf = new PDFOperation(PageSize.A4, 55f, 55f, 96f, 96f);pdf.SetBaseFont(fontPath);PdfWriter pdfWriter = pdf.OpenPdfWriter(fileStream);pdf.Open();HeaderFooterPageEvent headerFooterPageEvent = new HeaderFooterPageEvent(pdf,this);pdfWriter.PageEvent = headerFooterPageEvent;FirstPasge(pdf);pdf.Close();pdf.ClosePdfWriter();
#if UNITY_EDITORAssetDatabase.Refresh();
#endif}Application.OpenURL(filePath);}#region FirstPageprivate void FirstPasge(PDFOperation pdf){pdf.AddNullLine(1, 22);Image image1 = Image.GetInstance(imagePath1);PdfPTable table = new PdfPTable(1);table.DefaultCell.Border = Rectangle.NO_BORDER;table.DefaultCell.Padding = 0;table.DefaultCell.FixedHeight = 100;// 设置图片的缩放比例float scale = 0.9f;image1.ScaleAbsolute(image1.Width * scale, image1.Height * scale);PdfPCell cell1 = new PdfPCell(image1);cell1.HorizontalAlignment = 1;cell1.PaddingRight = 0;cell1.Border = Rectangle.NO_BORDER;table.AddCell(cell1);pdf.AddTable(table);pdf.AddNullLine();pdf.SetFont(24);pdf.AddParagraph("汽车实验系统", 1);pdf.AddNullLine();pdf.SetFont(36, Font.BOLD);pdf.AddParagraph("实验报告", 1);pdf.AddNullLine(3);AddMainInfo(pdf);}public void AddMainInfo(PDFOperation pdf){// 创建一个有 2 列的表格float[] columnWidths = { 124, 369 };PdfPTable table = new PdfPTable(columnWidths);table.DefaultCell.Border = Rectangle.NO_BORDER;// 设置表格宽度和对齐方式table.WidthPercentage = 80;table.HorizontalAlignment = Element.ALIGN_CENTER;string[] cellContents = {"实验名称:", "汽车仿真实验","实验地点:", "","学生姓名:", "","指导教师:", "","所属单位:", "","支持单位:", "XXXX科技大学","支持单位:", "XXXXXX股份有限公司","实验时间:", DateTime.Now.ToString("yyyy年MM月dd日")};// 用提供的信息添加表格单元格for (int i = 0; i < cellContents.Length; i++){PdfPCell cell;if (i % 2 == 0){pdf.SetFont(14, Font.BOLD);cell = new PdfPCell(new Phrase(cellContents[i], pdf.GetFont()));}else{pdf.SetFont(14, Font.NORMAL);cell = new PdfPCell(new Phrase(cellContents[i], pdf.GetFont()));}cell.Padding = 10;cell.Border = Rectangle.NO_BORDER;table.AddCell(cell);}pdf.AddTable(table);}#endregion#region  页眉页脚public class HeaderFooterPageEvent : PdfPageEventHelper{PDFOperation pdf;ReportExporterPDF reportExporter;public HeaderFooterPageEvent(PDFOperation pdf, ReportExporterPDF reportExporter){this.pdf = pdf;this.reportExporter = reportExporter;}public override void OnEndPage(PdfWriter writer, Document doc){base.OnEndPage(writer, doc);Header(writer, doc);Footer(writer, doc);}private void Header(PdfWriter writer, Document doc){float[] columnWidths = { 25, 200 };// 添加带图片和文字的页眉PdfPTable headerTable = new PdfPTable(columnWidths);headerTable.DefaultCell.Border = Rectangle.NO_BORDER;headerTable.WidthPercentage = 100;headerTable.HorizontalAlignment = Element.ALIGN_CENTER;headerTable.TotalWidth = doc.PageSize.Width - doc.LeftMargin - doc.RightMargin; // Set table widthheaderTable.LockedWidth = true; // Lock the table widthImage image1 = Image.GetInstance(reportExporter.imagePath1);// Add images to the headerimage1.ScaleAbsolute(image1.Width / 2, image1.Height / 2);PdfPCell imageCell1 = new PdfPCell(image1);imageCell1.Border = Rectangle.NO_BORDER;// Add text to the headerpdf.SetFont(10, Font.NORMAL, BaseColor.GRAY);Font headerFont = pdf.GetFont();PdfPCell textCell = new PdfPCell(new Phrase("XXXXXX股份有限公司", headerFont));textCell.HorizontalAlignment = Element.ALIGN_RIGHT;textCell.VerticalAlignment = Element.ALIGN_BOTTOM;textCell.Border = Rectangle.NO_BORDER;headerTable.AddCell(imageCell1);headerTable.AddCell(textCell);headerTable.WriteSelectedRows(0, -1, doc.Left, doc.Top + 60, writer.DirectContent);}private void Footer(PdfWriter writer, Document doc){// Add footer with page numberPdfPTable footerTable = new PdfPTable(1);footerTable.DefaultCell.Border = Rectangle.NO_BORDER;footerTable.WidthPercentage = 100;footerTable.HorizontalAlignment = Element.ALIGN_CENTER;footerTable.TotalWidth = doc.PageSize.Width - doc.LeftMargin - doc.RightMargin; // Set table widthfooterTable.LockedWidth = true; // Lock the table widthint pageNumber = writer.PageNumber;int totalPages = writer.CurrentPageNumber; // Exclude the cover pagepdf.SetFont(9, Font.NORMAL, BaseColor.GRAY);Font footFont = pdf.GetFont();PdfPCell footerCell = new PdfPCell(new Phrase($"{totalPages}", footFont));footerCell.HorizontalAlignment = Element.ALIGN_CENTER;footerCell.Border = Rectangle.NO_BORDER;footerTable.AddCell(footerCell);footerTable.WriteSelectedRows(0, -1, doc.Left, doc.Bottom - 50, writer.DirectContent);}}#endregion}
}




TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

订单服务-提交订单业务立即购买业务

文章目录 1、提交订单 业务2、在 OrderController 创建 submitOrder 方法3、 在 OrderServiceImpl 中实现 submitOrder 方法4、根据id查询sku详情&#xff08;service-product"&#xff09;5、查询用户地址保存到订单项中&#xff08;service-user&#xff09;6、删除购物…

udp发送数据如果超过1个mtu时,抓包所遇到的问题记录说明

最近在测试Syslog udp发送相关功能&#xff0c;测试环境是centos udp头部的数据长度是2个字节&#xff0c;最大传输长度理论上是65535&#xff0c;除去头部这些字节&#xff0c;可以大概的说是64k。 写了一个超过64k的数据(随便用了一个7w字节的buffer)发送demo&#xff0c;打…

USB-SC-09编程电缆使用手册

USB-SC-09编程电缆是通过电脑的USB口仿真成传统串口&#xff08;俗称COM口&#xff09;&#xff0c;从而使用现有的各种编程软件、通信软件和监控软件等&#xff0c;转换盒上的发光二极管指示数据的收发状态&#xff0c;本电缆适用于三菱FX全系列PLC USB-SC-09电缆外观&#xf…

【AIGC评测体系】大模型评测指标集

大模型评测指标集 &#xff08;☆&#xff09;SuperCLUE&#xff08;1&#xff09;SuperCLUE-V&#xff08;中文原生多模态理解测评基准&#xff09;&#xff08;2&#xff09;SuperCLUE-Auto&#xff08;汽车大模型测评基准&#xff09;&#xff08;3&#xff09;AIGVBench-T2…

【python - 数据】

一、序列 序列&#xff08;sequence&#xff09;是一组有顺序的值的集合&#xff0c;是计算机科学中的一个强大且基本的抽象概念。序列并不是特定内置类型或抽象数据表示的实例&#xff0c;而是一个包含不同类型数据间共享行为的集合。也就是说&#xff0c;序列有很多种类&…

Python数据可视化书籍推荐:利用Python进行数据分析

《利用Python进行数据分析》 这本书几乎是数据分析入门必读书了 主要介绍了python 3个库numpy&#xff08;数组&#xff09;&#xff0c;pandas&#xff08;数据分析&#xff09;和matplotlib&#xff08;绘图&#xff09;的学习 阅读本书可以获得一份关于在Python下操作、处…

2024“国培“来也UiBot6.0 RPA数字机器人开发综合应用

前言 (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~) 国培笔记: 依次读取数组中每个元素 输出调试信息 [ value=[ "vivian", value[0] "老师", "上午好,O(∩_∩)O哈哈~" ], v…

Ozon、美客多补单测评黑科技:打造无懈可击的自养号补单环境

不管哪个跨境平台的风控都会做升级&#xff0c;相对的补单技术也需要进行相应的做升级&#xff0c;风控升级后&#xff0c;自己养号补单需要注意以下技术问题&#xff0c;以确保补单的稳定性和安全性&#xff1a; 一、物理环境 1. 硬件参数伪装&#xff1a;平台已经开始通过I…

在手机上也能开发软件?而且只需要用几句话就可以自动生成一个应用!

随着人工智能技术的飞速发展&#xff0c;软件开发的门槛正在迅速降低。 曾几何时&#xff0c;开发一款软件需要精通编程语言和掌握复杂的开发工具&#xff0c;而如今&#xff0c;只需几句话的描述&#xff0c;便能在手机上轻松开发出功能齐全的软件。 这一切的背后&#xff0…

Steam夏促怎么注册 Steam夏促账号注册教程

随着夏日的炙热渐渐充斥着每一个角落&#xff0c;Steam平台也赶来添热闹&#xff0c;推出了一系列让人眼前一亮的夏季促销活动。如果你也是游戏爱好者&#xff0c;我们肯定不能错过这次的steam夏促。正直本次夏日促销有着很多的游戏迎来史低和新史低&#xff0c;有各种各样的游…

VSCode里python代码不扩展/级联了的解决办法

如图 解决办法&#xff1a;重新下载新的扩展工具 步骤如下 1、在左边工具栏打开Extensions 2、搜索框输入python&#xff0c;选择别的扩展工具&#xff0c;点击Install - 3在扩展工具所在的目录下&#xff0c;新建一个文件&#xff0c;就可以用了

如何通过指纹浏览器使用代理IP?

1.指纹浏览器定义 指纹浏览器是 一种浏览器技术&#xff0c;它根据用户设备的硬件、软件和配置等特征生成唯一标识符&#xff08;称为“指纹”&#xff09;。此指纹用于识别和追踪用户身份&#xff0c;即使用户更改其 IP 地址或清除浏览器数据&#xff08;如缓存和 Cookie&…

PyCharm远程开发

PyCharm远程开发 1- 远程环境说明 每个人的本地电脑环境差别很大。各自在自己电脑上开发功能&#xff0c;测试/运行正常。但是将多个人的代码功能合并&#xff0c;运行服务器上&#xff0c;会出现各种版本兼容性问题。 在实际企业中&#xff0c;一般会有两套环境。第一套是测…

Jenkins教程-13-参数化任务构建

上一小节我们学习了发送html邮件测试报告的方法&#xff0c;本小节我们讲解一下Jenkins参数化任务构建的方法。 很多时候我们需要根据不同的条件去执行构建&#xff0c;如自动化测试中执行test、stg、prod环境的构建&#xff0c;Jenkins是支持参数化构建的。 以下是Jenkins官…

【C++】using namespace std 到底什么意思

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi 的学习笔记&#xff0c;引用了部分大佬的案例 &#x1f4e2;未来很长&a…

【C++】多态详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 一、多态概念 二、多态的定义及实现 1. 多态的构成条件 2. 虚函数 2.1 什么是虚函数 2.2 虚函数的重写 2.3 虚函数重写的两个…

实战项目——用Java实现图书管理系统

前言 首先既然是管理系统&#xff0c;那咱们就要实现以下这几个功能了--> 分析 1.首先是用户分为两种&#xff0c;一个是管理员&#xff0c;另一个是普通用户&#xff0c;既如此&#xff0c;可以定义一个用户类&#xff08;user&#xff09;&#xff0c;在定义管理员类&am…

哈哈看到这条消息感觉就像是打开了窗户

在这个信息爆炸的时代&#xff0c;每一条动态可能成为我们情绪的小小触发器。今天&#xff0c;当我无意间滑过那条由杜海涛亲自发布的“自曝式”消息时&#xff0c;不禁心头一颤——如果这是我的另一半&#xff0c;哎呀&#xff0c;那画面&#xff0c;简直比烧烤摊还要“热辣”…

多微信运营管理方案

微信作为一款社交通讯软件&#xff0c;已经成为人们日常生活中不可缺少的工具。不仅个人&#xff0c;很多企业都用微信来联系客户、维护客户和营销&#xff0c;这自然而然就会有很多微信账号、手机也多&#xff0c;那管理起来就会带来很多的不便&#xff0c;而多微信私域管理系…

K8s的基本使用和认识

目录 介绍 控制端 Node(节点) 控制端与节点的关系图 基本使用 创建和运行资源 查找和参看资源 修改和删除资源 介绍 控制端 api-server(api)是集群的核心是k8s中最重要的组件,因为它是实现声明式api的关键 kubernetes api-server的核心功能是提供了Kubernetes各类资…