当前位置: 首页 > news >正文

将HTML转换为PDF:使用Spire.Doc的详细指南(一) 试用版

目录

引言

1. 为什么选择 Spire.Doc?

1.1 主要特点

1.2 适用场景

2. 准备工作

2.1 引入 Spire.Doc 依赖

2.2 禁用 SSL 证书验证

3. 实现功能

3.1 主类结构

3.2 代码解析

4. 处理图像

5. 性能优化

5.1 异步下载图像

示例代码

5.2 批量处理优化

示例代码

6. 错误处理与日志管理

6.1 错误处理

示例代码

6.2 日志管理

示例代码

7. 总结


引言

在现代软件开发中,生成 PDF 文档的需求日益增长,尤其是在金融、教育、医疗等行业。PDF 格式以其固定的外观和出色的可移植性受到广泛欢迎。本文将详细介绍如何使用 Spire.Doc 库将 HTML 文件转换为 PDF 文件。本文包括完整代码示例、相关依赖管理,以及对过程中的关键概念的深入探讨。

1. 为什么选择 Spire.Doc?

Spire.Doc 是一款强大的 .NET 文档处理库,支持多种文档格式的创建、编辑和转换。使用 Spire.Doc 可以简化 HTML 转 PDF 的过程,支持复杂的 HTML 内容,包括图片、样式和链接等。

1.1 主要特点

  • 无依赖:Spire.Doc 不依赖于 Microsoft Office,可以直接在服务器端运行。
  • 高性能:能够快速处理和转换文档。
  • 易于使用:提供友好的 API 接口,便于开发者快速上手。

1.2 适用场景

  • 生成报表:将动态生成的 HTML 报告转换为 PDF。
  • 文档归档:将在线文档归档为 PDF,便于存储和分发。
  • 邮件发送:将用户生成的内容转换为 PDF,并通过邮件发送。

2. 准备工作

在开始之前,请确保你的开发环境中已配置 Java,并安装了 IDE(如 IntelliJ IDEA 或 Eclipse)。接下来,需要在项目中添加 Spire.Doc 依赖。

2.1 引入 Spire.Doc 依赖

在你的项目中,可以通过 Maven 引入 Spire.Doc,如下所示:

<dependency>  <groupId>e-iceblue</groupId>  <artifactId>spire.doc.free</artifactId>  <version>5.2.0</version>  
</dependency>

2.2 禁用 SSL 证书验证

在处理一些需要 HTTPS 连接的 HTML 内容时,可能会遇到 SSL 证书验证问题。为了避免这些问题,可以临时禁用 SSL 验证。下面是一个实现示例:

public static void disableSSLVerification() {  try {  TrustManager[] trustAllCerts = new TrustManager[]{  new X509TrustManager() {  public X509Certificate[] getAcceptedIssuers() {  return null;  }  public void checkClientTrusted(X509Certificate[] certs, String authType) {  }  public void checkServerTrusted(X509Certificate[] certs, String authType) {  }  }  };  SSLContext sc = SSLContext.getInstance("SSL");  sc.init(null, trustAllCerts, new java.security.SecureRandom());  HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());  HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);  } catch (Exception e) {  e.printStackTrace();  }  
}

3. 实现功能

接下来,我们将实现一个完整的 Java 类,通过读取 HTML 文件,将其转换为 PDF。在这个过程中,我们将重点介绍文件读取、HTML 内容处理和 PDF 文件生成的步骤。

3.1 主类结构

以下是我们的主类 DocToPdfConverter 的结构,这里包含了所有必要的方法:

package com.dahua.saas.illegalpunish.controller;  import com.spire.doc.Document;  
import com.spire.doc.FileFormat;  
import com.spire.doc.Section;  import javax.net.ssl.*;  
import java.security.cert.X509Certificate;  
import java.io.BufferedReader;  
import java.io.FileReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.net.HttpURLConnection;  
import java.net.URL;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  public class DocToPdfConverter {  public static void main(String[] args) throws IOException {  disableSSLVerification();  String inputHtml = "C:\\cloud\\dahua\\VIASBIllegalPunish\\file\\1912202400018.doc";  Document doc = new Document();  Section sec = doc.addSection();  String htmlText = readTextFromFile(inputHtml);  sec.addParagraph().appendHTML(replaceImagesWithHighRes(htmlText));  doc.saveToFile("C:\\cloud\\dahua\\VIASBIllegalPunish\\file\\1912202400018.pdf", FileFormat.PDF);  doc.dispose();  }  // 读取文本文件内容  public static String readTextFromFile(String fileName) throws IOException {  StringBuilder sb = new StringBuilder();  BufferedReader br = new BufferedReader(new FileReader(fileName));  String content;  while ((content = br.readLine()) != null) {  sb.append(content);  sb.append(System.lineSeparator());  }  return sb.toString();  }  // 替换 HTML 文本中的图片链接为高分辨率图像  public static String replaceImagesWithHighRes(String html) {  String imageUrlPattern = "https?://[^\\s\"'<>]+";  Pattern pattern = Pattern.compile(imageUrlPattern);  Matcher matcher = pattern.matcher(html);  StringBuffer resultHtml = new StringBuffer();  while (matcher.find()) {  String imageUrl = matcher.group();  String highResImage = downloadImage(imageUrl);  matcher.appendReplacement(resultHtml, highResImage);  }  matcher.appendTail(resultHtml);  return resultHtml.toString();   }  // 下载图片,返回高分辨率的图像数据  public static String downloadImage(String imageUrl) {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  // 这里可以实现将输入流转换为适合插入 PDF 的格式  return imageUrl; // 现在只是返回原始 URL  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  }  
}

3.2 代码解析

  • 禁用 SSL 验证:通过调用 disableSSLVerification() 方法来忽略 SSL 证书验证,以便可以访问 HTTP 和 HTTPS 内容。

  • 读取 HTML 文件:使用 readTextFromFile() 方法读取指定路径下的 HTML 文件。这个方法使用 BufferedReader 逐行读取,最终返回一个完整的 HTML 内容字符串。

  • 处理图片链接:在 replaceImagesWithHighRes() 方法中,首先通过正则表达式查找所有的图片链接,然后下载高分辨率的图片。在这里,具体的下载逻辑需要根据实际情况实现,例如可以选择将图像转换为 Base64 格式,并替换 HTML 内容中的 src 属性以达到嵌入图像的效果。

  • 生成 PDF:使用 Spire.Doc 库创建一个新的 Document 对象,并添加一个 Section,然后通过 appendHTML() 方法将处理后的 HTML 内容添加到文档中。最后,调用 saveToFile() 方法将文档保存为 PDF 格式的文件。

4. 处理图像

在本示例中,downloadImage 方法返回的是原始的图像 URL。在实际应用中,您可能需要将下载的图片以适当的格式嵌入 PDF,例如将其转换为 Base64 字符串。下面是一个简单的实现示例:

public static String downloadImage(String imageUrl) {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  // Convert InputStream to byte array  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image; // Assuming image is PNG  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  
}

5. 性能优化

在处理大量图像时,批量处理或异步下载可以显著提高程序的性能和响应速度。以下是一些优化建议和具体实现策略。

5.1 异步下载图像

使用 Java 的并发 API,可以实现异步下载图像。这意味着在处理 HTML 的同时,可以在后台下载图像,不阻塞主线程。

示例代码

使用 CompletableFuture 来实现异步下载图像的能力:

import java.util.concurrent.CompletableFuture;  public static CompletableFuture<String> downloadImageAsync(String imageUrl) {  return CompletableFuture.supplyAsync(() -> {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image; // 假设图像为 PNG  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  });  
}

然后在 replaceImagesWithHighRes() 方法中,使用 Java 的流处理来启动异步下载:

public static String replaceImagesWithHighRes(String html) {  String imageUrlPattern = "https?://[^\\s\"'<>]+";  Pattern pattern = Pattern.compile(imageUrlPattern);  Matcher matcher = pattern.matcher(html);  List<CompletableFuture<String>> futures = new ArrayList<>();  StringBuffer resultHtml = new StringBuffer();  while (matcher.find()) {  String imageUrl = matcher.group();  CompletableFuture<String> future = downloadImageAsync(imageUrl);  futures.add(future);  matcher.appendReplacement(resultHtml, ""); // 先将占位符放入结果 HTML  }  matcher.appendTail(resultHtml);  // 等待所有图像下载完成  CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));  allOf.join();  // 等待所有 CompletableFuture 完成  // 用下载后的图像替换  for (int i = 0; i < futures.size(); i++) {  try {  String downloadedImage = futures.get(i).get(); // 获取下载过的图像  String placeholder = ""; // 这里可以根据需要生成占位符  // 将占位符替换为实际的图像  resultHtml = new StringBuffer(resultHtml.toString().replaceFirst(Pattern.quote(placeholder), downloadedImage));   } catch (Exception e) {  e.printStackTrace();  }  }  return resultHtml.toString();   
}

通过以上方式,您可以实现图像的异步下载,从而提升程序的性能,特别是在处理大量数据时。

5.2 批量处理优化

如果 HTML 文件中包含大量的图像,您还可以采取以下措施进行批量处理:

  • 限制并发量:在实际运行中,尤其是在网络条件不确定的情况下,限制并发请求的数量可以避免请求过载和资源竞争。可以使用 Java 的信号灯(Semaphore)来控制并发。
示例代码
import java.util.concurrent.Semaphore;  private static final Semaphore semaphore = new Semaphore(5); // 最多允许 5 个并发下载  public static CompletableFuture<String> downloadImageAsync(String imageUrl) {  return CompletableFuture.supplyAsync(() -> {  try {  semaphore.acquire(); // 获取信号量  try {  // 文章前面提到的下载逻辑  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image;  } finally {  semaphore.release(); // 释放信号量  }  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  });  
}

通过这种方式,您可以控制并发量,从而降低服务器负载和提高下载成功率。

6. 错误处理与日志管理

在处理网络请求和文件操作时,错误处理至关重要。应确保在项目中实现有效的日志记录和错误处理机制。

6.1 错误处理

确保任何网络请求、文件读取和转换操作都能妥善处理异常情况。以下是一些建议:

  • 捕获并记录异常:应在每个网络请求和文件操作中捕获异常并记录详细信息,以便后期调试。
  • 使用重试机制:对于短暂的网络问题,可以使用重试逻辑重新尝试下载图像。
示例代码
public static String downloadImageWithRetry(String imageUrl, int retryCount) {  for (int i = 0; i < retryCount; i++) {  try {  return downloadImage(imageUrl); // 使用之前定义的下载逻辑  } catch (IOException e) {  if (i == retryCount - 1) {  e.printStackTrace(); // 记录最终失败的情况  }  }  }  return imageUrl; // 默认返回原始的 URL  
}

6.2 日志管理

可以使用日志框架(如 SLF4J、Log4j)来进行日志管理。将日志记录在适当的级别(例如 INFO、WARN、ERROR),可以帮助开发人员在出现问题时快速定位。

示例代码
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  public class DocToPdfConverter {  private static final Logger logger = LoggerFactory.getLogger(DocToPdfConverter.class);  public static void main(String[] args) {  try {  // 主逻辑  } catch (Exception e) {  logger.error("Error occurred during PDF conversion", e);  }  }  
}

7. 总结

本文介绍了如何使用 Spire.Doc 将 HTML 文件转换为 PDF 的详细过程。我们探讨了图像处理方法,包括同步和异步下载,并提供了实用的性能优化建议。此外,我们还强调了错误处理和日志管理的重要性,以增强代码的健壮性。

应用这些技术,您将能够高效地处理 HTML 文档,转化为高质量的 PDF 格式,满足现代软件开发中的各种需求。如需进一步信息或帮助,欢迎随时联系我解答您的疑问。希望本文能够为您的开发工作提供实用的参考和指导!

相关文章:

将HTML转换为PDF:使用Spire.Doc的详细指南(一) 试用版

目录 引言 1. 为什么选择 Spire.Doc&#xff1f; 1.1 主要特点 1.2 适用场景 2. 准备工作 2.1 引入 Spire.Doc 依赖 2.2 禁用 SSL 证书验证 3. 实现功能 3.1 主类结构 3.2 代码解析 4. 处理图像 5. 性能优化 5.1 异步下载图像 示例代码 5.2 批量处理优化 示例代…...

【物联网技术与应用】实验10:蜂鸣器实验

实验10 蜂鸣器实验 【实验介绍】 蜂鸣器是音频信号装置。蜂鸣器可分为有源蜂鸣器和无源蜂鸣器。 【实验组件】 ● Arduino Uno主板* 1 ● USB数据线* 1 ● 有源蜂鸣器* 1 ● 无源蜂鸣器* 1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 如图所示&#x…...

【python高级】342-TCP服务器开发流程

CS模式&#xff1a;客户端-服务端模式 TCP客户端开发流程介绍&#xff08;五步&#xff09;&#xff08;C端&#xff09; 1.创建客户端套接字对象 2.和服务端套接字建立连接 3.发送数据 4.接收数据 5.关闭客户端套接字 TCP服务端开发流程&#xff08;七步&#xff09;&#xf…...

C++开源项目 VLC 源代码的交叉编译以及库的裁剪方法详解

目录 1、VLC简介 2、VLC编译环境配置 2.1、编译环境 2.2、编译环境配置 2.2.1、下载安装MSYS2 2.2.2、下载mingw-w64 3、编译VLC 4、VLC库的裁剪 5、总结 C软件异常排查从入门到精通系列教程&#xff08;核心精品专栏&#xff0c;订阅量已达600多个&#xff0c;欢迎订…...

draw.io 导出svg图片插入word后模糊(不清晰 )的解决办法

通常我们将图片从draw.io导出为svg格式后插入word, 会发现字体不清晰&#xff0c;特别是使用宋体时&#xff0c;折腾了半天&#xff0c;得到如下办法&#xff1a; 方法1: 在draw.io中导出pdf文件&#xff0c;使用 PDF转SVG转换器 - SVGConverter 将其转换为svg, 完美呈现。 …...

详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用

目录 详解js柯里化原理及用法&#xff0c;探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用 一、什么是柯里化&#xff1f; 1、原理解析 2、一个直观的例子 二、如何实现柯里化&#xff1f; 1、底层实现 2、工作原理解析 3…...

Cesium材质——Material

简介&#xff1a; Cesium.Material对象的目的&#xff0c;就是生成一段名称为czm_getMaterial的函数&#xff08;示例代码如下&#xff09;&#xff0c; 这个czm_getMaterial函数&#xff0c;是shader代码&#xff0c;会被放到片元着色器中使用。 czm_material czm_getMater…...

《点点之歌》“意外”诞生记

世界是“点点”的&#xff0c;“点点”是世界的。 (笔记模板由python脚本于2024年12月23日 19:28:25创建&#xff0c;本篇笔记适合喜欢诗文的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 …...

统计某个文件中某个字符串出现的次数

要统计某个文件中某个字符串出现的次数&#xff0c;有多种方法可以实现。以下是几种常用且高效的 Linux 命令方法&#xff1a; 方法一&#xff1a;使用 grep 和 wc 命令示例&#xff1a; grep -o "字符串" 文件名 | wc -l说明&#xff1a; grep -o "字符串&…...

C++简明教程(文章要求学过一点C语言)(3)

一、编程工具大揭秘——IDE 当我们准备踏入 C 编程的奇妙世界时&#xff0c;首先要认识一个重要的“魔法盒子”——集成开发环境&#xff08;IDE&#xff09;。IDE 就像是一个全能的编程工作室&#xff0c;它把我们写代码所需要的各种工具都整合到了一起&#xff0c;让编程这件…...

Springboot高并发乐观锁

Spring Boot分布式锁的主要缺点包括但不限于以下几点&#xff1a; 性能开销&#xff1a;使用分布式锁通常涉及到网络通信&#xff0c;这会引入额外的延迟和性能开销。例如&#xff0c;当使用Redis或Zookeeper实现分布式锁时&#xff0c;每次获取或释放锁都需要与这些服务进行交…...

编译原理复习---正则表达式+有穷自动机

适用于电子科技大学编译原理期末考试复习。 1. 正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称regex或regexp&#xff09;是一种用于描述、匹配和操作文本模式的强大工具。它由一系列字符和特殊符号组成&#xff0c;这些字符和符号定义了一种搜索模式…...

如何使用ChatGPT辅助文献综述,以及如何进行优化?一篇说清楚

目录 1.写在开头 2.ChatGPT 3.提示词研究 4.第一轮研究 5.第二轮研究 6.生成文献综述 嘿宝子们&#xff01;今天我们要聊的&#xff0c;可是个让学术圈都为之振奋的话题——ChatGPT辅助文献综述。这个教育界的新宠儿&#xff0c;已经不满足于仅仅在学习和教学中露两手了&…...

ZZNUOJ 1601:字母序号(C/C++/Java)

题目描述 我们把字母 A-Z 分别编号为 1-26, 现在给你一个大写字母, 输出这个大写字母的序号。 输入 输入一个大写字母 输出 输出这个大写字母的序号 样例输入 C 样例输出 3 常见的ASCII值 ASCII表中可以记下部分特殊的值(十进制)(字母从A到Z,从a到z,ASCII值依次递增)...

[CISCN 2021初赛]rsa

[CISCN 2021初赛]rsa 源代码&#xff1a; from flag import text,flag import md5 from Crypto.Util.number import long_to_bytes,bytes_to_long,getPrimeassert md5.new(text).hexdigest() flag[6:-1]msg1 text[:xx] msg2 text[xx:yy] msg3 text[yy:]msg1 bytes_to_lo…...

Electron -- Electron Fiddle(一)

Electron Fiddle 是一个由 Electron 团队开发的开源工具&#xff0c;它允许开发者快速创建、运行和调试 Electron 应用。这个工具提供了一个简洁的界面&#xff0c;使用户无需配置复杂的开发环境&#xff0c;就能快速体验和学习 Electron。强烈建议将其安装为学习工具。 学习它…...

java 实现排序的几种方式

冒泡排序(Bubble Sort) 基本原理&#xff1a; 它重复地走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。 示例代码如下&#xff1a; 登…...

【机器学习与数据挖掘实战】案例06:基于Apriori算法的餐饮企业菜品关联分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…...

陀螺仪选型

瑞芬官网 datasheet 陀螺仪、IMU姿态仪、陀螺转角仪、三轴姿态仪、三轴陀螺仪 mid360 imu ICM-40609-D TDK InvenSense | Mouser https://product.tdk.com/system/files/dam/doc/product/sensor/mortion-inertial/imu/data_sheet/ds-000330_icm-40609-d_v1.2.pdf...

【超详细实操内容】django的身份验证系统之限制用户访问的三种方式

目录 1、使用request.user.is_authenticated属性 2、装饰器login_required 3、LoginRequiredMixin类 通常情况下,网站都会对用户限制访问,例如,未登录的用户不可访问用户中心页面。Django框架中使用request.user.isauthenticated属性、装饰器loginrequired和LoginRequire…...

Pika Labs技术浅析(六):自动化技术

Pika Labs 的自动化技术旨在通过工作流引擎和自动化警报系统&#xff0c;帮助用户实现业务流程的自动化和实时监控。 一、自动化技术模块概述 Pika Labs 的自动化技术模块旨在通过以下两个核心组件&#xff0c;实现业务流程的自动化和实时监控&#xff1a; 1.工作流引擎&…...

springboot471基于协同过滤算法商品推荐系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装协同过滤算法商品推荐系统软件来发挥其高效地信息处理的作用…...

【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101错误

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802956.html?templateId1718516 问题现象 某客户的业务在通过YashanDB jdbc驱动查询含有st_geometry列的数据时&#xff0c;报如下异常&#xff1a;YAS-00101 cannot allocate 0 byte…...

ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。

在 Web 开发中&#xff0c;GET 和 POST 是两种常见的 HTTP 请求方法&#xff0c;它们有一些显著的区别。此外&#xff0c;datatype 参数在 jQuery 的 ajax() 请求中指定了预期的响应数据类型。接下来&#xff0c;我会详细解释这些问题。 1. GET 和 POST 请求的区别 GET 请求 和…...

EKF异常状态自检

https://wenku.csdn.net/column/25p1jkf4vz https://www.zhihu.com/question/293038308/answers/updated https://zhuanlan.zhihu.com/p/12011086094 常用数据分析方法&#xff1a;方差分析及实现&#xff01;-腾讯云开发者社区-腾讯云 方差分析的七种类型_双因素方差分析 自变…...

《解析 MXNet 的 C++版本在分布式训练中的机遇与挑战》

在深度学习的广袤领域中&#xff0c;分布式训练已成为应对大规模数据和复杂模型训练需求的关键手段。MXNet 作为一款备受瞩目的深度学习框架&#xff0c;其 C版本在分布式训练方面展现出独特的魅力&#xff0c;同时也面临着诸多挑战。深入探究这些优势与挑战&#xff0c;对于推…...

UVM学习总结

问题1&#xff1a;同时出现几个相同的uvm_config_de()哪个有效&#xff1f; UVM中的配置对象是通过uvm_config_db类实现的。uvm_config_db类使用一对名称和值来存储配置信息。当多个uvm_config_db.call()调用同时提供相同名称的配置时&#xff0c;最后一个调用将覆盖之前的调用…...

TCP/IP 介绍:网络通信的基石

TCP/IP 介绍&#xff1a;网络通信的基石 计算机通信协议概述 在数字时代&#xff0c;计算机之间的通信变得至关重要。计算机通信协议&#xff08;Computer Communication Protocol&#xff09;是一套规则&#xff0c;定义了计算机如何相互交流信息。这些协议确保了不同制造商…...

华为IPD流程6大阶段370个流程活动详解_第二阶段:计划阶段 — 86个活动

华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…...

基于Spring Boot的建材租赁系统

一、系统背景与目的 随着建筑行业的快速发展&#xff0c;建材租赁需求日益增加。传统的建材租赁管理方式大多依赖于纸质文档或简单的电子表格&#xff0c;不仅效率低下&#xff0c;还容易出现信息遗漏和错误。为了解决这些问题&#xff0c;基于Spring Boot的建材租赁系统应运而…...

YOLO v5 Series - MQTT

MQTT...

uni-app开发订单列表页面

目录 一:功能描述 二:功能实现 一:功能描述 订单列表页面包含三个部分,最上面显示订单的状态信息,可以根据订单进行切换,中间显示订单的商品和价格信息,最下面显示订单的操作按钮,可以根据不同的状态操作订单。 二:功能实现 1:状态切换 <view class="nav-…...

14,攻防世界Web_php_unserialize

进入场景 看见代码&#xff0c;解析一下 这段PHP代码定义了一个名为Demo的类&#xff0c;并演示了如何通过URL参数进行反序列化和文件高亮显示的功能&#xff0c;同时也包含了一些安全措施以防止对象注入攻击。下面是对这段代码的逐行解释&#xff1a; 1.<php 开始PHP代码…...

基于单片机的电梯声控系统设计(论文+源码)

1.系统设计 在目前的高楼住宅&#xff0c;商业大厦中电梯是不可或缺的&#xff0c;而传统的电梯控制器系统&#xff0c;通常需要用户用手去按下按键进行控制&#xff0c;但是这种方式在有些情况下&#xff0c;并不完善&#xff0c;比如在本次新冠疫情期间&#xff0c;由于新冠…...

宠物用品电子商务系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

每日一题 341. 扁平化嵌套列表迭代器

341. 扁平化嵌套列表迭代器 展开成数组来解题 class NestedIterator {vector<int> nums;int idx;void flattened(vector<NestedInteger> &nestedList){for(int i0;i<nestedList.size();i){if(nestedList[i].isInteger()){nums.push_back(nestedList[i].get…...

小程序 - 模拟时钟

微信小程序常用API练习 - 模拟时钟小程序开发笔记 模拟时钟 “模拟时钟”微信小程序是一个简约风格的动态时钟&#xff0c;该时钟时间与系统时间一致&#xff0c;且时针、分针、秒针会与系统时间同步更新&#xff0c;用户可以很方便地查看时间。下面将对“模拟时钟”微信小程序…...

UDP的报文结构和特点

1.UDP传输协议的特点 使用UDP传输协议进行通信&#xff0c;过程类似于寄信&#xff0c;它的特点如下&#xff1a; 无连接&#xff1a;知道对端的IP号和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b;不可靠&#xff1a;没有可靠机制&#xff0c;发送数据包以后&a…...

如何在服务器上克隆、pull、push GitHub私有项目

诸神缄默不语-个人CSDN博文目录 情况是这样的&#xff0c;我直接用git clone命令后&#xff0c;会提示让我输入GitHub账号密码&#xff0c;我输入后它还是显示克隆失败&#xff0c;并显示&#xff1a; Cloning into folder_name... Username for https://github.com: user_na…...

mybatis 动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架&#xff0c;你应该能理解根据不同条件拼接 SQL 语句有多痛苦&#xff0c;例如拼接时要确保不能忘记添加必要的空格&#xff0c;还要注意去掉列表最后一个列名的逗号。利用动态 SQL&#xff0c;可以彻底…...

LeetCode 1661. 每台机器的进程平均运行时间

LeetCode 1661. 每台机器的进程平均运行时间 表: Activity ----------------------- | Column Name | Type | ----------------------- | machine_id | int | | process_id | int | | activity_type | enum | | timestamp | float | ----------------------- 该表展示了一家工厂…...

【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结

文章目录 生产者端&#xff08;消息发布端&#xff09;保证机制RabbitMQ服务器端保证机制消费者端&#xff08;消息接收端&#xff09;保证机制除了MQ自带的机制&#xff0c;还能做的操作持久化的原理ACK思想 更多相关内容可查看 消息从发送&#xff0c;到消费者接收&#xff0…...

在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、翻译环境和运行环境二、翻译环境1.编译预处理编译汇编 2.链接 三、运行环境 一、翻译环境和运行环境 在 ANSI C 的任何⼀种实现中&am…...

Codeforces Round 994 (Div. 2)-D题

题目链接:https://codeforces.com/contest/2049/problem/D 题目大意是在开始移动之前,可以任意次将一行元素向左挪一格,代价是1,开始游戏后,只能向下走或者向右走,直到走到终点,问最小代价是多少. constexpr ll inf 1E18; void solve() {int n, m, K;std::cin >> n &g…...

【计算机视觉】opencv-停车位检测原理及代码演示

概述 本文介绍了一种基于OpenCV库的停车场空位检测方法。通过本项目演示&#xff0c;可以对opencv库有更深刻的理解。文章详细阐述了检测原理、算法流程以及代码实现。 一、原理介绍 基于OpenCV的停车位检测原理涉及多个图像处理步骤&#xff0c;以下将结合相关公式详细介绍每…...

C++面向对象三大特征之一 ——(多态)

C面向对象三大特征之一 ——多态 一. 多态的概念二. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写虚函数重写的两个例外&#xff1a; 2.4 C11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 三. 抽象类接口继承和实现继承 四.多态的原理4.1虚函数…...

HTTP协议及安全防范

由于图片解析问题&#xff0c;可以点击查看 &#x1f449;&#x1f3fb; 博客原文 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议&#xff0c;客户端通过发送请求到服务器来获取…...

JVM简介—1.Java内存区域

1.运行时数据区的介绍 (1)运行时数据区的定义 Java虚拟机在执行Java程序的过程中&#xff0c;会把它所管理的内存划分为若干个不同的数据区域&#xff0c;这些区域各有各的用途以及各自的创建和销毁时间也不一样。有的区域会随着虚拟机的进程启动而存在&#xff0c;有的区域则依…...

IPC协议获取签名信息

一&#xff1a;IPC协议获取签名信息详解 目录 什么是IPC协议&#xff1f;签名信息概述IPC协议中签名信息获取的流程相关知识点 数字签名原理常见签名算法数据完整性与认证签名的生成与验证IPC中的安全传输 应用场景总结 什么是IPC协议&#xff1f; IPC&#xff08;Inter-Pro…...

高校就业管理系统:数据驱动的就业服务创新

1 Java语言 Java语言是目前最流行的语言之一&#xff0c;不仅可以做桌面窗口形式的程序&#xff0c;还可以做浏览器访问的程序&#xff0c;目前最流行的就是用Java语言作为基础&#xff0c;做各种程序的后台处理。Java语言是操作变量的语言&#xff0c;而变量则是Java对于数据存…...