在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“。毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单单依靠人力去做文档的操作需要的代价是巨大的,比如数据统计,数据分析等业务要求。这就需要我们在开发系统时,应该尽量减少使用者的一些工作量,例如将数据直接写入文档,获取网页信息后直接存为PDF保存,以便以后继续查看。软件开发的目地是对使用者便捷,但这一要求未必对开发者来说也是便捷的。

在前面介绍过一款开源免费的组件DocX,这个组件主要是对文档进行操作。另一种对Excel操作的组件NPOI组件。今天介绍一款.NET Office操作组件Spire,这是一个企业级的.NET Office操作组件,但是这是一款不免费也不开源的组件。可能很多人听到这里就不想再读下去了,的确,在国内毕竟免费才可以占用主流市场,因为很多客户希望减少成本,所以希望采用免费的工具。

作为开发者,我也会有这样的观点,不过有的时候也会思考收费与免费的工具到底哪一个好,其实这样的思考到最后似乎是没有意义的,因为事物存在既有价值,免费的可以减少成本,收费的可以获取稳定而安全的支持,各有优势和特点。任何一个软件的生成都是需要成本的,因为任何软件都是人员开发出来的,需要支付对应的成本,此处不收钱,其他的地方也会收费。无论收费与免费的哪一个好,技术总是没有错的,收费的东西,我们也可以了解,做一个技术储备。

今天要介绍的一款组件有收费的部分和免费的部分,但是这款软件的功能的确比较的强大,使用起来也比较简单,因为要收费的东西,毕竟需要做到人性化,不然谁会出钱去买,毕竟便宜而好用的东西很少。此组件的使用方式很简单,官方提供了比较完备的操作demo,所以今天的文章只做为一个引子。

由于Spire的组件较多,今天就用Spire.PDF for .NET做个引子,不一定收费就没有客户会选择,如果需要稳定的服务支持,收费的组件是可以考虑的,或者遇到土豪客户,也可以在项目中使用一下,毕竟使用起来很便捷。

一.Spire.PDF for .NET组件概述:

Spire.PDF for .NET是一个专业的PDF组件,用于在.NET应用程序中创建,编写,编辑,处理和阅读PDF文件,而不需要任何外部依赖。 使用这个.NET PDF库,您可以实现丰富的功能从头开始创建PDF文件或完全通过C#/ VB.NET处理现有的PDF文档,而无需安装Adobe Acrobat。

.NET PDF API支持许多丰富的功能,例如安全设置(包括数字签名),PDF文本/附件/图像提取,PDF合并/拆分,元数据更新,段,图像/图像绘制和插入,表创建 以及处理和导入数据等。

此外,Spire.PDF for .NET可以应用于使用C#/ VB.NET以高质量轻松地将文本,图像和HTML转换为PDF。

以下是一个官方给出的组件解析图:

Spire.PDF for .NET支持将HTML,RTF,XPS,文本和图像转换为具有高效性能的PDF文档。 开发人员可以将PDF转换为Word,XPS,SVG,EMF,JPG,PNG,BMP,TIFF,文本格式。 此外,随着Spire.Doc for .NET和Spire.XLS for .NET,开发人员可以将Word(Doc / Docx),Excel(Xls / Xlsx)和XML转换为PDF。

此组件的功能还是非常强大的,每个开发人员都知道,产品做得不好,想要客户的钱还是很难的。看一下组件的主要功能:

    1.文本格式,多语言支持,文本对齐等。

    2.笔和画笔将形状元素,文本,图像绘制成PDF文档。

    3.图层,透明图形,颜色空间和条形码创建可以呈现为PDF文档。

    4.PDF / A-1b和PDF / x1a:2001合规性,可以应用这两种标准。

    5.添加标量/矢量图像和掩码,并将它们放在指定的位置。

    6.Spire.PDF for .NET可支持表和表样式

    7.插入交互式元素,包括注释,操作,JavaScript,附件,书签和指定地点和外观。

以上对组件的相关背景做了一个简单的介绍,并且对组件的功能和使用情形做了简单的罗列。

二.Spire.PDF for .NET相关类的解析:

