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

PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性

我们来详细解释一下在 PDF.js 生态中如何处理“添加注释”以及 annotations.contents 属性。

核心要点:PDF.js 本身主要是阅读器,不是编辑器

首先,最重要的一点是:PDF.js 的核心库 (pdfjs-dist) 主要设计用于解析和渲染(显示)PDF 文件,它本身并不提供直接修改 PDF 文件内容(包括添加、删除或修改注释并将其永久保存回原始 PDF 文件)的内置功能。

当你看到 PDF.js 的演示查看器(Viewer)允许你添加高亮、文本注释、绘图等时,这些操作通常是在浏览器层面实现的:

  1. 交互式添加:用户通过 UI 工具在 PDF 的渲染层之上进行绘制或输入。
  2. 临时存储:这些新创建的注释信息(类型、位置、颜色、文本内容等)通常被存储在浏览器中(例如,使用浏览器的 localStorage 或一个专门的 AnnotationStorage 对象),或者只是存在于当前的会话内存中。
  3. 渲染叠加:查看器将这些存储的注释信息在相应的页面上渲染出来,看起来就像它们是 PDF 的一部分。
  4. 保存(可选,通常需要额外实现):要将这些注释永久保存到 PDF 文件中,需要一个额外的步骤,通常涉及:
    • 将注释数据发送到服务器。
    • 服务器使用一个能够修改 PDF 文件的库(例如 Node.js 的 pdf-lib,Java 的 iText/PDFBox,Python 的 PyPDF2/ReportLab 等)来解析原始 PDF,将新的注释对象按照 PDF 规范添加到相应的页面字典中,然后生成一个新的、包含注释的 PDF 文件。
    • 或者,在客户端使用像 pdf-lib 这样的库直接在浏览器中修改 PDF(这可能对性能要求较高,且需要用户下载修改后的新文件)。

