详解高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)

在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“。毕竟现在的很多办公中大都是在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 AspectRatio

  public enum Clip

  [ToolboxItem(false)]
  public class HtmlConverter : UserControl, sprᰐ, sprᶪ, sprṳ, sprẝ, sprẏ

  public enum ImageType

  public 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操作的相关类和方法的查看,由于此软件为商业软件,只能查看部分对外公开的代码,但是从可以查看到的代码就可以看出其内部实现的复杂度。

三.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;
        //是否允许302
        httprequst.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
* 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 page
      PdfPageBase page = doc.Pages.Add();
      float pageWidth = page.Canvas.ClientSize.Width;
      float y = 0;

      //page header
      PdfPen 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);

      //title
      y = 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;

      //icon
      PdfImage 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 content
      PdfTrueTypeFont 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;

      //content
      PdfStringFormat 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 file
      String file = @"..\..\..\..\..\..\Data\Sample4.xps";

      //open xps document
      PdfDocument 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 page
      PdfPageBase page = doc.Pages.Add();

      //Draw the text
      page.Canvas.DrawString("Hello, World!",
                  new PdfFont(PdfFontFamily.Helvetica, 30f),
                  new PdfSolidBrush(Color.Black),
                  10, 10);
      //Draw the image
      PdfImage 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和操作文档,在这里就不再过多的介绍使用方法。

四.总结:

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

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

(0)