在这里主要介绍Spire的Spire.PDF组件部分,此组件有免费的和收费的两个版本,免费的版本在功能没有收费的多,但是稳定性和实用性还是较高的。我们具体看一下此组件的主要的类和方法,这里是主要介绍PDF的操作,就先看一下有关PDF的操作类和方法。

这里看以下命名空间的主要类:

以上的方法中只是操作PDF部分类,由于包含的类较多,过大的介绍篇幅就显得多余,在对PDF的操作中提供了较多的方法,因此在功能上会较为的丰富,使用起来也较为的便捷。

1.PdfDocument类:声明PDF文档:

     (1).PdfDocument类的构造函数:

    public PdfDocument();public PdfDocument(string filename);public PdfDocument(byte[] bytes);public PdfDocument(Stream stream);public PdfDocument(string filename, string password);public PdfDocument(byte[] bytes, string password);public PdfDocument(Stream stream, string password);该类提供了7个构造函数的重载版本,对应的参数类型就不做详细的介绍

(2).PdfDocument.LoadFromHTML():加载HTML页面:

public void LoadFromHTML(string Url, bool enableJavaScript, bool enableHyperlinks, bool autoDetectPageBreak)
{// This item is obfuscated and can not be translated.
    PdfHtmlLayoutFormat format;int num;goto Label_001E;
Label_008F:num = 0;
Label_0002:switch (num){case 0:break;case 1:if (!autoDetectPageBreak){format.Layout = PdfLayoutType.OnePage;format.FitToPage = Clip.Width;format.FitToHtml = Clip.Height;num = 2;}else{num = 3;}goto Label_0002;case 2:switch ((1 == 1)){case 2:goto Label_008F;}if (0 != 0){}break;case 3:format.Layout = PdfLayoutType.Paginate;format.FitToPage = Clip.Width;goto Label_008F;default:goto Label_001E;if (1 != 0){}format = new PdfHtmlLayoutFormat();num = 1;goto Label_0002;}this.Sections.Add().LoadFromHTML(Url, enableJavaScript, enableHyperlinks, format);
}

2.HtmlConverter名称空间:Html转换器。

namespace Spire.Pdf.HtmlConverter
{public enum AspectRatiopublic enum Clip[ToolboxItem(false)]public class HtmlConverter : UserControl, sprᰐ, sprᶪ, sprṳ, sprẝ, sprẏpublic enum ImageTypepublic class PdfHtmlLayoutFormat
}

private Metafile ᜍ();static HtmlConverter();public HtmlConverter();public int Authenticate(ref IntPtr phwnd, ref IntPtr pszUsername, ref IntPtr pszPassword);public HtmlToPdfResult Convert(string url, ImageType type, int width, int height, AspectRatio aspectRatio);public HtmlToPdfResult Convert(string html, string baseurl, ImageType type, int width, int height, AspectRatio aspectRatio);public HtmlToPdfResult Convert(string url, ImageType type, int width, int height, AspectRatio aspectRatio, string username, string password);public Image ConvertToImage(string url, ImageType type);public Image ConvertToImage(Stream stream, Encoding encoding, ImageType type);public Image ConvertToImage(string url, ImageType type, int width);public Image ConvertToImage(Stream stream, Encoding encoding, ImageType type, int width);public Image ConvertToImage(string url, ImageType type, int width, int height);public Image ConvertToImage(string url, ImageType type, string username, string password);public Image ConvertToImage(Stream stream, Encoding encoding, ImageType type, int width, int height);public Image ConvertToImage(string url, ImageType type, int width, int height, AspectRatio aspectRatio);public Image ConvertToImage(string url, ImageType type, int width, string username, string password);public Image ConvertToImage(Stream stream, Encoding encoding, ImageType type, int width, int height, AspectRatio aspectRatio);public Image ConvertToImage(string url, ImageType type, int width, int height, string username, string password);public Image ConvertToImage(string url, ImageType type, int width, int height, AspectRatio aspectRatio, string username, string password);[DispId(-5512)]public int CustomizeDownload();protected override void Dispose(bool disposing);public Image FromString(string html, ImageType type, int width);public Image FromString(string html, string baseUrl, ImageType type);public Image FromString(string html, ImageType type, int width, int height);public Image FromString(string html, string baseUrl, ImageType type, int width);public Image FromString(string html, ImageType type, int width, int height, AspectRatio aspectRatio);public Image FromString(string html, string baseUrl, ImageType type, int width, int height);public Image FromString(string html, string baseUrl, ImageType type, int width, int height, AspectRatio aspectRatio);public Image FromString(string html, string baseUrl, ImageType type, int width, int height, AspectRatio aspectRatio, string username, string password);public Image[] GetImagesFromString(string html, string baseUrl, ImageType type);public int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject);int sprẏ.GetSecurityId(string pwszUrl, IntPtr pbSecurityId, ref uint pcbSecurityId, ref uint dwReserved);int sprẏ.GetSecuritySite(out IntPtr pSite);int sprẏ.GetZoneMappings(uint dwZone, out IEnumString ppenumString, uint dwFlags);int sprẏ.MapUrlToZone(string pwszUrl, out uint pdwZone, uint dwFlags);int sprẏ.ProcessUrlAction(string pwszUrl, uint dwAction, IntPtr pPolicy, uint cbPolicy, IntPtr pContext, uint cbContext, uint dwFlags, uint dwReserved);int sprẏ.QueryCustomPolicy(string pwszUrl, ref Guid guidKey, out IntPtr ppPolicy, out uint pcbPolicy, IntPtr pContext, uint cbContext, uint dwReserved);int sprẏ.SetSecuritySite(IntPtr pSite);int sprẏ.SetZoneMapping(uint dwZone, string lpszPattern, uint dwFlags);int sprᶪ.GetContainer(object ppContainer);int sprᶪ.GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk);int sprᶪ.OnShowWindow(bool fShow);int sprᶪ.RequestNewObjectLayout();int sprᶪ.SaveObject();int sprᶪ.ShowObject();