关于 annotations.contents

  • 读取时: 当你使用 page.getAnnotations() 获取已存在于 PDF 文件中的注释时,contents 属性是 PDF 规范中定义的注释字典(Annotation Dictionary)里的 /Contents 键对应的值。这通常用于存储:

    • 文本注释(Sticky Note,类型为 ‘Text’)的弹出窗口中显示的文本。
    • 自由文本注释(Free Text,类型为 ‘FreeText’)框中显示的文本。
    • 某些其他注释类型可能用它来存储描述性文本。
    // (假设你已经获取了 page 对象)
    const annotations = await page.getAnnotations();
    annotations.forEach(anno => {if (anno.subtype === 'Text' || anno.subtype === 'FreeText') {// 读取已存在注释的 contentsconsole.log(`注释类型: ${anno.subtype}, 内容: ${anno.contents}`);}// 其他类型的注释可能没有 'contents' 或其含义不同
    });
    
  • 添加时(在 Viewer 或通过外部库): 当你想要添加一个新的文本类注释时,你需要设置这个 contents 属性为你希望注释包含的文本内容。

    • 在 PDF.js Viewer 中:当你使用文本工具添加注释并输入文字时,查看器内部的逻辑会将你输入的文字赋值给它正在创建或管理的注释对象的 contents 属性(以及其他必要的属性如 rect, subtype, color 等)。
    • 使用外部库(如 pdf-lib)添加时:你需要手动构建一个符合 PDF 规范的注释字典对象,并在其中包含 /Contents 键(在 JavaScript 对象中通常是 contents 属性),然后将这个字典添加到页面的 /Annots 数组中。

示例:使用 pdf-lib 在浏览器或 Node.js 中添加带 contents 的文本注释(概念性)

这个例子不是使用 PDF.js,而是展示了如何用一个能够修改 PDF 的库 (pdf-lib) 来完成这个任务,这通常是实现“永久添加注释”所需要的方法。

// 需要先安装 pdf-lib: npm install pdf-lib
import { PDFDocument, rgb, StandardFonts } from 'pdf-lib';async function addTextAnnotation(inputPdfBytes, pageIndex, textContent, rect) {// 加载 PDF 文档const pdfDoc = await PDFDocument.load(inputPdfBytes);const pages = pdfDoc.getPages();const targetPage = pages[pageIndex]; // 获取要添加注释的页面 (0-based index)// 获取页面的尺寸,用于可能的坐标计算const { width, height } = targetPage.getSize();// 准备字体 (对于 FreeText 可能需要)const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica);// 创建一个文本注释 (Sticky Note / Popup)// 注意:添加注释通常涉及创建注释本身和可能的弹出窗口 (Popup)// 这里简化,仅展示核心概念 - pdf-lib 可能有更高级的 API// 需要查阅 pdf-lib 文档以获取创建特定注释类型的准确方法// 假设我们要创建一个 'Text' (Sticky Note) 注释// 1. 定义注释的外观字典 (Appearance Dictionary - /AP) - 这部分复杂,pdf-lib 可能简化了它// 2. 创建注释字典const textAnnotationDict = pdfDoc.context.obj({Type: 'Annot', // PDF 对象类型Subtype: 'Text', // 注释子类型:文本注释 (Sticky Note)Rect: rect, // 注释在页面上的位置 [lowerLeftX, lowerLeftY, upperRightX, upperRightY]Contents: textContent, // <--- 设置注释的文本内容C: [1, 1, 0], // 颜色 (RGB, e.g., Yellow)T: '作者名称', // 标题 (可选)M: new Date().toISOString(), // 修改日期 (可选)Name: 'Comment', // 图标名称 (e.g., 'Comment', 'Note')Open: false, // 初始状态是否打开 Popup (通常 false)// 可能还需要 /P (页面引用), /Popup (关联的弹出窗口对象) 等});// 将注释字典添加到页面的 /Annots 数组// pdf-lib 提供了更方便的方法来添加注释,而不是直接操作字典:// (请查阅 pdf-lib 文档,以下为示意)targetPage.node.addAnnot(textAnnotationDict); // 这行是示意,具体 API 可能不同// 另存为新的 PDF 文件const pdfBytes = await pdfDoc.save();// 返回修改后的 PDF 文件字节流 (Uint8Array)return pdfBytes;
}// --- 使用示例 (假设在浏览器中) ---
async function handleFileSelect(event) {const file = event.target.files[0];if (!file) return;const reader = new FileReader();reader.onload = async (e) => {const inputPdfBytes = new Uint8Array(e.target.result);try {const newPdfBytes = await addTextAnnotation(inputPdfBytes,0, // 添加到第一页 (index 0)'这是我用 pdf-lib 添加的注释内容!', // 设置 contents[50, 700, 200, 750] // 注释的位置 [x1, y1, x2, y2] (从左下角算起));// 让用户下载修改后的 PDFconst blob = new Blob([newPdfBytes], { type: 'application/pdf' });const link = document.createElement('a');link.href = URL.createObjectURL(blob);link.download = 'annotated_document.pdf';link.click();URL.revokeObjectURL(link.href);} catch (error) {console.error("添加注释失败:", error);}};reader.readAsArrayBuffer(file);
}

总结

  • 使用 PDF.js 的 page.getAnnotations() 可以读取 PDF 文件中已有注释的 contents 属性。
  • PDF.js 的核心库不能直接用于添加注释并永久保存到 PDF 文件中。
  • PDF.js 的查看器可以在界面上创建和显示注释,但这些注释默认是临时存储的(如 localStorage),需要额外的工作才能将其永久保存到 PDF 文件中。
  • 永久添加注释(包括设置 contents),你需要:
    • 要么将注释数据发送到服务器,使用服务器端的 PDF 修改库来处理。
    • 要么在客户端使用像 pdf-lib 这样的 JavaScript PDF 修改库来直接操作 PDF 文件字节流,然后生成一个新的、包含注释的 PDF 文件供用户下载。
  • 当你使用这些修改库添加注释时,你需要按照 PDF 规范构建注释对象,并将所需的文本内容赋值给 contents 属性(或 PDF 字典中的 /Contents 键)。

相关文章:

PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性

我们来详细解释一下在 PDF.js 生态中如何处理“添加注释”以及 annotations.contents 属性。 核心要点&#xff1a;PDF.js 本身主要是阅读器&#xff0c;不是编辑器 首先&#xff0c;最重要的一点是&#xff1a;PDF.js 的核心库 (pdfjs-dist) 主要设计用于解析和渲染&#xf…...

L38.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因

目录 1.题目 2.分析 去重的代码 错误代码 3.完整代码 提交结果 1.题目 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元…...

【第48节】探究汇编使用特性:从基础到混合编程

目录 引言 一、调用约定的奥秘 1.1 . C调用约定&#xff08;_cdecl&#xff09; 1.2 stdcall调用约定&#xff08;_stdcall&#xff09; 1.3 fastcall快速调用约定&#xff08;_fastcall&#xff09; 1.4 thiscall调用约定&#xff08;C类成员函数&#xff09; 二、X64汇…...

【jenkins】首次配置jenkins

第一步&#xff0c;输入管理员密码 cat /var/jenkins_home/secrets/initialAdminPassword第二步&#xff0c;点击安装推荐的插件 第三步&#xff0c;创建管理员用户 第四步&#xff0c;返回实例 第五步&#xff0c; 升级jenkins 第六步&#xff0c; 修复提示 第七步&#xff0c…...

Python 项目文档编写全攻略:从入门到自动化维护

引言 在软件开发领域&#xff0c;完善的文档可提升 40% 的团队协作效率&#xff08;来源&#xff1a;IEEE 2022 年开发者调查报告 ^^1^^&#xff09;。本文将深入探讨 Python 项目文档的最佳实践&#xff0c;涵盖文档生成工具、注释规范、自动化维护等关键环节。 一、Python 文…...

基于 React 和 CodeMirror 实现自定义占位符编辑器

npm git 在前端开发中&#xff0c;我们经常需要实现各种复杂的编辑器功能&#xff0c;比如代码编辑器、富文本编辑器等。本文将介绍如何基于 React 和 CodeMirror 实现一个带有自定义占位符功能的编辑器&#xff0c;这种编辑器在模板系统、表单设计器等场景中非常有用。 一…...

GitHub Copilot在产品/安全团队中的应用实践:处理Markdown、自动化报告与电子表格、使用CLI命令等

本文来源github.com&#xff0c;由GitHub中国授权合作伙伴-创实信息翻译整理。 在当今的快节奏时代&#xff0c;技术和非技术团队之间的协作至关重要&#xff0c;事实证明&#xff0c;GitHub Copilot等工具已成为不可或缺的助手。这些由AI驱动的工具已不只是开发者的“秘密武器…...

嵌入式系统中Flash操作全面解析与最佳实践

嵌入式系统中Flash操作全面解析与最佳实践 一、Flash存储器基础与分类 Flash存储器是嵌入式系统中最重要的非易失性存储介质&#xff0c;根据内部架构和工作原理主要分为两大类&#xff1a; 1.1 NOR Flash与NAND Flash对比 特性NOR FlashNAND Flash架构随机存取架构串行存取…...

tomcat 的安装与启动

文章目录 tomcat 服务器安装启动本地Tomcat服务器 tomcat 服务器安装 https://tomcat.apache.org/下载 Tomcat 10.0.X 启动本地Tomcat服务器 进入 Tomcat 的 bin...

Flash存储器(二):SPI NAND Flash与SPI NOR Flash

目录 一.存储架构 二.接口与封装 三.特性对比 四.典型应用场景 4.1 SPI NOR Flash 4.2 SPI NAND Flash 五.技术演进与市场趋势 六.选择建议 6.1 选择SPI NOR的场景 6.2 选择SPI NAND的场景 SPI NAND Flash和SPI NOR Flash是嵌入式设备中常用的存储器。下面通过全面对…...

第 7 期:DDPM 采样提速方案:从 DDPM 到 DDIM

本期关键词:采样加速、DDIM 推导、可控性提升、伪逆过程、代码实战 前情回顾:DDPM 的采样瓶颈 在前几期中,我们构建了一个完整的 DDPM 生成流程。但是你可能已经发现: 生成一张图像太慢了!!! 原因是: DDPM 要在 T 个时间步中一步步地去噪,从 x_T → x_0。而通常 T 至…...

axios 模拟实现

axios 模拟实现 包含[发送请求,拦截器,取消请求] 第一步 , axios模拟发送请求 //使用 xhr 发送请求function xhr_adpter(config){return new Promise(function handle(resolve,reject){let xhr new XMLHttpRequest();xhr.open(config.method, config.url,true);xhr.onreadys…...

架构师面试(三十一):IM 消息收发逻辑

问题 今天聊一下 IM 系统最核心的业务逻辑。 在上一篇短文《架构师面试&#xff08;三十&#xff09;&#xff1a;IM 分层架构》中详细分析过&#xff0c;IM 水平分层架构包括&#xff1a;【入口网关层】、【业务逻辑层】、【路由层】和【数据访问层】&#xff1b;除此之外&a…...

hadoop三大组件的结构及各自的作用

1 HDFS 1.1功能 HDFS 是 Hadoop 的分布式文件系统&#xff0c;用于存储和管理海量数据。它具有高容错性、高吞吐量和可扩展性&#xff0c;能够在多个节点上存储和管理大规模数据 1.2架构&#xff1a;采用主从架构&#xff0c;由一个 NameNode 和多个 DataNode 组成。NameNode…...

GEE学习笔记 29:基于GEE的多源Landsat合成与植被指数时序提取

基于GEE的多源Landsat合成与植被指数时序提取 🌿 1.写在前面 | 基于GEE的Landsat多尺度植被指数提取脚本📌 2.常用植被指数计算公式2.1. 🌿 NDVI(归一化植被指数)Normalized Difference Vegetation Index2.2. 🌱 EVI(增强型植被指数)Enhanced Vegetation Index2.3.…...

负载均衡的策略

目的&#xff1a;将请求均衡分发到后台的服务器 算法&#xff1a; 随机算法&#xff1a;随机数获取服务器加权随机算法&#xff1a;根据权重&#xff0c;增加某些服务器&#xff08;性能比较好等&#xff09;选择的随机比例轮询算法&#xff1a;轮流分发给服务器加权轮询算法…...

AWS Elastic Beanstalk的部署Python Flask后端服务(Hello,World)

问题 最近需要使用AWS Elastic Beanstalk来部署Python的Flask后端web接口。这里先做一个最简单的Flask Hello&#xff0c;World接口服务程序。 Flask工程与代码 创建本地虚拟环境 conda create -n flask python3.13 # 激活 conda activate flaskapp.py from flask import …...

Hadoop的三大结构及各自的作用?

1.HDFS 作用&#xff1a; 存储海量数据&#xff0c;支持高容错&#xff08;数据自动备份&#xff09;和高吞吐量&#xff08;适合大文件读写&#xff09;。 采用主从架构&#xff1a; NameNode&#xff1a;管理文件系统的元数据&#xff08;如文件目录结构&#xff09;。 Dat…...

在Ubuntu系统中安装和升级RabbitVCS

在Ubuntu系统中安装和升级RabbitVCS 目前在ubuntu中使用svn的GUI工具&#xff0c;已经安装了。想升级一下。 当前遇到的问题是&#xff0c;我想用它看看我当前的代码对应的版本号&#xff0c;然后再决定是否update。但是&#xff0c;好像我看不出来。根本不如在windows使用To…...

深入理解红黑树:原理、实现与应用

深入理解红黑树&#xff1a;原理、实现与应用 引言 红黑树&#xff08;Red-Black Tree&#xff09;是计算机科学中一种重要的自平衡二叉查找树。它通过简单的规则和高效的调整策略&#xff0c;保证了插入、删除、查找等操作的时间复杂度均为 O(log n)。红黑树广泛应用于实际开…...

Java学习手册:Java并发编程最佳实践

在Java并发编程中&#xff0c;遵循最佳实践可以显著提高程序的性能、可靠性和可维护性。本文将总结Java并发编程中的关键最佳实践&#xff0c;帮助开发者避免常见陷阱并编写高效的并发程序。 1. 选择合适的并发工具 Java提供了丰富的并发工具&#xff0c;选择合适的工具可以简…...

接口自动化测试(二)

一、接口测试流程&#xff1a;接口文档、用例编写 拿到接口文档——编写接口用例以及评审——进行接口测试——工具/自动化框架进行自动化用例覆盖(70%)——输出测试报告 自动化的目的一般是为了回归 第一件事情&#xff1a;理解需求&#xff0c;学会看接口文档 只需要找到我…...

C++类和对象上

1. 面向对象编程与面向过程编程的比较 我们一开始接触的C语言就是一门面向过程编程的语言&#xff0c;而C就是一门面向对象编程的语言。那么这两者有什么区别呢&#xff1f; 举个例子&#xff0c;就比如说点外卖&#xff0c;如果是C语言的话&#xff0c;那么在程序的编写过程…...

hadoop的三大结构及各自的作用

Hadoop 分布式文件系统&#xff08;HDFS&#xff09; 存储大量数据&#xff1a;HDFS 被设计用于在商品硬件上存储海量数据&#xff0c;它将大文件分割成多个数据块&#xff0c;并分布存储在集群中的不同节点上&#xff0c;支持数据的可靠存储和高效访问。提供数据冗余和容错机制…...

珈和科技遥感赋能农业保险创新 入选省级卫星应用示范标杆

为促进空天信息与数字经济深度融合&#xff0c;拓展卫星数据应用场景价值&#xff0c;提升卫星数据应用效能和用户体验&#xff0c;加速卫星遥感技术向民生领域转化应用&#xff0c;近日&#xff0c;湖北省国防科工办组织开展了2024年湖北省卫星应用示范项目遴选工作。 经多渠…...

香港服务器CPU对比:Intel E3与E5系列核心区别与使用场景

香港服务器的 CPU 配置(核心数与主频)直接决定了其并发处理能力和数据运算效率&#xff0c;例如高频多核处理器可显著提升多线程任务响应速度。在实际业务场景中&#xff0c;不同负载需求对 CPU 架构的要求存在显著差异——以 Intel E3 和 E5 系列为例&#xff0c;由于两者在性…...

【人工智能】DeepSeek 与 RAG 技术:构建知识增强型问答系统的实战

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 本文深入探讨了如何利用 DeepSeek R1 模型结合检索增强生成(RAG)技术,构建一个高效的知识增强型问答系统。RAG 技术通过结合信息检索与生…...

得佳胜哲讯科技 SAP项目启动会:胶带智造新起点 数字转型新征程

在全球制造业加速向数字化、智能化转型的浪潮中&#xff0c;胶带制造行业正迎来以“自动化生产、数据化运营、智能化决策”为核心的新变革。工业互联网、大数据分析与智能装备的深度融合&#xff0c;正推动胶带制造从传统生产模式向“柔性化生产精准质量控制全链路追溯”的智慧…...

超导体的应用价值:超导磁探测技术开启科技与生活的新变革

科技的飞速发展&#xff0c;带来了一种新型材料的快速应用&#xff0c;那就是超导体材料。超导体的特性&#xff0c;能够为当今社会众多领域带来革命性的变革&#xff0c;也将极大的改变我们现在的生活质量。 超导体的特性 超导体是指在特定温度下的电阻会突然消失&#xff0c…...

UNION和UNION ALL的主要区别

UNION和UNION ALL的主要区别在于处理重复数据和排序的方式。 UNION和UNION ALL都是SQL语言中用于合并两个或多个SELECT语句结果集的关键字。它们的主要区别如下&#xff1a; 1、对重复结果的处理&#xff1a;UNION在进行表链接后会筛选掉重复的记录&#xff0c;而UNION ALL不会…...

软件项目验收报告模板

软件项目验收报告 一、项目基本信息 项目名称XX智能仓储管理系统开发单位XX科技有限公司验收单位XX物流集团合同签订日期2023年3月15日项目启动日期2023年4月1日验收日期2024年1月20日 二、验收范围 入库管理模块&#xff08;包含RFID识别、库存预警&#xff09;出库调度模…...

第五章 SQLite数据库:5、SQLite 进阶用法:JOIN、UNION、TRIGGER、INDEX、ALIAS、INDEXED BY 等模块

一、JOIN&#xff1a;跨表查询的核心机制 1. JOIN 类型总览 JOIN 是连接多个表获取综合信息的关键手段。常见 JOIN 类型如下&#xff1a; INNER JOIN&#xff08;内连接&#xff09;&#xff1a;仅返回两个表中满足连接条件的行。LEFT OUTER JOIN&#xff08;左连接&#xf…...

中间件--ClickHouse-10--海量数据存储如何抉择ClickHouse和ES?

在Mysql数据存储或性能瓶颈时&#xff0c;采用冷热数据分离的方式通常是一种选择。ClickHouse和Elasticsearch&#xff08;ES&#xff09;是两个常用的组件&#xff0c;但具体使用哪种组件取决于冷数据的存储目的、查询模式和业务需求等方面。 1、核心对比 &#xff08;1&…...

JESD204B标准及其在高速AD采集系统中的应用详解

一、JESD204B协议的本质与核心价值 JESD204B是由JEDEC制定的第三代高速串行接口标准&#xff08;2011年发布&#xff09;&#xff0c;专为解决高速ADC/DAC与FPGA/ASIC间数据传输瓶颈而设计。其核心突破体现在&#xff1a; 速率革命性提升 支持每通道最高12.5Gbps&#xff08;通…...

给予FLUX更好的控制:FLUX.1-dev-ControlNet-Union-Pro-2.0

Shakker Labs FLUX.1-dev-ControlNet-Union-Pro-2.0 一、模型概述 Shakker Labs发布的FLUX.1-dev-ControlNet-Union-Pro-2.0是一个统一的ControlNet模型&#xff0c;专为FLUX.1-dev模型设计。该模型在前一版本基础上进行了多项改进&#xff0c;包括移除模式嵌入以减小模型尺寸…...

Hadoop的三大结构及其作用?

Hadoop是一个分布式存储和计算框架&#xff0c;其三大核心组件是HDFS&#xff08;Hadoop Distributed File System&#xff09;、YARN&#xff08;Yet Another Resource Negotiator&#xff09;和MapReduce。它们各自有着重要的作用&#xff0c;共同构成了Hadoop生态系统的基础…...

langgraph框架之初识

1.什么是langgraph&#xff1f; LangGraph 是一个用于构建可控代理的底层编排框架。在AI中&#xff0c;代理也就是执行动作的智能体&#xff0c;也就是agent。使用这个框架可以构建一个可以自由控制的智能执行体&#xff0c;它可以帮我们做许多事情&#xff0c;如下&#xff1…...

3个实用的脚本

1. Linux 系统清理临时文件脚本 该脚本用于清理系统中 /tmp 目录下超过 7 天的临时文件。 #!/bin/bash# 清理 /tmp 目录下超过 7 天的文件 find /tmp -type f -atime 7 -exec rm -f {} \;# 清理 /var/tmp 目录下超过 7 天的文件 find /var/tmp -type f -atime 7 -exec rm -f {…...

Vue3 Composition API与十大组件开发案例详解

文章目录 一、Vue3核心API解析1.1 Composition API优势1.2 核心API 二、十大组件开发案例案例1&#xff1a;响应式表单组件案例2&#xff1a;动态模态框&#xff08;Teleport应用&#xff09;案例3&#xff1a;可复用列表组件案例4&#xff1a;全局状态通知组件案例5&#xff1…...

万用表判断MOS好坏

无论什么封装&#xff0c;D极一般在正面看的上面&#xff0c;或者焊盘面积最大的一面&#xff1a; 【零】烧个洞的那种&#xff0c;不用量了&#xff0c;一眼损坏 【一】万用表的二极管档位测量 检修&#xff1a;使用万用表的二极管档位&#xff0c;S极接红表笔&#xff0c;黑…...

算法驱动光场革命:SLM技术引领智能光学新时代

◀背景引入▶ 空间光调制器本质上是一种能够对光波的振幅、相位或偏振状态进行空间分布调制的动态光学器件&#xff0c;我司自主研发的SLM产品采用硅基液晶技术&#xff0c;通过电信号控制液晶分子的排列状态&#xff0c;实现对入射光波的精确调控。这种精确调控能力使得SLM成…...

webgl入门实例-11WebGL 视图矩阵 (View Matrix)基本概念

WebGL 视图矩阵 (View Matrix) 在WebGL中&#xff0c;视图矩阵(View Matrix)定义了观察者(相机)在世界空间中的位置和方向&#xff0c;它实现了从世界坐标系到相机坐标系的转换。 什么是视图矩阵&#xff1f; 视图矩阵是一个4x4的矩阵&#xff0c;用于&#xff1a; 将场景从…...

ESP32 搭建IDF+Vscode环境(详细教程)

1. IDF环境安装 1.1 ESP-IDF介绍​ ESP-IDF (Espressif IoT Development Framework) 是 Espressif( 乐鑫) 公司提供的面向ESP32 系列 的官方开源开发框架&#xff0c;用于开发物联网应用。ESP-IDF 的特点是高度的集成性和可移植性&#xff0c;提供了完整的 SDK&#xff0c;…...

精准计量+AI管控——安科瑞助力高校水电管理数字化转型

安科瑞顾强 传统管理痛点&#xff1a;效率低、隐患多、成本高 高校后勤水电管理长期面临多重挑战&#xff1a;人工抄表需宿管逐层逐户记录&#xff0c;耗时耗力且易出现漏抄、错抄&#xff0c;导致费用核算不公&#xff1b;老旧机械式电表误差率高达5%-10%&#xff0c;计量纠…...

PHP腾讯云人脸核身获取SIGN Ticket

参考腾讯云官方文档&#xff1a;人脸核身 获取 SIGN ticket_腾讯云 前提条件&#xff1a;已经获取了access_token。获取方法可参考&#xff1a; PHP腾讯云人脸核身获取Access Token-CSDN博客 public function getSignTicket(){$access_token file_get_contents(/data/confi…...

探索 Higress:下一代云原生 API 网关

引言 在云原生时代&#xff0c;API 网关作为连接客户端与后端服务的桥梁&#xff0c;扮演着至关重要的角色。Higress 是一款由阿里巴巴开发的先进云原生 API 网关&#xff0c;基于开源的 Istio 和 Envoy 构建。它通过将流量网关、微服务网关和安全网关三者高度集成&#xff0c…...

UE5编辑器静止状态下(非 Play 模式)睫毛和眼睛的渲染是正常的,而在 Play 模式下出现模糊

这通常指向以下几个 运行时&#xff08;Runtime&#xff09; 特有的原因&#xff1a; 抗锯齿 (Anti-Aliasing) 方法&#xff0c;特别是 Temporal Anti-Aliasing (TAA): 这是最可能的原因。 UE5 默认启用的 TAA 通过混合多帧信息来平滑边缘和减少闪烁&#xff0c;尤其是在运动中…...

ubuntu-24.04.2-live-server-arm64基于cloud-init实现分区自动扩容(LVM分区模式)

1. 环境 虚拟机镜像ISO&#xff1a;ubuntu-24.04.2-live-server-arm64.iso 2. 定制cloud-init镜像 2.1 安装OS 基于ubuntu-24.04.2-live-server-arm64.iso&#xff0c;通过virt-manager安装操作系统&#xff0c;语言建议选择英文&#xff0c;分区选择基于LVM的自动分区&…...

解决 Spring Boot 多数据源环境下事务管理器冲突问题(非Neo4j请求标记了 @Transactional 尝试启动Neo4j的事务管理器)

0. 写在前面 到底遇到了什么问题&#xff1f; 简洁版&#xff1a; 在 Oracle 与 Neo4j 共存的多数据源项目中&#xff0c;一个仅涉及 Oracle 操作的请求&#xff0c;却因为 Neo4j 连接失败而报错。根本原因是 Spring 的默认事务管理器错误地指向了 Neo4j&#xff0c;导致不相…...

直线轴承在自动化机械设备中的应用

直线轴承作为机械传动系统中的关键部件&#xff0c;凭借其高精度、低摩擦和稳定性能&#xff0c;被广泛应用于各类自动化设备中。以下是直线轴承在自动化领域的典型应用场景&#xff1a; CNC机床 在数控机床的进给系统中&#xff0c;直线轴承与精密导轨配合使用&#xff0c;为刀…...