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

SpringBoot+OCR 实现PDF 内容识别

一、SpringBoot+OCR对pdf文件内容识别提取

1、在 Spring Boot 中,您可以结合 OCR(Optical Character Recognition)库来实现对 PDF 文件内容的识别和提取。

一种常用的 OCR 库是 Tesseract,而 pdf2image 是一个用于将 PDF 转换为图像的工具,可以与 Tesseract 配合使用。

以下是一个简单的 Spring Boot 示例,演示如何使用 Tesseract 和 pdf2image 对 PDF 文件进行 OCR 识别和提取:

  1. 添加 Maven 依赖

在您的 Spring Boot 项目中,添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-debugger</artifactId><version>2.0.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app2</artifactId><version>2.0.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version> <!-- 使用最新版本 -->
</dependency>
  1. 编写代码
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.tools.PDFToImage;
import org.springframework.stereotype.Service;import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;@Service
public class OCRService {public String extractTextFromPDF(String pdfFilePath) {try {// Convert PDF to imagesList<BufferedImage> images = convertPDFToImages(pdfFilePath);// Use OCR to extract text from imagesStringBuilder extractedText = new StringBuilder();for (BufferedImage image : images) {extractedText.append(performOCR(image)).append("\n");}return extractedText.toString();} catch (Exception e) {e.printStackTrace();return "Error extracting text from PDF.";}}private List<BufferedImage> convertPDFToImages(String pdfFilePath) throws Exception {List<BufferedImage> images = new ArrayList<>();try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {PDFToImage pdfToImage = new PDFToImage();pdfToImage.setStartPage(1);pdfToImage.setEndPage(document.getNumberOfPages());pdfToImage.setOutputPrefix("outputImage");pdfToImage.processPages(document);for (int i = 1; i <= document.getNumberOfPages(); i++) {BufferedImage image = pdfToImage.getImage(i - 1);images.add(image);}}return images;}private String performOCR(BufferedImage image) throws Exception {ITesseract tesseract = new Tesseract();return tesseract.doOCR(image);}
}

在这个例子中,OCRService 类包含了两个方法。convertPDFToImages 方法将 PDF 文件转换为图像,而 performOCR 方法使用 Tesseract 对图像执行 OCR。最后,extractTextFromPDF 方法将这两个步骤结合在一起,对 PDF 中的每个页面执行 OCR,并返回提取的文本。

请注意,为了使这个示例运行,您需要在系统上安装 Tesseract OCR,并配置其环境变量,以便 Java 可以找到 Tesseract 的执行文件。此外,也需要配置 pdf2image 的相关依赖。

以上代码示例仅供参考,实际项目中可能需要根据具体情况进行适当的调整和优化。

2、Tesseract OCR

Tesseract OCR 是一个开源的光学字符识别引擎,由 Google 开发和维护。它能够识别图像中的文本并将其转换为可编辑的文本格式。以下是一些关于 Tesseract OCR 的关键信息:

主要特点:

  1. 多语言支持: Tesseract 支持多种语言的文本识别,包括但不限于英语、中文、西班牙语、法语等。
  2. 开源: Tesseract 是开源的,可以在 GitHub 上找到其源代码。这使得开发人员可以自由使用、修改和分发它。
  3. 灵活性: Tesseract 可以处理不同字体和样式的文本,并在一定程度上适应图像质量的变化。
  4. 训练自定义字体: 如果您有特定的字体需要识别,Tesseract 允许您使用训练数据来训练模型,以提高对这些字体的识别能力。

如何使用 Tesseract OCR:

  1. 安装 Tesseract OCR: 在您的系统上安装 Tesseract。它支持多个操作系统,包括 Windows、Linux 和 macOS。您可以从 Tesseract GitHub Releases 页面下载预编译的二进制文件。
  2. 配置环境变量: 将 Tesseract 可执行文件所在的目录添加到系统的 PATH 环境变量中,以便在命令行中直接调用 Tesseract。
  3. 使用 Tesseract: 您可以通过命令行或通过编程语言的接口使用 Tesseract。对于 Java,您可以使用 Tesseract 的 Java API(Tess4J)。

Tess4J(Java API for Tesseract):

Tess4J 是 Tesseract 的 Java 封装库,它允许您在 Java 应用程序中使用 Tesseract OCR。以下是一个简单的 Java 示例:

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import java.io.File;public class TesseractExample {public static void main(String[] args) {ITesseract tesseract = new Tesseract();try {File imageFile = new File("path/to/your/image.png");String result = tesseract.doOCR(imageFile);System.out.println("OCR Result:\n" + result);} catch (Exception e) {e.printStackTrace();}}
}

确保您在项目中添加了 Tess4J 的依赖:

<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version> <!-- 使用最新版本 -->
</dependency>

此示例演示了如何使用 Tess4J 从图像文件中提取文本。请根据您的实际需求进行适当的配置和扩展。

3、SpringBoot+pdf2image

在Spring Boot中使用pdf2image库进行PDF到图像的转换通常涉及以下几个步骤:

  1. 添加 Maven 依赖:

    在您的 Spring Boot 项目的 pom.xml 文件中添加以下依赖:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-debugger</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app2</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-graphics2d</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-font2d</artifactId><version>2.0.30</version></dependency><dependency><groupId>com.github.jai-imageio</groupId><artifactId>jai-imageio-core</artifactId><version>1.4.0</version></dependency><dependency><groupId>com.github.jai-imageio</groupId><artifactId>jai-imageio-jpeg2000</artifactId><version>1.3.0</version></dependency>
    </dependencies>
    
  2. 编写代码:

    创建一个服务类或控制器类,用于处理 PDF 到图像的转换。以下是一个简单的示例:

    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.rendering.PDFRenderer;
    import org.apache.pdfbox.tools.imageio.ImageIOUtil;
    import org.springframework.stereotype.Service;import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;@Service
    public class PdfToImageService {public void convertPdfToImages(String pdfFilePath, String outputFolderPath) {try {PDDocument document = PDDocument.load(new File(pdfFilePath));PDFRenderer pdfRenderer = new PDFRenderer(document);for (int page = 0; page < document.getNumberOfPages(); ++page) {BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300); // 300 DPIImageIOUtil.writeImage(image, outputFolderPath + "page_" + (page + 1) + ".png", 300);}document.close();} catch (IOException e) {e.printStackTrace();}}
    }
    
  3. 使用服务类:

    在您的控制器类或其他需要的地方使用 PdfToImageService

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class PdfToImageController {@Autowiredprivate PdfToImageService pdfToImageService;@GetMapping("/convertPdfToImages/{pdfFileName}")public String convertPdfToImages(@PathVariable String pdfFileName) {String pdfFilePath = "path/to/pdf/files/" + pdfFileName + ".pdf";String outputFolderPath = "path/to/output/folder/";pdfToImageService.convertPdfToImages(pdfFilePath, outputFolderPath);return "PDF to images conversion complete.";}
    }
    