以上是对PDF操作的相关类和方法的查看,由于此软件为商业软件,只能查看部分对外公开的代码,但是从可以查看到的代码就可以看出其内部实现的复杂度。如果需要详细了解:http://www.e-iceblue.com/Introduce/free-pdf-component.html#.WEEFj_l962w。

三.Spire.PDF for .NET实例:

由于本文主要讲解HTML页面转换为PDF文档,所以先提供一种GET请求HTML页面,以及一种获取页面图片的操作方法。接着介绍创建PDF文档、Text转化为PDF, XPS转换为

PDF,Image转换为PDF等操作方法。

1.创建HTTP的GET请求,获取网页信息:

        /// <summary>/// 指定路径发送GET请求/// </summary>/// <param name="getUrl"></param>/// <returns></returns>public static string HttpGet(string getUrl){try{if (string.IsNullOrEmpty(getUrl))throw new ArgumentNullException(getUrl);var request = WebRequest.Create(getUrl) as HttpWebRequest;if (request == null)return null;var cookieContainer = new CookieContainer();request.CookieContainer = cookieContainer;request.AllowAutoRedirect = true;request.Method = "GET";request.ContentType = "application/x-www-form-urlencoded";var response = request.GetResponse() as HttpWebResponse;if (response != null){var instream = response.GetResponseStream();if (instream == null)throw new ArgumentNullException("getUrl");string content;using (var sr = new StreamReader(instream, Encoding.UTF8)){content = sr.ReadToEnd();}return content;}}catch (Exception er){throw new Exception(er.Message);}return null;}

2.取得HTML中所有图片的 URL:

        /// <summary>   /// 取得HTML中所有图片的 URL。   /// </summary>   /// <param name="url">HTML代码</param>/// <returns>图片的URL列表</returns> public static string HtmlCodeRequest(string url){if (string.IsNullOrEmpty(url)){throw new ArgumentNullException(url);}try{//创建一个请求var httprequst = (HttpWebRequest)WebRequest.Create(url);//不建立持久性链接httprequst.KeepAlive = true;//设置请求的方法httprequst.Method = "GET";//设置标头值httprequst.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";httprequst.Accept = "*/*";httprequst.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");httprequst.ServicePoint.Expect100Continue = false;httprequst.Timeout = 5000;//是否允许302httprequst.AllowAutoRedirect = true;ServicePointManager.DefaultConnectionLimit = 30;//获取响应var webRes = (HttpWebResponse)httprequst.GetResponse();//获取响应的文本流string content;using (var stream = webRes.GetResponseStream()){using (var reader = new StreamReader(stream, Encoding.GetEncoding("utf-8"))){content = reader.ReadToEnd();}}//取消请求
                httprequst.Abort();//返回数据内容return content;}catch (Exception ex){throw new Exception(ex.Message);}}

