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

C# 提取PDF表单数据

目录

使用工具

C# 提取多个PDF表单域的数据

C# 提取特定PDF表单域的数据


PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用。然而,当需要整合、分析或导入大量已填写的表单数据时,传统的手动处理方式不仅耗时,而且容易出错。因此,掌握自动提取PDF表单数据的方法,不仅能大幅提高工作效率,还能确保数据处理的准确性。本文将探讨如何使用C# 实现自动化PDF表单数据提取流程。

  • 使用工具
  • C# 提取多个PDF表单域的数据
  • C# 提取特定PDF表单域的数据

使用工具

要使用C# 提取PDF表单的数据,需要用到合适的PDF文档处理库。本文所使用的是Spire.PDF for .NET库。该库主要用于在 .NET 应用程序中创建、读取、编辑、转换 和打印PDF 文档。

安装 Spire.PDF for .NET

你可以在 NuGet 包管理器中运行以下命令安装 Spire.PDF for .NET:

PM> Install-Package Spire.PDF

如果你已经安装了该库并希望升级到最新版本,可以使用以下命令:

PM> Update-Package Spire.PDF

C# 提取多个PDF表单域的数据

PDF 表单可能包含多种类型的域,例如文本框、列表框、下拉框、单选按钮和复选框。每种域类型需要采用不同的方法来提取其数据。以下是提取这些类型的域的数据时所使用的关键属性:

  • 文本框(Text Boxes
    通过 PdfTextBoxFieldWidget 对象的 Name 和 Text 属性,获取文本框的名称及其对应的值。
  • 列表框(List Boxes
    通过 PdfListBoxFieldWidget 对象的 Name、Values 和 SelectedValue 属性,提取列表框的名称、所有选项及选定的选项。
  • 下拉框(Combo Boxes
    通过 PdfComboBoxFieldWidget 对象的 Name、Values 和 SelectedValue 属性,获取下拉框的名称、所有选项及选定的选项。
  • 单选按钮(Radio Buttons
    通过 PdfRadioButtonListFieldWidget 对象的 Name 和 SelectedValue 属性,获取单选按钮的名称和选定的值。
  • 复选框(Checkboxes
    通过 PdfCheckBoxFieldWidget 对象的 Name 和 Checked 属性,提取复选框的名称及其状态(是否被选中)。

以下代码展示了如何使用 C# 从多个 PDF 表单域中提取数据:

using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;
using System.Collections.Generic;
using System.IO;namespace ExtractPdfFormData
{internal class Program{static void Main(string[] args){// 初始化 PdfDocument 类实例,用于加载和处理 PDF 文件using (PdfDocument doc = new PdfDocument()){// 加载包含表单域的 PDF 文件doc.LoadFromFile("表单.pdf");// 创建列表存储提取的域名称及其值List<string> content = new List<string>();// 获取 PDF 文档的表单对象PdfFormWidget formWidget = doc.Form as PdfFormWidget;// 检查表单对象中是否包含表单域if (formWidget?.FieldsWidget.Count > 0){// 遍历文档中的所有表单域for (int i = 0; i < formWidget.FieldsWidget.List.Count; i++){// 获取当前表单域PdfField field = formWidget.FieldsWidget[i];// 如果当前表单域为空,跳过该域if (field == null) continue;// 提取当前表单域的内容(名称和值)List<string> currentFieldContent = ExtractFieldContent(field);// 如果提取到域内容,则将其添加到 content 列表中if (currentFieldContent.Count > 0){content.AddRange(currentFieldContent);// 如果不是最后一个表单域,添加一个空行用于分隔不同域的内容if (i < formWidget.FieldsWidget.List.Count - 1){content.Add(""); // 添加空行分隔不同域的内容}}}}// 将提取的内容逐行写入文本文件File.WriteAllLines("提取域数据.txt", content);}}/// <summary>/// 提取单个 PDF 表单域的内容(域名和域值)/// 根据不同的表单域类型(文本框、列表框、下拉框、单选按钮、复选框)提取相应的值/// </summary>/// <param name="field">当前的 PDF 表单域对象</param>/// <returns>包含域内容的字符串列表</returns>private static List<string> ExtractFieldContent(PdfField field){// 初始化列表来存储当前表单域的内容List<string> fieldContent = new List<string>();// 检查该域是否为文本框if (field is PdfTextBoxFieldWidget textBoxField){fieldContent.Add($"文本框名称:{textBoxField.Name}");fieldContent.Add($"文本框值:{textBoxField.Text}");}// 检查该域是否为列表框else if (field is PdfListBoxWidgetFieldWidget listBoxField){fieldContent.Add($"列表框名称:{listBoxField.Name}");fieldContent.Add("列表框选项:");// 遍历并提取列表框中的所有选项foreach (PdfListWidgetItem item in listBoxField.Values){fieldContent.Add($"{item.Value}");}fieldContent.Add($"列表框选中项:{listBoxField.SelectedValue}");}// 检查该域是否为下拉框else if (field is PdfComboBoxWidgetFieldWidget comboBoxField){fieldContent.Add($"下拉框名称:{comboBoxField.Name}");fieldContent.Add("下拉框选项:");// 遍历并提取下拉框中的所有选项foreach (PdfListWidgetItem item in comboBoxField.Values){fieldContent.Add($"{item.Value}");}fieldContent.Add($"下拉框选中项:{comboBoxField.SelectedValue}");}// 检查该域是否为单选按钮else if (field is PdfRadioButtonListFieldWidget radioBtnField){fieldContent.Add($"单选按钮名称:{radioBtnField.Name}");fieldContent.Add($"单选按钮选中项:{radioBtnField.SelectedValue}");}// 检查该域是否为复选框else if (field is PdfCheckBoxWidgetFieldWidget checkBoxField){fieldContent.Add($"复选框名称:{checkBoxField.Name}");fieldContent.Add($"复选框状态:{(checkBoxField.Checked ? "选中" : "未选中")}");}// 返回当前表单域的内容return fieldContent;}}
}

C# 提取特定PDF表单域的数据

如果你需要从特定的表单域中提取数据,可以通过该表单域的名称直接访问它,然后通过判断其类型对应地获取其内容。

以下代码展示了如何使用C# 从名为 “国家” 的PDF表单域中提取数据:

using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;
using System.Collections.Generic;
using System.IO;namespace ExtractSpecificFormData
{internal class Program{static void Main(string[] args){// 初始化 PdfDocument 类实例,用于加载和处理 PDF 文件using (PdfDocument doc = new PdfDocument()){// 加载包含表单域的 PDF 文件doc.LoadFromFile("表单.pdf");// 创建列表来存储提取的表单域名称及其值List<string> content = new List<string>();// 获取 PDF 文档的表单对象PdfFormWidget formWidget = doc.Form as PdfFormWidget;// 指定域名称string fieldName = "国家";// 检查表单对象中是否包含表单域if (formWidget?.FieldsWidget.Count > 0){// 通过名称访问特定表单域PdfField specificField = formWidget.FieldsWidget[fieldName];// 确保域存在再进行处理if (specificField != null){// 提取特定表单域的内容(名称和值)List<string> specificFieldContent = ExtractFieldContent(specificField);// 如果提取到内容,则将其添加到 content 列表中if (specificFieldContent.Count > 0){content.AddRange(specificFieldContent);}}else{content.Add($"未找到域 '{fieldName}'");}}else{content.Add("PDF 表单中未找到任何域");}// 将提取的内容逐行写入文本文件File.WriteAllLines("提取特定域数据.txt", content);}}/// <summary>/// 提取单个 PDF 表单域的内容(名称和值)/// 处理不同类型的表单域,如文本框、列表框、下拉框、单选按钮和复选框/// </summary>/// <param name="field">当前 PDF 表单域对象</param>/// <returns>包含表单域内容的字符串列表</returns>private static List<string> ExtractFieldContent(PdfField field){// 初始化列表来存储当前表单域的内容List<string> fieldContent = new List<string>();// 检查该域是否为文本框if (field is PdfTextBoxFieldWidget textBoxField){// 将文本框的名称和值添加到列表中fieldContent.Add($"文本框名称:{textBoxField.Name}");fieldContent.Add($"文本框值:{textBoxField.Text}");}// 检查该域是否为列表框else if (field is PdfListBoxWidgetFieldWidget listBoxField){fieldContent.Add($"列表框名称:{listBoxField.Name}");fieldContent.Add("列表框选项:");foreach (PdfListWidgetItem item in listBoxField.Values){fieldContent.Add($"{item.Value}");}fieldContent.Add($"列表框选中项:{listBoxField.SelectedValue}");}// 检查该域是否为下拉框else if (field is PdfComboBoxWidgetFieldWidget comboBoxField){fieldContent.Add($"下拉框名称:{comboBoxField.Name}");fieldContent.Add("下拉框选项:");foreach (PdfListWidgetItem item in comboBoxField.Values){fieldContent.Add($"{item.Value}");}fieldContent.Add($"下拉框选中项:{comboBoxField.SelectedValue}");}// 检查该域是否为单选按钮else if (field is PdfRadioButtonListFieldWidget radioBtnField){fieldContent.Add($"单选按钮名称:{radioBtnField.Name}");fieldContent.Add($"单选按钮选中项:{radioBtnField.SelectedValue}");}// 检查该域是否为复选框else if (field is PdfCheckBoxWidgetFieldWidget checkBoxField){fieldContent.Add($"复选框名称:{checkBoxField.Name}");fieldContent.Add($"复选框状态:{(checkBoxField.Checked ? "选中" : "未选中")}");}// 返回当前表单域的内容列表return fieldContent;}}
}

以上就是使用C# 读取PDF表单域数据的全部内容。感谢阅读!

相关文章:

C# 提取PDF表单数据

目录 使用工具 C# 提取多个PDF表单域的数据 C# 提取特定PDF表单域的数据 PDF表单是一种常见的数据收集工具&#xff0c;广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点&#xff0c;PDF表单在各行各业中得到了广泛应用。然而&#xff0c;当需要整合…...

【JAVA项目】基于ssm的【宠物医院信息管理系统】

【JAVA项目】基于ssm的【宠物医院信息管理系统】 技术简介&#xff1a;采用JSP技术、ssm框架、B/S架构、MySQL技术等实现。 系统简介&#xff1a;宠物医院信息管理系统&#xff0c;在系统首页可以查看首页、医学知识、医生信息、药品信息、新闻资讯、留言反馈、我的、跳转到后台…...

书生大模型实战营2

L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分&#xff0c;它允许你在不同的项目中使用不同版本的库&#xff0c;避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先&#xff0c;确保你已经安装了Anaconda或Minico…...

产业园管理系统提升企业综合管理效率与智能化水平的成功案例分析

内容概要 在当前科技迅猛发展的时代&#xff0c;越来越多的企业意识到数字化转型的重要性。为了提升管理效率和智能化水平&#xff0c;产业园管理系统应运而生&#xff0c;成为众多园区和商办写字楼不可或缺的一部分。无论是工业园、物流园还是公寓&#xff0c;这些系统都能为…...

《AI赋能光追:开启图形渲染新时代》

光线追踪技术是图形渲染领域的重大突破&#xff0c;能够通过模拟光的传播路径&#xff0c;精准渲染反射、折射、阴影和间接光照等效果&#xff0c;实现高度逼真的场景呈现。而人工智能的加入&#xff0c;更是为光线追踪技术带来了前所未有的变革&#xff0c;主要体现在以下几个…...

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…...

利用JSON数据类型优化关系型数据库设计

利用JSON数据类型优化关系型数据库设计 前言 在关系型数据库中&#xff0c;传统的结构化存储方式要求预先定义好所有的列及其数据类型。 然而&#xff0c;随着业务的发展&#xff0c;这种设计可能会显得不够灵活&#xff0c;尤其是在需要扩展单个列的描述功能时。 JSON数据…...

如何学习Java后端开发

文章目录 一、Java 语言基础二、数据库与持久层三、Web 开发基础四、主流框架与生态五、分布式与高并发六、运维与部署七、项目实战八、持续学习与提升总结路线图 学习 Java 后端开发需要系统性地掌握多个技术领域&#xff0c;从基础到进阶逐步深入。以下是一个详细的学习路线和…...

AI刷题-蛋糕工厂产能规划、优质章节的连续选择

挑两个简单的写写 目录 一、蛋糕工厂产能规划 问题描述 输入格式 输出格式 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 关键点 最终代码&#xff1a; 运行结果&#xff1a;​编辑 二、优质章节的连续选择 问题描述 输入格式 输出格式 解题思路&a…...

SpringBoot统一数据返回格式 统一异常处理

统一数据返回格式 & 统一异常处理 1. 统一数据返回格式1.1 快速入门1.2 存在问题1.3 案列代码修改1.4 优点 2. 统一异常处理 1. 统一数据返回格式 强制登录案例中,我们共做了两部分⼯作 通过Session来判断⽤⼾是否登录对后端返回数据进⾏封装,告知前端处理的结果 回顾 后…...

[MySQL]事务的理论、属性与常见操作

目录 一、事物的理论 1.什么是事务 2.事务的属性&#xff08;ACID&#xff09; 3.再谈事务的本质 4.为什么要有事务 二、事务的操作 1.事务的支持版本 2.事务的提交模式 介绍 自动提交模式 手动提交模式 3.事务的操作 4.事务的操作演示 验证事务的回滚 事务异常…...

JWT实现单点登录

文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程&#xff1a;为gateway增加登录校验拦截器 另一种单点登录方法&#xff1a;Token&#xff0b;Redis实现单点登录 JWT实现单点登录 登录流程&#xff…...

docker 学习笔记

一、docker容器快速上手以及简单操作 docker的image和container image镜像 docker image就是一个read.only文件&#xff0c;可以理解成一个模版&#xff0c;docker image具有分层的概念 可以自己制作&#xff0c;也可以从registry拉去 container容器 一个运行中的docker …...

Lesson 119 A true story

Lesson 119 A true story 词汇 story n. 故事&#xff0c;传记&#xff0c;小说&#xff0c;楼层storey 搭配&#xff1a;tell a story 讲故事&#xff0c;说谎    true story 真实的故事    the second floor 二楼 例句&#xff1a;我猜他正在说谎。    I guess he…...

c语言版贪吃蛇(Pro Max版)附源代码

1 背景 贪吃蛇是一款经典的电子游戏&#xff0c;最早出现在20世纪70年代的街机游戏中。游戏的核心玩法是玩家控制一条蛇在有限的空间内移动&#xff0c;通过吃食物来增长身体长度&#xff0c;同时避免撞到墙壁、障碍物或自身。随着蛇的长度增加&#xff0c;游戏难度逐渐提升。 …...

蓝桥村打花结的花纸选择问题

在这篇文章中&#xff0c;我们将探讨一个有趣的算法问题&#xff0c;这个问题涉及到中国传统手工艺——打花结。我们需要判断给定的矩形花纸是否可以通过折叠操作使其面积变为特定的值 X&#xff0c;从而适合用来打花结。 问题描述 解题思路 这个问题可以通过循环方法来解决。…...

SSM开发(三) spring与mybatis整合(含完整运行demo源码)

目录 本文主要内容 一、Spring整合MyBatis的三个关键点 二、整合步骤 1、创建一个Maven项目 2、在pom.xml文件中添加jar包的依赖 3、配置MyBatis 注解实现方式 XML配置文件实现 4、配置Spring 5、测试运行 本文主要内容 1. Spring + Mybatis整合; 2. MyBatis两种SQL…...

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图&#xff0c;本文采用了3组实验对比的效果展示图&#xff0c;代码已调试好&#xff0c;只需替换数据即可生成相关柱状图&#xff0c;为科研加分。通过获得Nature配色的柱状图&#xff0c;让你的论文看起来档次更高&#xff0…...

Elasticsearch中的度量聚合:深度解析与实战应用

在大数据和实时分析日益重要的今天&#xff0c;Elasticsearch以其强大的搜索和聚合能力&#xff0c;成为了众多企业和开发者进行数据分析和处理的首选工具。本文将深入探讨Elasticsearch中的度量聚合&#xff08;Metric Aggregations&#xff09;&#xff0c;展示其如何在数据分…...

重回C语言之老兵重装上阵(十六)C语言可变参数

C语言可变参数 在C语言中&#xff0c;标准库提供了一些函数允许接收可变数量的参数。最典型的例子就是 printf 和 scanf&#xff0c;它们能够处理不确定数量的参数。为了实现这一功能&#xff0c;C语言提供了可变参数函数的概念。 1. 可变参数函数的概念 可变参数函数是指函数…...

第4章 神经网络【1】——损失函数

4.1.从数据中学习 实际的神经网络中&#xff0c;参数的数量成千上万&#xff0c;因此&#xff0c;需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量&#xff0c;特征量指的是从输入数据/图像中提取出的本质的数 …...

动态规划——斜率优化DP

题目清单 acwing300.任务安排1 状态表示f[i]: 集合&#xff1a;完成前i个任务且第i个任务为最后一个批次最后一个任务的方案。 属性&#xff1a;min 状态计算&#xff1a; f [ i ] m i n { f [ j ] s u m t [ i ] ∑ j 1 i w [ u ] s ∑ j 1 n w [ i ] } f[i]min\{f[j…...

函数栈帧的创建和销毁

1、总述&#xff1a; 大家在前期学习函数的时候&#xff0c;肯定会有诸多疑惑&#xff1a; 1、局部变量怎么创建的&#xff1f; 2、为什么有时候局部变量是随机值&#xff1f; 3、函数是怎么传参的&#xff1f;传参的顺序如何&#xff1f; 4、形参和实参是什么样的关系&am…...

【MQ】探索 Kafka

高性能 消息的顺序性、顺序写磁盘 零拷贝 RocketMQ内部主要是使用基于mmap实现的零拷贝&#xff0c;用来读写文件 减少cpu的拷贝次数和上下文切换次数&#xff0c;实现文件的高效读写操作 Kafka 零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Jav…...

c++ set/multiset 容器

1. set 基本概念 简介&#xff1a; 所有元素都会在插入时自动排序本质&#xff1a; set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。set 和 multiset 区别&#xff1a; set容器不允许有重复的元素。 multiset允许有重复的元素。2. set 构造和赋值 构造&a…...

react-bn-面试

1.主要内容 工作台待办 实现思路&#xff1a; 1&#xff0c;待办list由后端返回&#xff0c;固定需要的字段有id(查详细)、type(本条待办的类型)&#xff0c;还可能需要时间&#xff0c;状态等 2&#xff0c;一个集中处理待办中转路由页&#xff0c;所有待办都跳转到这个页面…...

【C++数论】880. 索引处的解码字符串|2010

本文涉及知识点 数论&#xff1a;质数、最大公约数、菲蜀定理 LeetCode880. 索引处的解码字符串 给定一个编码字符串 s 。请你找出 解码字符串 并将其写入磁带。解码时&#xff0c;从编码字符串中 每次读取一个字符 &#xff0c;并采取以下步骤&#xff1a; 如果所读的字符是…...

shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。

文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…...

Python案例--养兔子

兔子繁殖问题是一个经典的数学问题&#xff0c;最早由意大利数学家斐波那契在13世纪提出。这个问题不仅在数学领域具有重要意义&#xff0c;还广泛应用于计算机科学、生物学和经济学等领域。本文将通过一个具体的Python程序&#xff0c;深入探讨兔子繁殖问题的建模和实现&#…...

【搜索回溯算法】:BFS的魔力--如何使用广度优先搜索找到最短路径

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;搜索回溯算法篇–CSDN博客 文章目录 一.广度优先搜索&#xff08;BFS&#xff09;解决最短路…...

JavaSE第十一天——集合框架Collection

一、List接口 List接口是一个有序的集合&#xff0c;允许元素有重复&#xff0c;它继承了Collection接口&#xff0c;提供了许多额外的功能&#xff0c;比如基于索引的插入、删除和访问元素等。 常见的List接口的实现类有ArrayList、LinkedList和Vector。 List接口的实现类 …...

Three城市引擎地图插件Geo-3d

一、简介 基于Three开发&#xff0c;为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系&#xff0c;支持坐标转换&#xff0c;支持影像、地形、geojson建筑、道路&#xff0c;植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…...

深度学习|表示学习|卷积神经网络|详细推导每一层的维度变化|14

如是我闻&#xff1a; 一个经典的卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;呈现的是输入图像通过多个卷积层、池化层以及全连接层&#xff0c;最终输出分类结果的过程。整个过程的核心是理解输入特征图的尺寸如何在每一层发生变化&#xff0c;我们可以通过卷积…...

多级缓存(亿级并发解决方案)

多级缓存&#xff08;亿级流量&#xff08;并发&#xff09;的缓存方案&#xff09; 传统缓存的问题 传统缓存是请求到达tomcat后&#xff0c;先查询redis&#xff0c;如果未命中则查询数据库&#xff0c;问题如下&#xff1a; &#xff08;1&#xff09;请求要经过tomcat处…...

BOM对象location与数组操作结合——查询串提取案例

BOM对象location与数组操作结合——查询串提取案例 前置知识 1. Location 对象 Location 对象是 JavaScript 提供的内置对象之一&#xff0c;它表示当前窗口或框架的 URL&#xff0c;并允许你通过它操作或获取 URL 的信息。可以通过 window.location 访问。 主要属性&#…...

读书笔记--分布式服务架构对比及优势

本篇是在上一篇的基础上&#xff0c;主要对共享服务平台建设所依赖的分布式服务架构进行学习&#xff0c;主要记录和思考如下&#xff0c;供大家学习参考。随着企业各业务数字化转型工作的推进&#xff0c;之前在传统的单一系统&#xff08;或单体应用&#xff09;模式中&#…...

GOGOGO 枚举

含义&#xff1a;一种类似于类的一种结构 作用&#xff1a;是Java提供的一个数据类型&#xff0c;可以设置值是固定的 【当某一个数据类型受自身限制的时候&#xff0c;使用枚举】 语法格式&#xff1a; public enum 枚举名{…… }有哪些成员&#xff1f; A、对象 public …...

【Linux】Linux基础开发工具

1 Linux 软件包管理器 yum 1.1软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的…...

嵌入式C语言:结构体的多态性之结构体中的void*万能指针

目录 一、void*指针在结构体中的应用 二、实现方式 2.1. 定义通用结构体 2.2. 定义具体结构体 2.3. 初始化和使用 三、应用场景 3.1. 内存管理函数 3.2. 泛型数据结构&#xff08;链表&#xff09; 3.3. 回调函数和函数指针 3.4. 跨语言调用或API接口&#xff08;模拟…...

重构进行时:一秒告别 !=null 判空

重构进行时&#xff1a;一秒告别 !null 判空 空指针异常&#xff08;NullPointerException&#xff09;是Java开发中常见的错误之一。 许多开发者在遇到空指针问题时&#xff0c;往往会习惯性地使用! null来进行判断。 然而&#xff0c;当代码中频繁出现这种判断时&#xff…...

React 中hooks之useSyncExternalStore使用总结

1. 基本概念 useSyncExternalStore 是 React 18 引入的一个 Hook&#xff0c;用于订阅外部数据源&#xff0c;确保在并发渲染下数据的一致性。它主要用于&#xff1a; 订阅浏览器 API&#xff08;如 window.width&#xff09;订阅第三方状态管理库订阅任何外部数据源 1.1 基…...

Semaphore 与 线程池 Executor 有什么区别?

前言&#xff1a;笔者在看Semaphone时 突然脑子宕机&#xff0c;啥啥分不清 Semaphore 和 Executor 的作用&#xff0c;故再次记录。 一、什么是Semaphore&#xff1f; Semaphore 是 Java 并发编程&#xff08;JUC&#xff09;中一个重要的同步工具&#xff0c;它的作用是 控…...

Rust:高性能与安全并行的编程语言

引言 在现代编程世界里&#xff0c;开发者面临的最大挑战之一就是如何平衡性能与安全性。在许多情况下&#xff0c;C/C这样的系统级编程语言虽然性能强大&#xff0c;但其内存管理的复杂性导致了各种安全漏洞。为了解决这些问题&#xff0c;Rust 作为一种新的系统级编程语言进入…...

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完结)

Understanding Diffusion Models: A Unified Perspective&#xff08;六&#xff09;&#xff08;完结&#xff09; 文章概括指导&#xff08;Guidance&#xff09;分类器指导无分类器引导&#xff08;Classifier-Free Guidance&#xff09; 总结 文章概括 引用&#xff1a; …...

Redis --- 分布式锁的使用

我们在上篇博客高并发处理 --- 超卖问题一人一单解决方案讲述了两种锁解决业务的使用方法&#xff0c;但是这样不能让锁跨JVM也就是跨进程去使用&#xff0c;只能适用在单体项目中如下图&#xff1a; 为了解决这种场景&#xff0c;我们就需要用一个锁监视器对全部集群进行监视…...

电脑怎么格式化?格式化详细步骤

格式化是我们在日常使用电脑时可能会用到的一种操作&#xff0c;无论是清理磁盘空间、安装新系统&#xff0c;还是解决磁盘读写错误&#xff0c;都可能需要格式化。不过&#xff0c;对于一些不熟悉电脑操作的用户来说&#xff0c;格式化听起来可能有些复杂。其实&#xff0c;只…...

TikTok广告投放优化策略:提升ROI的核心技巧

在短许多品牌和商家纷纷投入广告营销&#xff0c;争夺这片潜力巨大的市场。然而&#xff0c;在激烈的竞争环境中&#xff0c;如何精准有效地投放广告&#xff0c;优化广告效果&#xff0c;实现更高的投资回报率&#xff08;ROI&#xff09;成为了广告主关注的核心。 一. 精准受…...

视觉语言模型 (VLMs):跨模态智能的探索

文章目录 一. VLMs 的重要性与挑战&#xff1a;连接视觉与语言的桥梁 &#x1f309;二. VLMs 的核心训练范式&#xff1a;四种主流策略 &#x1f5fa;️1. 对比训练 (Contrastive Training)&#xff1a;拉近正例&#xff0c;推远负例 ⚖️2. 掩码方法 (Masking)&#xff1a;重构…...

第05章 08 绘制脑部体绘制图的阈值等值面

绘制脑部体绘制图的阈值等值面&#xff0c;例如肌肉和头骨骼&#xff0c;需要对医学图像数据进行阈值处理&#xff0c;并使用体绘制技术来可视化这些结构。以下是一个基于VTK/C的示例代码&#xff0c;展示如何读取DICOM图像数据&#xff0c;应用阈值过滤器来提取特定组织&#…...

类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件

目录 1. 向上转型和向下转型 1.1 向上转型 1.2 向下转型 1.3 instanceof关键字 2. 重写&#xff08;overidde&#xff09; 2.1 方法重写的规则 2.1.1 基础规则 2.1.2 深层规则 2.2 三种不能重写的方法 final修饰 private修饰 static修饰 3. 动态绑定 3.1 动态绑…...