    这是一个简单的示例,您可以根据实际需求进行扩展和修改。确保您的项目中有适当的文件读取和写入权限,并根据需要添加错误处理。

二、SpringBoot+OCR对pdf文件内指定区域的内容识别提取

在Spring Boot中使用OCR对PDF文件的指定区域进行内容识别和提取,您需要结合PDF处理库和OCR库。以下是一个基本的步骤,其中使用了Apache PDFBox作为PDF处理库,Tesseract作为OCR库。

1. 添加 Maven 依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version></dependency><!-- 其他可能需要的依赖 -->
</dependencies>

2. 编写服务类:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import org.springframework.stereotype.Service;import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;@Service
public class PdfOcrService {public String extractTextFromPdfRegion(String pdfFilePath, Rectangle region) {try {PDDocument document = PDDocument.load(new File(pdfFilePath));PDFTextStripper pdfStripper = new PDFTextStripper();pdfStripper.setSortByPosition(true);String pdfText = pdfStripper.getText(document);String extractedText = performOCR(pdfText, region);document.close();return extractedText;} catch (IOException e) {e.printStackTrace();return "Error extracting text from PDF.";}}private String performOCR(String pdfText, Rectangle region) {ITesseract tesseract = new Tesseract();String extractedText = "";try {extractedText = tesseract.doOCR(pdfText, region);} catch (Exception e) {e.printStackTrace();}return extractedText;}
}

3. 使用服务类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import java.awt.Rectangle;@RestController
public class PdfOcrController {@Autowiredprivate PdfOcrService pdfOcrService;@GetMapping("/extractText/{pdfFileName}")public String extractTextFromPdfRegion(@PathVariable String pdfFileName) {String pdfFilePath = "path/to/pdf/files/" + pdfFileName + ".pdf";// Define the region you want to extract (x, y, width, height)Rectangle region = new Rectangle(100, 100, 300, 200);return pdfOcrService.extractTextFromPdfRegion(pdfFilePath, region);}
}

在上述代码中,PdfOcrService 类加载PDF文档并使用PDFBox提取文本。然后,它调用performOCR 方法,该方法使用Tesseract OCR库对指定区域的文本进行识别。

请注意,这只是一个基本示例,您可能需要根据实际需求进行调整。确保在生产环境中处理异常和错误,以确保应用程序的稳定性。

相关文章:

SpringBoot+OCR 实现PDF 内容识别

一、SpringBootOCR对pdf文件内容识别提取 1、在 Spring Boot 中&#xff0c;您可以结合 OCR&#xff08;Optical Character Recognition&#xff09;库来实现对 PDF 文件内容的识别和提取。 一种常用的 OCR 库是 Tesseract&#xff0c;而 pdf2image 是一个用于将 PDF 转换为图…...

Go和Java实现抽象工厂模式

Go和Java实现抽象工厂模式 本文通过简单数据库操作案例来说明抽象工厂模式的使用&#xff0c;使用Go语言和Java语言实现。 1、抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创 建型模式&#xff0c;它…...

深入理解Java虚拟机---内存分配

深入理解Java虚拟机---内存分配 GC日志内存分配与回收策略对象优先在Eden分配大对象直接进入老年代长期存活的对象将进入老年代动态对象年龄判定空间分配担保 GC日志 以下两段典型的GC日志&#xff1a; 33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K-&…...

计算机网络2

OSI参考模型七层&#xff1a; 1.应用层 2.表示层 3.会话层 4.传输层 5.网络层 6.数据链路层 7.物理层 TCP/IP模型 5层参考模型...

jenkins-Generic Webhook Trigger指定分支构建

文章目录 1 需求分析1.1 关键词 : 2、webhooks 是什么&#xff1f;3、配置步骤3.1 github 里需要的仓库配置&#xff1a;3.2 jenkins 的主要配置3.3 option filter配置用于匹配目标分支 实现指定分支构建 1 需求分析 一个项目一般会开多个分支进行开发&#xff0c;测试&#x…...

源码解析8-QSS原理-案例-Qt的qss特殊设置多个子控件的颜色与伪状态

Qt源码解析 索引 源码解析8-QSS原理-案例-Qt的qss特殊设置多个子控件的颜色与伪状态 有些时候我们想特殊设置QSS&#xff0c;比如某一类标题栏目&#xff0c;某一个窗口中的颜色。 重要的是我们需要同时设置多个特殊的按钮等。 统一设置所有 单一按钮全局设置 QPushButton…...

Nginx+Tomcat实现负载均衡和动静分离

目录 前瞻 动静分离和负载均衡原理 实现方法 实验&#xff08;七层代理&#xff09; 部署Nginx负载均衡服务器(192.168.75.50:80) 部署第一台Tomcat应用服务器&#xff08;192.168.75.60:8080&#xff09; 多实例部署第二台Tomcat应用服务器&#xff08;192.168.75.70:80…...

linux系统的u盘/mmc/sd卡等的支持热插拔和自动挂载行为

1.了解mdev mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统&#xff08;DevFS&#xff09;的替代品&#xff0c;是 Linux 内核的设备管理器。总的来说&#xff0c;它取代了 devfs 和 hotplug&#xff0c;负责管理 /dev 中的设备节点。同时…...

使用Python将OSS文件免费下载到本地:项目分析和准备工作

大家好&#xff0c;我是水滴~~ 本文将介绍如何使用Python编程语言将OSS&#xff08;对象存储服务&#xff09;中的文件免费下载到本地计算机。我们先进行项目分析和准备工作&#xff0c;为后续的编码及实施提供基础。 《Python入门核心技术》专栏总目录・点这里 文章目录 1. 前…...

从Gitee克隆项目、启动方法

从gitee克隆VUE项目到本地后&#xff0c;不能直接运行&#xff0c;需要进行npm install安装node_modules文件夹里面的内容&#xff0c;因为在git上传的时候&#xff0c;一般都会过滤到node_modules中的依赖文件。 安装依赖以后&#xff0c;启动通过npm run serve启动项目出错。…...

不用再找了,这是大模型实践最全的总结

随着ChatGPT的迅速出圈&#xff0c;加速了大模型时代的变革。对于以Transformer、MOE结构为代表的大模型来说&#xff0c;传统的单机单卡训练模式肯定不能满足上千&#xff08;万&#xff09;亿级参数的模型训练&#xff0c;这时候我们就需要解决内存墙和通信墙等一系列问题&am…...

QT 记录

qml 移动窗口会闪烁 int main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);//orQCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); }window 拉取qml程序依赖文件 打开QT自带的命令窗口&#xff0c;转到exe程序目录&#xff1a; …...

智能优化算法应用:基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑寡妇算法4.实验参数设定5.算法结果6.参考文…...

VSCode 常用的快捷键和技巧系列(2)

一、如何让VSCode工程树显示图标 第一步&#xff1a;安装 快捷键 CtrlP &#xff0c;输入 ext install vscode-icons &#xff0c;然后点击安装插件 第二步&#xff1a;配置 安装成功后&#xff0c;点击Reload重新加载。 然后配置&#xff0c;当前图标使用VsCode-Icons Go…...

【Hadoop】执行start-dfs.sh启动hadoop集群时,datenode没有启动怎么办

执行start-dfs.sh后&#xff0c;datenode没有启动&#xff0c;很大一部分原因是因为在第一次格式化dfs后又重新执行了格式化命令&#xff08;hdfs namenode -format)&#xff0c;这时主节点namenode的clusterID会重新生成&#xff0c;而从节点datanode的clusterID 保持不变。 在…...

计算机网络(四)

九、网络安全 &#xff08;一&#xff09;什么是网络安全&#xff1f; A、网络安全状况 分布式反射攻击逐渐成为拒绝攻击的重要形式 涉及重要行业和政府部门的高危漏洞事件增多。 基础应用和通用软硬件漏洞风险凸显&#xff08;“心脏出血”&#xff0c;“破壳”等&#x…...

非递归实现的快速排序

目录 序列文章 前言 学前补充 非递归快速排序 注意事项&#xff08;重要&#xff09; 实现步骤 代码实现 时空复杂度 快速排序的特性 栈的相关代码 序列文章 非递归实现的快速排序&#xff1a;http://t.csdnimg.cn/UEcL6 快速排序的挖坑法与双指针法&#xff1a;ht…...

windows 安装jenkins

下载jenkins 官方下载地址&#xff1a;Jenkins 的安装和设置 清华源下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/windows-stable/ 最新支持java8的版本时2.346.1版本&#xff0c;在清华源中找不到&#xff0c;在官网中没找到windows的下载历史&#xff…...

SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?

文章目录 简介事务版本号行记录的隐藏列Undo LogRead View的工作流程总结参考文献 简介 在不同的DBMS里&#xff0c;MVCC的实现机制是不同的。本节我们会以InnoDB举例&#xff0c;讲解InnoDB里MVCC的实现机制。 我们需要掌握这么几个概念&#xff1a; 事务版本号行记录的隐藏…...

SpringCloudAliBaba篇之Seata:分布式事务组件理论与实践

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成&#xff0c;事务具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。这四个属性通常称为ACID原则。 原子性(atomici…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...