3.创建PDF文档:

            PdfDocument doc = new PdfDocument();doc.LoadFromHTML(url, false, true, true);doc.Close();以上没有将操作组装为一个方法,由于创建操作较为简单,所以不做详细介绍,url为网页路径地址。

HtmlConverter.Convert
("http://www.wikipedia.org/","HTMLtoPDF.pdf",//enable javascript true,//load timeout
100 * 1000,
//page size
new SizeF(612, 792),
//page margins
new PdfMargins(0, 0));

4.Text转化为PDF:

 public static void  TextLayout(){//Create a pdf document.PdfDocument doc = new PdfDocument();// Create one pagePdfPageBase page = doc.Pages.Add();float pageWidth = page.Canvas.ClientSize.Width;float y = 0;//page headerPdfPen pen1 = new PdfPen(Color.LightGray, 1f);PdfBrush brush1 = new PdfSolidBrush(Color.LightGray);PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial", 8f, FontStyle.Italic));PdfStringFormat format1 = new PdfStringFormat(PdfTextAlignment.Right);String text = "Demo of Spire.Pdf";page.Canvas.DrawString(text, font1, brush1, pageWidth, y, format1);SizeF size = font1.MeasureString(text, format1);y = y + size.Height + 1;page.Canvas.DrawLine(pen1, 0, y, pageWidth, y);//titley = y + 5;PdfBrush brush2 = new PdfSolidBrush(Color.Black);PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial", 16f, FontStyle.Bold));PdfStringFormat format2 = new PdfStringFormat(PdfTextAlignment.Center);format2.CharacterSpacing = 1f;text = "Summary of Science";page.Canvas.DrawString(text, font2, brush2, pageWidth / 2, y, format2);size = font2.MeasureString(text, format2);y = y + size.Height + 6;//iconPdfImage image = PdfImage.FromFile(@"..\..\..\..\..\..\Data\Wikipedia_Science.png");page.Canvas.DrawImage(image, new PointF(pageWidth - image.PhysicalDimension.Width, y));float imageLeftSpace = pageWidth - image.PhysicalDimension.Width - 2;float imageBottom = image.PhysicalDimension.Height + y;//refenrence contentPdfTrueTypeFont font3 = new PdfTrueTypeFont(new Font("Arial", 9f));PdfStringFormat format3 = new PdfStringFormat();format3.ParagraphIndent = font3.Size * 2;format3.MeasureTrailingSpaces = true;format3.LineSpacing = font3.Size * 1.5f;String text1 = "(All text and picture from ";String text2 = "Wikipedia";String text3 = ", the free encyclopedia)";page.Canvas.DrawString(text1, font3, brush2, 0, y, format3);size = font3.MeasureString(text1, format3);float x1 = size.Width;format3.ParagraphIndent = 0;PdfTrueTypeFont font4 = new PdfTrueTypeFont(new Font("Arial", 9f, FontStyle.Underline));PdfBrush brush3 = PdfBrushes.Blue;page.Canvas.DrawString(text2, font4, brush3, x1, y, format3);size = font4.MeasureString(text2, format3);x1 = x1 + size.Width;page.Canvas.DrawString(text3, font3, brush2, x1, y, format3);y = y + size.Height;//contentPdfStringFormat format4 = new PdfStringFormat();text = System.IO.File.ReadAllText(@"..\..\..\..\..\..\Data\Summary_of_Science.txt");PdfTrueTypeFont font5 = new PdfTrueTypeFont(new Font("Arial", 10f));format4.LineSpacing = font5.Size * 1.5f;PdfStringLayouter textLayouter = new PdfStringLayouter();float imageLeftBlockHeight = imageBottom - y;PdfStringLayoutResult result= textLayouter.Layout(text, font5, format4, new SizeF(imageLeftSpace, imageLeftBlockHeight));if (result.ActualSize.Height < imageBottom - y){imageLeftBlockHeight = imageLeftBlockHeight + result.LineHeight;result = textLayouter.Layout(text, font5, format4, new SizeF(imageLeftSpace, imageLeftBlockHeight));}foreach (LineInfo line in result.Lines){page.Canvas.DrawString(line.Text, font5, brush2, 0, y, format4);y = y + result.LineHeight;}PdfTextWidget textWidget = new PdfTextWidget(result.Remainder, font5, brush2);PdfTextLayout textLayout = new PdfTextLayout();textLayout.Break = PdfLayoutBreakType.FitPage;textLayout.Layout = PdfLayoutType.Paginate;RectangleF bounds = new RectangleF(new PointF(0, y), page.Canvas.ClientSize);textWidget.StringFormat = format4;textWidget.Draw(page, bounds, textLayout);//Save pdf file.doc.SaveToFile("TextLayout.pdf");doc.Close();//Launching the Pdf file.PDFDocumentViewer("TextLayout.pdf");}

5.XPS转换为PDF:

  public void XPStoPDF(){//xps fileString file = @"..\..\..\..\..\..\Data\Sample4.xps";//open xps documentPdfDocument doc = new PdfDocument();doc.LoadFromXPS(file);//convert to pdf file.doc.SaveToFile("Sample4.pdf");doc.Close();//Launching the Pdf file.PDFDocumentViewer("Sample4.pdf");}

6.Image转换为PDF:

 public void ImageToPdf(){//Create a pdf document.PdfDocument doc = new PdfDocument();// Create one pagePdfPageBase page = doc.Pages.Add();//Draw the textpage.Canvas.DrawString("Hello, World!",new PdfFont(PdfFontFamily.Helvetica, 30f),new PdfSolidBrush(Color.Black),10, 10);//Draw the imagePdfImage image = PdfImage.FromFile(@"..\..\..\..\..\..\Data\SalesReportChart.png");float width = image.Width * 0.75f;float height = image.Height * 0.75f;float x = (page.Canvas.ClientSize.Width - width) / 2;page.Canvas.DrawImage(image, x, 60, width, height);//Save pdf file.doc.SaveToFile("Image.pdf");doc.Close();//Launching the Pdf file.PDFDocumentViewer("Image.pdf");}

以上提供了对网站发起HTTP请求,获取网站页面信息,以及采用Spire.PDF组件创建PDF文档。如果有需要可以直接将HTTP请求获取到的信息直接加载如Spire.PDF的组件中,

由组件直接将网页信息转化为PDF文件,在这里就不再做更多的赘述,由于官方提供了很完善的demo和操作文档,在这里就不再过多的介绍使用方法。

四.总结:

以上介绍了一款收费不开源的组件,没有更多的深入的去介绍,由于组件不开源,无法进行反编译,毕竟存在版权问题,如果需要使用到企业级的文档操作组件,并且公司不缺钱的话,可以使用一下此组件,组件的底层方法封装度较高,所以在使用的时候,开发者所需要考虑的是如何去使用组件完成功能。

个人认为软件收费应该是趋势,毕竟任何软件都是需要投入,无论是人力成本,还是资金和时间成本。本文虽然是一篇介绍技术的文章,但是也提出了一个所有开发者都在想的问题,在项目开发中到底需不需要使用收费的软件,其实这个就是看使用环境。

.NET组件介绍系列:

一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)http://www.cnblogs.com/pengze0902/p/6122311.html

高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)http://www.cnblogs.com/pengze0902/p/6125570.html

最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)http://www.cnblogs.com/pengze0902/p/6124659.html