相关推荐

  • WinForm中如何预览Office文件

    本文为大家分享了WinForm预览Office文档的方法,供大家参考,具体内容如下 使用WinForm, WPF, Office组件 原理:使用Office COM组件将Word,Excel转换为XPS文档, 将WPF的DocumentViewer控件寄宿到WinForm中, 实现预览. 1. 新建WinForm项目 2. 新建WPF用户控件, 注意是WPF控件 3. 编辑WPF用户控件 <UserControl ... ...> <Grid> <DocumentViewer

  • .NET实现在网页中预览Office文件的3个方法

    近日公司要搞一个日常的文档管理的东东,可以上传.下载各种文件,如果是office文件呢还必须得支持预览功能,其他的都好说但是唯独office预览功能比较麻烦,但是不能不做,废话不多说了一步步来吧.分析了下网易邮箱的文件预览功能,他用的是微软的组件,最早叫Office online,现在分开了叫Word online.Excel online ....等等,效果十分炫酷功能十分强大,但是查看了下对api的说明发现对服务器的要求比较苛刻而且配置比较复杂不太适合.然后 又看了下腾讯用的是永中第三方组件

  • asp.net中调用Office来制作3D统计图的实例代码

    1.首先下载owc11 COM组件 http://www.microsoft.com/downloads/details.aspx?FamilyID=7287252c-402e-4f72-97a5-e0fd290d4b76&displaylang=en 2.注册owc11 在工程中添加 C:/Program Files/Common Files/Microsoft Shared/Web Components/11  文件下的owc11.dll引用 3.在工程中添加 using OWC11; 4.

  • 详解高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)

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

  • 在Tensorflow中实现leakyRelu操作详解(高效)

    从github上转来,实在是厉害的想法,什么时候自己也能写出这种精妙的代码就好了 原地址:简易高效的LeakyReLu实现 代码如下: 我做了些改进,因为实在tensorflow中使用,就将原来的abs()函数替换成了tf.abs() import tensorflow as tf def LeakyRelu(x, leak=0.2, name="LeakyRelu"): with tf.variable_scope(name): f1 = 0.5 * (1 + leak) f2 =

  • 详解JavaScript如何创建一个非自动播放的GIF网络组件

    目录 一些很可爱的测试数据 构建Web组件 逻辑 结果 今天,我将向您展示如何创建一个允许您的用户决定是否要播放 gif 的 Web 组件!让我们开始吧. 一些很可爱的测试数据 这里用的gif是小骆驼和猫的这种可爱互动: 哇,太可爱了!我可以看一天这个 构建 Web 组件 对于这个 Web 组件,我们需要一些东西: 画布(“缩略图”所在的位置) 一张图片(实际的 gif) 标有“gif”的标签 一些造型 让我们这样做: const noAutoplayGifTemplate = document

  • 详解最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是使用者对于文件压缩的好处都是深有体会.至于文件压缩的原理,在我的另一篇博客中有简单的介绍,在这里就不再做介绍,需要了解的可以查看. .NET在System.IO.Compression命名空间中提供了GZip.Defalate两种压缩算法.今天我要介绍的一种压缩组件是DotNetZip组件. 一.D

  • 详解vue3.0 diff算法的使用(超详细)

    前言:随之vue3.0beta版本的发布,vue3.0正式版本相信不久就会与我们相遇.尤玉溪在直播中也说了vue3.0的新特性typescript强烈支持,proxy响应式原理,重新虚拟dom,优化diff算法性能提升等等.小编在这里仔细研究了vue3.0beta版本diff算法的源码,并希望把其中的细节和奥妙和大家一起分享. 首先我们来思考一些大中厂面试中,很容易问到的问题: 1 什么时候用到diff算法,diff算法作用域在哪里? 2 diff算法是怎么运作的,到底有什么作用? 3 在v-f

  • 详解用Python把PDF转为Word方法总结

    先讲一下为啥要写这个文章,网上其实很多这种PDF转化的代码和软件.我一直想用Python做,但是网上搜到的代码很多都不能用,很多是2.7版本的代码,再就是PDF需要用到的库在导入的时候,很多的报错,解决起来特别费劲,而且自从2021年初以来,似乎网上很少有关PDF转化的代码出现了.我在研究了很多代码和pdfminer的用法后,总结了几个方法,目前这几种方法可以解决大多数格式的转化,后面我也专门放了提取PDF表格的代码,文末有高效的免费在线工具推荐. 下面这个是我最最推荐的方法 ,简单高效 ,只要

  • 详解Java中的悲观锁与乐观锁

    一.悲观锁 悲观锁顾名思义是从悲观的角度去思考问题,解决问题.它总是会假设当前情况是最坏的情况,在每次去拿数据的时候,都会认为数据会被别人改变,因此在每次进行拿数据操作的时候都会加锁,如此一来,如果此时有别人也来拿这个数据的时候就会阻塞知道它拿到锁.在Java中,Synchronized和ReentrantLock等独占锁的实现机制就是基于悲观锁思想.在数据库中也经常用到这种锁机制,如行锁,表锁,读写锁等,都是在操作之前先上锁,保证共享资源只能给一个操作(一个线程)使用. 由于悲观锁的频繁加锁,

  • 详解MySQL的主键查询为什么这么快

    目录 1. 初探InnoDB行格式(ROW_FORMAT) 2. 引入InnoDB页 3. 数据页的结构 3.1 用户记录是如何存放的 3.2 番外:为什么推荐使用自增ID作为主键,而不推荐使用UUID? 3.3 数据页自带的两条伪记录 3.4 数据页中主键的高效查询方案 4. 重要!数据页的其他字段 这篇文章会让大家清楚地明白: 什么是InnoDB行格式?InnoDB页是什么? InnoDB页和InnoDB行格式都有哪些字段信息? 为什么推荐使用自增ID作为主键,而不推荐使用UUID? Inn

  • 详解处理Java中的大对象的方法

    目录 String中的substring 集合大对象扩容 保持合适的对象粒度 Bitmap 把对象变小 数据的冷热分离 数据双写 写入 MQ 分发 使用 Binlog 同步 思维发散 小结 本文我们将讲解一下对于“大对象”的优化.这里的“大对象”,是一个泛化概念,它可能存放在 JVM 中,也可能正在网络上传输,也可能存在于数据库中. 那么为什么大对象会影响我们的应用性能呢? 第一,大对象占用的资源多,垃圾回收器要花一部分精力去对它进行回收: 第二,大对象在不同的设备之间交换,会耗费网络流量,以及

  • 详解Java中AC自动机的原理与实现

    目录 简介 工作过程 数据结构 初始化 构建字典树 构建失败指针 匹配 执行结果 简介 AC自动机是一个多模式匹配算法,在模式匹配领域被广泛应用,举一个经典的例子,违禁词查找并替换为***.AC自动机其实是Trie树和KMP 算法的结合,首先将多模式串建立一个Tire树,然后结合KMP算法前缀与后缀匹配可以减少不必要比较的思想达到高效找到字符串中出现的匹配串. 如果不知道什么是Tire树,可以先查看:详解Java中字典树(Trie树)的图解与实现 如果不知道KMP算法,可以先查看:详解Java中

随机推荐