pdf文件的读取,基于深度学习的方法
需要安装一些依赖解析 PDF 文件的详细指南_unstructured.partition.pdf-CSDN博客文章浏览阅读1.3k次,点赞13次,收藏9次。通过 unstructured.partition.pdf 函数,可以方便地解析 PDF 文件并提取其中的文本和表格内容。尽管在使用过程中可能会遇到一些错误,但通过正确的安装和配置依赖项,以及尝试其他 PDF 解析库,可以有效地解决这些问题。本文将介绍如何使用 unstructured.partition.pdf 函数来解析 PDF 文件,并提取其中的文本和表格内容。这个错误通常表示你的 PDF 文件在解压缩过程中出现了问题,可能是由于文件损坏、格式不兼容或不支持的压缩方法等原因。_unstructured.partition.pdfhttps://blog.csdn.net/qq_28704101/article/details/140464343
解析 PDF 文档的挑战在于准确提取整个页面的布局并将内容(包括表格、标题、段落和图像)转换为文档的文本表示形式。该过程涉及处理文本提取、图像识别中的不准确以及表格中行列关系的混乱。
挑战1:如何从表格和图像中提取数据
检测到的表数据可以直接导出为HTML,导出来的表格数据可以直接被识别
挑战2:如何重新排列检测到的块?特别是对于双列PDF
在确定布局后,unstructured[3]框架会将每个页面划分为几个矩形块,如图8所示:
主流解析 PDF 的方法有以下三种:
-
基于规则的方法:每个部分的风格和内容根据文档的组织特征确定。然而,这种方法的通用性不是很强,因为 PDF 的类型和布局多种多样,不可能用预定义的规则涵盖所有类型和布局。
-
基于深度学习模型的方法:例如当前流行的结合目标检测(yolox)和OCR模型的解决方案。
-
基于多模态大型模型传递复杂结构或提取 PDF 中的关键信息。
最具代表性的工具之一是pypdf,它是一种广泛使用的基于规则的解析器。它是LangChain和LlamaIndex中用于解析PDF文件的标准方法。使用起来非常简单
# 确保已安装PyPDF2模块
try:import PyPDF2
except ImportError:import syssys.exit("Please install the PyPDF2 module first, using: pip install PyPDF2")def extract_text_from_pdf(filename, page_num):try:with open(filename, 'rb') as pdf_file:reader = PyPDF2.PdfReader(pdf_file)if page_num < len(reader.pages):page = reader.pages[page_num]text = page.extract_text()if text:return textelse:return "No text found on this page."else:return f"Page number {page_num} is out of range. This document has {len(reader.pages)} pages."except Exception as e:return f"An error occurred: {str(e)}"if __name__ == '__main__':# 示例用法filename = "/home/00_rag/fufan-chat-api/data/parse/data/1706.03762v7.pdf"page_num = 5text = extract_text_from_pdf(filename, page_num)print('--------------------------------------------------')print(f"Text from file '{filename}' on page {page_num}:")print(text if text else "No text available on the selected page.")print('--------------------------------------------------')
基于深度学习模型的方法
这种方法的优点是能够准确识别整个文档的布局,包括表格和段落。它甚至可以理解表内的结构。这意味着它可以将文档划分为定义明确、完整的信息单元,同时保留预期的含义和结构。
当前使用的是
目标检测模型
yolox 来进行读取,并且使用的是hi_res策略
if __name__ == "__main__":processor = UnstructuredProcessor()# 提取PDF中的表格数据content, table_content = processor.extract_data('/home/00_rag/fufan-chat-api/data/parse/data/invoice_2.pdf','hi_res', # 'yolox', # https://github.com/Megvii-BaseDetection/YOLOX['tables', 'unstructured'],True,True)
这个rich.progress 就是来美化输出打印进度条的
from rich.progress import Progress, SpinnerColumn, TextColumn
def invoke_pipeline_step(self, task_call, task_description, local):"""执行管道步骤,可以在本地或非本地环境中运行任务。:param task_call: callable,一个无参数的函数或lambda表达式,它执行实际的任务。:param task_description: str,任务的描述,用于进度条或打印输出。:param local: bool,指示是否在本地环境中执行任务。如果为True,则使用进度条;如果为False,则仅打印任务描述。方法的执行流程:- 如果`local`为True,使用`Progress`上下文管理器来显示一个动态的进度条。- `SpinnerColumn()`:在进度条中添加一个旋转的指示器。用来表示程序还在运行中- `TextColumn("[progress.description]{task.description}")`:添加一个文本列来显示任务描述。- `transient=False`:进度条显示完成后不会消失。- 在进度条中添加一个任务,然后调用`task_call()`执行实际的任务,任务的返回结果保存在`ret`中。- 如果`local`为False,则直接打印任务描述,不使用进度条,之后调用`task_call()`执行任务,任务的返回结果同样保存在`ret`中。:return: 返回从`task_call()`获取的结果。"""if local:# 本地执行时,显示带有进度指示的进度条with Progress(SpinnerColumn(),TextColumn("[progress.description]{task.description}"),transient=False,) as progress:# 添加进度任务,总步长为None表示不确定的任务进度progress.add_task(description=task_description, total=None)# 调用task_call执行任务,并获取结果ret = task_call()else:print(task_description)ret = task_call()return ret
def extract_data(self, file_path, strategy, model_name, options, local=True, debug=False):"""从指定的文件中提取数据。:param file_path: str,文件的路径,指定要处理的文件。:param strategy: 使用的策略来提取数据。:param model_name: 使用的模型名称,这里使用 目标检测模型 yolox:param options: dict,额外的选项或参数,用来干预数据提取的过程或结果。:param local: bool,一文件处理是否应在本地执行,默认为True。:param debug: bool,如果设置为True,则会显示更多的调试信息,帮助理解处理过程中发生了什么,默认为False。函数的执行流程:- 调用`invoke_pipeline_step`方法,这是一个高阶函数,它接受一个lambda函数和其他几个参数。- lambda函数调用`process_file`方法,处理文件并根据指定的策略和模型名提取数据。- `invoke_pipeline_step`方法除了执行传入的lambda函数,还可能处理本地执行逻辑,打印进程信息,并依据`local`参数决定执行环境。- 最终,数据提取的结果将从`process_file`方法返回,并由`invoke_pipeline_step`方法输出。"""# # 调用数据提取流程,处理PDF文件并提取元素elements = self.invoke_pipeline_step(lambda: self.process_file(file_path, strategy, model_name),"Extracting elements from the document...",local)if debug:new_extension = 'json' # You can change this to any extension you wantnew_file_path = self.change_file_extension(file_path, new_extension)content, table_content = self.invoke_pipeline_step(lambda: self.load_text_data(elements, new_file_path, options),"Loading text data...",local)else:with tempfile.TemporaryDirectory() as temp_dir:temp_file_path = os.path.join(temp_dir, "file_data.json")content, table_content = self.invoke_pipeline_step(lambda: self.load_text_data(elements, temp_file_path, options),"Loading text data...",local)if debug:print("Data extracted from the document:")print(content)print("\n")print("Table content extracted from the document:")if table_content:print(len(table_content))print(table_content)print(f"这是content:{content}")print(f"这是table_content:{table_content}")return content, table_content
方法参数中的lambda表达式
处理文件的核心逻辑
# partition_pdf 官方文档:https://docs.unstructured.io/open-source/core-functionality/partitioning#partition-pdf
def process_file(self, file_path, strategy, model_name):"""处理文件并提取数据,支持PDF文件和图像文件。:param file_path: str,文件的路径,指定要处理的文件。:param strategy: 使用的策略来提取数据,影响数据处理的方法和结果。:param model_name: 使用的模型名称,这里使用yolox方法的执行流程:- 初始化`elements`变量为None,用来存储提取的元素。- 检查文件路径的后缀,根据文件类型调用相应的处理函数:- 如果文件是PDF(.pdf),使用`partition_pdf`函数处理:- `filename`:提供文件路径。- `strategy`:指定数据提取策略。- `infer_table_structure`:是否推断表格结构,这里设为True。- `hi_res_model_name`:提供高分辨率模型名称。- `languages`:设置处理的语言为英语。- 如果文件是图像(.jpg, .jpeg, .png),使用`partition_image`函数处理,参数类似于处理PDF的参数。- 返回提取的元素`elements`。:return: 返回从文件中提取的元素。"""# 初始化元素变量elements = None# 根据文件后缀决定处理方式# partition_pdf 官方文档:https://docs.unstructured.io/open-source/core-functionality/partitioning#partition-pdf# hi_res 策略配合 infer_table_structure=True 的表格识别效果较好if file_path.lower().endswith('.pdf'):elements = partition_pdf(filename=file_path,# strategy kwarg 控制用于处理 PDF 的方法。 PDF 的可用策略有 "auto" 、 "hi_res" 、 "ocr_only" 和 "fast"strategy=strategy,# 是否提取表格的格式化信息infer_table_structure=True,# 使用的模型名称hi_res_model_name=model_name,# chi_sim表示使用哪种语言来进行解析languages=['chi_sim'])elif file_path.lower().endswith(('.jpg', '.jpeg', '.png')):# 处理图像文件elements = partition_image(filename=file_path,strategy=strategy,infer_table_structure=True,hi_res_model_name=model_name,languages=['chi_sim'])return elements
这个是更改文件拓展名,生成一个新的文件路径
def change_file_extension(self, file_path, new_extension, suffix=None):# Check if the new extension starts with a dot and add one if notif not new_extension.startswith('.'):new_extension = '.' + new_extension# Split the file path into two parts: the base (everything before the last dot) and the extension# If there's no dot in the filename, it'll just return the original filename without an extensionbase = file_path.rsplit('.', 1)[0]# Concatenate the base with the new extensionif suffix is None:new_file_path = base + new_extensionelse:new_file_path = base + "_" + suffix + new_extensionreturn new_file_path
加载里面的数据
def load_text_data(self, elements, file_path, options):# 手动将元素保存到 JSON 文件中,确保使用 ensure_ascii=Falsewith open(file_path, 'w', encoding='utf-8') as file:json.dump([e.to_dict() for e in elements], file, ensure_ascii=False)content, table_content = None, Noneif options is None:content = self.process_json_file(file_path)# 判断是加载全部信息,还是仅仅表格的信息if options and "tables" in options and "unstructured" in options:content = self.process_json_file(file_path, "form")table_content = self.process_json_file(file_path, "table")return content, table_contentdef process_json_file(self, file_path, option=None):# Read the JSON filewith open(file_path, 'r', encoding='utf-8') as file:data = json.load(file)# Iterate over the JSON data and extract required elementsextracted_elements = []for entry in data:if entry["type"] == "Table" and (option is None or option == "table" or option == "form"):table_data = entry["metadata"]["text_as_html"]if option == "table" and self.table_has_header(table_data):extracted_elements.append(table_data)if option is None or option == "form":extracted_elements.append(table_data)elif entry["type"] == "Title" and (option is None or option == "form"):extracted_elements.append(entry["text"])# 叙述文本elif entry["type"] == "NarrativeText" and (option is None or option == "form"):extracted_elements.append(entry["text"])# 未分类elif entry["type"] == "UncategorizedText" and (option is None or option == "form"):extracted_elements.append(entry["text"])elif entry["type"] == "ListItem" and (option is None or option == "form"):extracted_elements.append(entry["text"])elif entry["type"] == "Image" and (option is None or option == "form"):extracted_elements.append(entry["text"])if option is None or option == "form":# Convert list to single string with two new lines between each elementextracted_data = "\n\n".join(extracted_elements)return extracted_datareturn extracted_elements
相关文章:
pdf文件的读取,基于深度学习的方法
需要安装一些依赖解析 PDF 文件的详细指南_unstructured.partition.pdf-CSDN博客文章浏览阅读1.3k次,点赞13次,收藏9次。通过 unstructured.partition.pdf 函数,可以方便地解析 PDF 文件并提取其中的文本和表格内容。尽管在使用过程中可能会遇…...
【指令集】Nginx
本文作者: slience_me 【指令集】Nginx 1. 目录结构 Nginx 的基础目录结构通常包括以下几个主要目录: Nginx的目录结构大致如下(以Linux系统为例): /etc/nginx/ # Nginx的配置文件目录 ├── ngin…...
蓝耘云智算|使用 Deepseek R1 模型优化 BERT 在 NLP 任务中的表现
在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)已成为许多文本分类任务的基准模型。然而,随着新模型的出现和技术的不断进步,BERT在某些情况下可能不…...
LINUX常用命令学习
查看系统版本 使用hostnamectl命令检查。hostnamectl显示了CentOS的版本以及操作系统的相关信息,非常方便 设置linux机器别名称 hostnamectl set-hostname 机器别名 --static 华为云 centos 命令:lsb_release -a linux:cat /proc/version 查看进程路…...
【java面向对象的三大特性】封装、继承和多态
目录标题 一、封装(Encapsulation):二、继承(Inheritance):三、多态(Polymorphism):1. 多态的三个必要条件:2.多态的具体实现:3.多态的使用场景&a…...
【开源免费】基于SpringBoot+Vue.JS校园商铺管理系统(JAVA毕业设计)
本文项目编号 T 191 ,文末自助获取源码 \color{red}{T191,文末自助获取源码} T191,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
日常故障排查 - Java程序故障排查
Java程序故障 无论对于任何的故障而言,恢复可用性都是首要目标。但作为一个技术匠人,不能让同一个问题导致多次故障,因此故障的根因剖析以及解决也是很重要的。但是故障根因剖析是需要现场数据来进行分析,因此在故障恢复之前要尽…...
ai数字人分身系统开发源码saas化
#数字人分身系统# #数字人系统源码# #ai数字人123 123# 云罗抖去推数字人分身系统是一款融合了形象克隆、声音克隆、AI数字人分身、AI智能剪辑、智能文案等各种AI技术一体化的短视频营销工具,其核心功能优势主要体现在以下几方面: 真实度高…...
DeepSeek免费部署到WPS或Office
部署到WPS - 通过OfficeAI插件接入: - 准备工作:安装最新版本的WPS Office软件;访问DeepSeek官网,点击右上角的“API开放平台”,登录账号(若无账号需先注册),登录成功后,…...
vue2和vue3插槽slot最通俗易懂的区别理解
在 Vue 的组件通信中,slot(插槽)的编译优化是一个重要的性能提升点。以下是 Vue2 和 Vue3 在 slot 处理上的差异及优化原理,用更直观的方式解释: Vue2 的 Slot 更新机制 想象一个父子组件场景: 父组件&am…...
生成式人工智能:技术革命与应用图景
(这文章有些地方看不懂很正常,因为有太多生词,需要对 计算机/人工智能 研究至深的人才能看懂,遇到不会的地方用浏览器搜索或跳过) 引言 2023年被称我们为"生成式AI元年",以GPT-4、DALL-E 3、Stable Diffusi…...
关于Dest1ny:我的创作纪念日
Dest1ny 因为这是csdn任务,我就稍微“写”了一下! 如果大家真的有什么想聊的或者想一起学习的,欢迎在评论区或者私信中与我讨论! 2025想说的话 我就把我想说的写在前面! 不用对未来焦虑,不要觉得自己走…...
AI学习记录 - 最简单的专家模型 MOE
代码 import torch import torch.nn as nn import torch.nn.functional as F from typing import Tupleclass BasicExpert(nn.Module):# 一个 Expert 可以是一个最简单的, linear 层即可# 也可以是 MLP 层# 也可以是 更复杂的 MLP 层(active function 设…...
【C++内存管理】—— 策略、陷阱及应对之道
欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创…...
分布式版本控制系统---git
Git:从基础到进阶的全面指南 Git 是一个分布式版本控制系统,广泛应用于软件开发中,用于跟踪文件的更改、支持团队协作以及管理项目代码。通过 Git,开发者可以在本地拥有完整的项目历史记录,进行离线开发,并…...
pg_sql关于时间的函数
1、时间戳和日期之间的相互转换 时间戳转日期(时间戳为数值类型,若为字符型需进行转换) # 保留到秒:2025-10-02 04:46:40 (字符型转换数值型) select to_timestamp(1759351600::bigint)# 保留到日&#x…...
【Kafka】Windows下安装Kafka(全面)
目录 1.前提条件 2.下载 3.安装 4.环境变量配置 5.验证 1.前提条件 参考版本:zookeeper为3.6.4 kafka版本为3.5.1 1.先安装zookeeper: 【Zookeeper】Windows下安装Zookeeper(全面)-CSDN博客https://blog.csdn.net/…...
【Qt】:概述(下载安装、认识 QT Creator)
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 介绍 🦋 什么是 QT🦋 QT 发展史🦋 Qt版本🦋 QT 优点 一:🔥 搭建Qt开发环境 ǹ…...
Netty源码解析之异步处理(二):盛赞Promise中的集合设计
前言 在阅读Netty源码的过程中,我越来越相信一句话:“Netty的源码非常好,质量极高,是Java中质量最高的开源项目之一”。如果认真研究,会有一种遍地黄金的感觉。 本篇文件我将记录一下鄙人在Promise的实现类DefaultPr…...
Spring Boot 的约定优于配置,你的理解是什么?
“约定优于配置” 是 Spring Boot 极为重要的设计理念,它极大地简化了 Spring 应用的开发流程,下面从多个方面详细解释这一理念: 减少配置复杂性 传统开发的痛点 在传统的 Spring 开发里,配置工作相当繁琐。以配置 Spring MVC …...
图形渲染(一)——Skia、OpenGL、Mesa 和 Vulkan简介
1.Skia —— 2D 图形库 Skia 是一个 2D 图形库,它的作用是为开发者提供一个高层次的绘图接口,方便他们进行 2D 图形渲染(比如绘制文本、形状、图像等)。Skia 本身不直接管理 GPU 或进行底层的渲染工作,而是通过 底层图…...
git使用,注意空格
第一节 安装完成后,找个目录用于存储,打开目录右击选择git bash here 命令1 姓名 回车 git config --global user.name "li" 命令2 邮箱 回车 git config --global user.email "888163.com" 命令3 初始化新仓库,下载克隆 回…...
以用户为中心,汽车 HMI 界面设计的创新之道
在汽车智能化飞速发展的当下,汽车 HMI(人机交互界面)成为连接人与车的关键桥梁。如何打造出优秀的 HMI 界面?答案是以用户为中心,探索创新之道。 用户需求是汽车 HMI 界面设计的指南针。在设计前期,深入调…...
CentOS安装Docker,Ubuntu安装Docker,Docker解决方案
文章目录 CentOS7安装DockerUbuntu修改Docker镜像源docker设置容器自动启动启动时加--restartalways如果已经过运行的项目docker compose设置容器自启动 docker file修改时区docker在容器执行命令简单粗暴的办法安装curl docker compose命令安装docker compose Docker WEB 图形…...
c#中“事件-event”的经典示例与理解
在C#编程语言中,事件(Event)是一个非常重要的概念,它提供了一种松耦合的方式,让对象间能够通知彼此,而无需直接联系。事件的使用可以让我们的代码更加灵活、可扩展且易于维护。 事件可以视作委托的实例&…...
git bash在github的库中上传或更新本地文件
一、将本地文件上传到 GitHub 仓库 1. 创建 GitHub 仓库 如果你还没有在 GitHub 上创建仓库,首先需要创建一个新的仓库: 登录到 GitHub。点击右上角的 按钮,选择 New repository。给你的仓库起个名字,并选择 Public 或 Privat…...
【编程实践】vscode+pyside6环境部署
1 PySide6简介 PySide6是Qt for Python的官方版本,支持Qt6,提供Python访问Qt框架的接口。优点包括官方支持、LGPL许可,便于商业应用,与Qt6同步更新,支持最新特性。缺点是相比PyQt5,社区资源较少。未来发展…...
vue 文件下载(导出)excel的方法
目前有一个到处功能的需求,这是我用过DeepSeek生成的导出(下载)excel的一个方法。 1.excel的文件名是后端生成的,放在了响应头那里。 2.这里也可以自己制定文件名。 3.axios用的是原生的axios,不要用处理过的ÿ…...
服务器延迟给视频网站造成的影响
在数字化时代中,网络视频已经成为人们日常娱乐和获取信息的重要平台,网络视频的流畅性会影响着用户的体验度,那么,当服务器出现延迟会对视频网站造成哪些影响呢?本文就来共同了解一下吧! 当所使用的服务器由…...
django上传文件
1、settings.py配置 # 静态文件配置 STATIC_URL /static/ STATICFILES_DIRS [BASE_DIR /static, ]上传文件 # 定义一个视图函数,该函数接收一个 request 参数 from django.shortcuts import render # 必备引入 import json from django.views.decorators.http i…...
Mysql数据库
一.数据定义语言DDL 一.概述 DDL用于定义和管理数据库的结构 DDL关键字:1.CREATE; 2.ALTER; 3.DROP 二.SQL命名规定和规范 1.标识符命名规则 2.标识符命名规范 三.库管理 1. CREATE DATABASE 数据库名; 2. CREATE DATABASE IF NOT EXISTS 数据库名; 3. CREATE…...
机器学习 - 大数定律、可能近似正确学习理论
一、大数定律: 大数定律是概率论中的一个基本定理,其核心思想是:当独立重复的随机试验次数足够大时,样本的平均值会趋近于该随机变量的期望值。下面从直观和数学两个角度来说明这一概念: 1. 直观理解 重复试验的稳定…...
Kotlin 2.1.0 入门教程(十七)接口
接口 接口可以包含抽象方法的声明,也可以包含方法的实现。 接口与抽象类的不同之处在于,接口无法存储状态。接口可以拥有属性,但这些属性要么必须是抽象的,要么就得提供访问器的实现。 接口使用 interface 关键字来定义&#x…...
USB Flash闪存驱动器安全分析(第一部分)
翻译原文链接:Hacking Some More Secure USB Flash Drives (Part I) | SySS Tech Blog 文章翻译总结:文章对一些具有AES硬件加密的USB闪存驱动器的网络安全分析研究。研究由SySS的IT安全专家Matthias Deeg进行,他在2022年初发现了几个安全漏…...
报名丨Computer useVoice Agent :使用 TEN 搭建你的 Mac Assistant
与 TEN 相聚在「LET’S VISION 2025」大会,欢迎来展位上跟我们交流。这次我们还准备了一场聚焦「computer use」的工作坊,功能新鲜上线,线下首波体验! 📅 TEN 展位:2025年3月1日-2日 TEN workshop&#x…...
常用架构图:业务架构、产品架构、系统架构、数据架构、技术架构、应用架构、功能架构及信息架构
文章目录 引言常见的架构图I 业务架构图-案例模块功能说明1. 用户界面层 (UI)2. 应用服务层3. 数据管理层4. 基础设施层业务流程图示例技术实现II 功能架构图 -案例功能模块说明1. 船舶监控模块2. 报警管理模块3. 应急响应模块4. 通信管理模块5. 数据分析模块数据管理层基础设施…...
微信小程序的制作
制作微信小程序的过程大致可以分为几个步骤:从环境搭建、项目创建,到开发、调试和发布。下面我会为你简要介绍每个步骤。 1. 准备工作 在开始开发微信小程序之前,你需要确保你已经完成了以下几个步骤: 注册微信小程序账号&…...
C# 特性 学习记录
在C#中,特性(Attribute)是一种用于向代码元素(如类、方法、属性等)添加元数据的机制。特性本身不会直接影响代码的执行,但它们可以提供额外的信息,这些信息可以在运行时通过反射(Ref…...
DBeaver clickhouse 时区不对 时间少了8小时
选择DataBase选择Driver Manager选择clickhouse数据库点中之后,选择编辑添加两个全局属性 use_server_time_zone use_time_zone 鼠标移动到User Properties上,右键即可添加一列空白 然后断开重连...
如何测试和验证CVE-2024-1430:Netgear R7000 路由器信息泄露漏洞分析
CVE-2024-1430 是一个影响 Netgear R7000 路由器的安全漏洞,漏洞来源于该路由器 Web 管理界面的信息泄露问题。攻击者通过访问 /currentsetting.htm 文件,可能泄露敏感信息,如 Wi-Fi 密码等。 在测试和验证 CVE-2024-1430 时,您需…...
Express 中间件是什么
在 Express 里,中间件是具备访问请求对象(req)、响应对象(res)以及应用程序请求-响应循环中的下一个中间件函数(一般用next表示)的函数。 一、中间件的定义与调用顺序 在 Express 应用中&…...
【做一个微信小程序】校园地图页面实现
前言 上一个教程我们实现了小程序的一些的功能,有背景渐变色,发布功能有的呢,已支持图片上传功能,表情和投票功能开发中(请期待)。下面是一个更高级的微信小程序实现,包含以下功能:…...
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
目录 前言与导论 碎碎念 所以,我到底需要知道哪些东西呢 从一些基础的概念入手 常见的工具和说法 ST公司 MDK5 (Keil5) CubeMX 如何使用MDK5的一些常用功能 MDK5的一些常见的设置 前言与导论 非常感谢2301_77816627-CSDN博客的提问,他非常好奇…...
java nio 原理 非阻塞IO Netty
一、为什么必须去了解NIO 首先你需要之后Netty的主要实现手段就是Nio,很多人一直学不明白Netty,根本原因是 除了日常开发中很难能够实践,很大一部分原因是不熟悉NIO,事实上真正熟悉了NIO和它背后的原理之后,去查看Netty的源码就有…...
【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接
目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…...
vue2打包带路径的项目,刷新404问题解决
问题描述 Vue 2 项目打包时设置了 publicPath: /web/,并通过 Nginx 配置访问 http://ip/web 时可以正常加载首页,但刷新页面时出现 404 错误 原nginx的配置 location /web {alias /www/dist; # 静态文件地址try_files $uri $uri/ /index.html;index i…...
【计算机视觉】文本识别
计算机视觉,广义的文本识别是指对输入的图像进行分析处理,识别出图像中的文字信息,这里的图像可以使传统的文档图像,也可以是现实世界中的场景图像。 简介 无论是传统方法还是基于深度深度学习的方法,完整的文本识别…...
Vue和React的区别
组件开发方式: Vue 使用单文件组件(SFC), HTML, JS 和 CSS 在一个文件内实现 <template><div class"my-component"><!-- HTML模板 --></div> </template><script> export default {// JavaScr…...
STM32 是什么?同类产品有哪些
STM32 是什么? STM32 是由意法半导体(STMicroelectronics)推出的基于 ARM Cortex-M 内核 的 32 位微控制器(MCU)系列。它专为高性能、低功耗的嵌入式应用设计,广泛应用于以下领域: 工业控制&am…...
Git学习使用笔记
目录 一、基本介绍 1.1 版本控制 1.2 版本控制软件的基础功能 1.3 多人协作开发/集中式版本控制 1.4 分布式版本控制 二、Git安装 2.1下载git 2.2 使用Github Desktop软件 2.2.1 创建本地仓库 2.2.2 删除本地仓库 2.2.3 仓库文件操作 2.2.4 多人协作 2.2.4.1 分…...