免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)http://www.cnblogs.com/pengze0902/p/6134506.html

免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)http://www.cnblogs.com/pengze0902/p/6128558.html

免费高效实用的Excel操作组件NPOI(.NET组件介绍之六)http://www.cnblogs.com/pengze0902/p/6150070.html

转载于:https://www.cnblogs.com/pengze0902/p/6125570.html

高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)相关推荐

  1. 高效又稳定的ChatGPT大模型训练技巧总结,让训练事半功倍!

    文|python 前言 近期,ChatGPT成为了全网热议的话题.ChatGPT是一种基于大规模语言模型技术(LLM, large language model)实现的人机对话工具.现在主流的大规模语 ...

  2. spire.office,Spire.Office 5.3.7组件的最新版本

    spire.office,Spire.Office 5.3.7组件的最新版本 Spire.Office是面向.NET程序员的有用Office组件的集合.该集合包含.NET,wpf和Silverligh ...

  3. vue 拓扑组件_Authing 登录组件优化实践解析

    Authing Guard 是一种可嵌入的登录表单,可根据你的需求进行配置,它使你可以轻松添加各种社会化登录方式,以便你的用户可以无缝登录,并且在不同平台拥有一致的登录体验. Authing 2.0 ...

  4. vue中子组件和子组件之间怎么通信_vue.js组件之间如何通信?

    vue.js组件之间如何通信?下面本篇文章就来给大家介绍一下Vue.js组件间通信方式.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 平时在使用Vue框架的业务开发中,组件不仅仅要 ...

  5. 组件化实践详解(二)

    在上一篇文章<组件化实践详解(一)>中我们介绍了组件化实践的目标和实践步骤,本文继续说说关于组件化实践遇到的问题及思考. 1.组件内的架构设计 这条本来我是不想写的,但是很多组件化的文章里 ...

  6. JS组件系列——表格组件神器:bootstrap table

    前言:之前一直在忙着各种什么效果,殊不知最基础的Bootstrap Table用法都没有涉及,罪过,罪过.今天补起来吧.上午博主由零开始自己从头到尾使用了一遍Bootstrap Table ,遇到不少 ...

  7. linux启动nifi指令,Nifi 组件脚本开发 - ExecuteScript 使用指南 (二)

    Nifi 组件脚本开发 - ExecuteScript 使用指南 (二) 浅谈 Java 的反射原理 摘要: Java 的编译过程 谈及反射, 不得不先了解一下, java 的整个编译过程, 整体的 ...

  8. 【Day13】说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等)

    说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等) 一.父组件向子组件传值 二.子组件向父组件传值 三.兄弟组件传值 四.跨组件 一.父组件向子组件传值 1.1 prop ...

  9. react 组件中使用组件_禁止使用React功能组件的7个理由

    react 组件中使用组件 Are React's Functional Components Worth The Cost? React的功能组件值得吗? Update 5/31/19: React ...

最新文章

  1. 关于重构,看此文就够了
  2. CentOS 6安装详解及PXE 安装
  3. 从源码编译Chrome(chromium)
  4. 【英语学习】【Python】Programming in Python 3 的目录
  5. SpringCloud工作笔记050---关于同一账号多人同时登录的token重复问题
  6. 猛龙出击•东莞赛区新闻发布会隆重举行,粤港澳大湾区将迎来首场搏击盛宴...
  7. 专科python应届生工资多少-请问学过一点python,应届生怎么找工作?
  8. UnityShader11:纹理属性
  9. C++ make_shared() shared_ptr()用法
  10. 【图像融合】基于matlab IHS变换与自适应区域特征遥感图像融合【含Matlab源码 1636期】
  11. 编译PBRT-v3源码
  12. 逛Github网站显示中文教程
  13. stata面板数据gmm回归_12短动态面板数据模型1-差分GMM估计-Stata软件操作教程
  14. 五角星是不是旋转对称图形_在线等。很简单,五角星是不是中心对称图形?
  15. Android控件浮在最上层的方法
  16. 联想y430p黑苹果之自定义屏幕亮度
  17. redirect(重定向)和forward(转发)的区别
  18. 十年后,我终于读懂了紫霞那滴留在至尊宝心中的泪
  19. IoT物联网平台如何实现大规模设备的高效控制?
  20. 关于云计算资源调度的一些思考

热门文章

  1. pandas系列学习(五):数据连接
  2. 使用指针实现strcpy函数的功能
  3. VC6工程转VC9工程常见错误
  4. python正则表达式是什么意思_理解python正则表达式
  5. 基于单片机超声波控制电机转动系统设计
  6. SharePoint 2019 Announced: 最新信息
  7. 读此一席话,胜读十年书:最牛情场职场语录大全
  8. 4-逻辑控制器:Logic Controller
  9. Android图片内存的计算
  10. 水利水电课程指导之建筑制图基础_第三章