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

使用 CDN 在国内加载本地 PDF 文件并处理批注:PDF.js 5.x 实战指南

PDF.js 是一个强大的开源 JavaScript 库,用于在 Web 浏览器中渲染 PDF 文件。它由 Mozilla 开发,能够将 PDF 文档绘制到 HTML5 Canvas 或 SVG 上,无需任何本机代码或浏览器插件。对于许多需要在网页中展示 PDF 内容的应用场景来说,PDF.js 是一个非常理想的选择。

本文将重点探讨以下几个方面:

  1. 如何通过 CDN 在网页中引入 PDF.js 库。
  2. 在中国大陆地区选择哪些 CDN 服务以获得更好的访问速度和稳定性。
  3. 如何使用 PDF.js 加载用户选择的本地 PDF 文件。
  4. PDF.js 如何处理 PDF 文件中的批注,以及在使用批注功能时需要注意的事项。

我们将以 PDF.js 5.x 版本为例进行讲解,但核心原理同样适用于其他版本。

1. 通过 CDN 引入 PDF.js

使用 CDN (内容分发网络) 引入 PDF.js 是最常见和便捷的方式,它可以减轻服务器压力,并利用 CDN 节点的地理优势加速文件的传输。引入 PDF.js 主要需要两个文件:

  • pdf.min.js: PDF.js 的核心库,包含了主要的 API 和渲染逻辑。
  • pdf.worker.min.js: PDF.js 的 Worker 脚本,用于在后台线程中处理 PDF 的解析和渲染任务,避免阻塞主线程。

你需要在 HTML 文件的 <head><body> 标签中引入它们:

<script src="[CDN_URL_FOR_PDF.MIN.JS]"></script>
<script>// 必须设置 workerSrc 指向 worker 脚本的 URLpdfjsLib.GlobalWorkerOptions.workerSrc = '[CDN_URL_FOR_PDF.WORKER.MIN.JS]';
</script>

请将 [CDN_URL_FOR_PDF.MIN.JS][CDN_URL_FOR_PDF.WORKER.MIN.JS] 替换为实际的 CDN 链接。注意,workerSrc 必须设置,并且核心库和 worker 脚本的版本号必须严格匹配。

2. 中国大陆地区 CDN 选择建议

对于在中国大陆地区访问的用户,受限于网络环境,直接使用一些国际 CDN(如 Cloudflare CDN)可能会遇到访问速度慢或不稳定的问题。为了获得更好的用户体验,建议选择在中国有部署节点或与中国本地服务商有合作的 CDN。

以下是两个在中国大陆地区表现通常较好的开源库 CDN:

a. jsDelivr

jsDelivr 是一个免费的、高速的开源 CDN,它与中国的网宿、七牛云等服务商有深度合作,拥有广泛的中国大陆节点。对于开源库来说,jsDelivr 是一个非常可靠的选择。

你可以在 jsDelivr 上通过 npm/package-name@version/file-path 的格式找到 PDF.js 的文件。PDF.js 的 npm 包名是 pdfjs-dist

例如,如果你需要引入接近 5.x 的某个稳定版本,你需要查找具体的版本号(请注意,pdf.js 版本号通常是构建号,例如 4.0.269 是一个近期版本,请替换为你实际需要的 5.x 对应的版本号):

  • 核心库 (pdf.min.js):
    https://cdn.jsdelivr.net/npm/pdfjs-dist@版本号/build/pdf.min.js
    例:https://cdn.jsdelivr.net/npm/pdfjs-dist@4.0.269/build/pdf.min.js
  • Worker 脚本 (pdf.worker.min.js):
    https://cdn.jsdelivr.net/npm/pdfjs-dist@版本号/build/pdf.worker.min.js
    例:https://cdn.jsdelivr.net/npm/pdfjs-dist@4.0.269/build/pdf.worker.min.js

请访问 jsDelivr 官网或利用其搜索功能,查找 pdfjs-dist 包下您需要的具体 5.x 版本号和文件路径。

b. BootCDN

BootCDN 是一个由国内团队维护的、专注于服务国内开发者的开源库 CDN 平台。它同步了许多国外常用开源库的资源,并使用国内的 CDN 服务商提供加速。

你可以在 BootCDN 上搜索 “pdf.js” 或 “pdfjs-dist” 来找到对应的资源。BootCDN 的 URL 格式通常是 cdn.bootcdn.net/ajax/libs/library-name/version/file-path

例如,如果你需要引入接近 5.x 的某个版本(同样,请替换为你实际需要的 5.x 对应的版本号):

  • 核心库 (pdf.min.js):
    https://cdn.bootcdn.net/ajax/libs/pdf.js/版本号/pdf.min.js
    例:https://cdn.bootcdn.net/ajax/libs/pdf.js/4.0.269/pdf.min.js
  • Worker 脚本 (pdf.worker.min.js):
    https://cdn.bootcdn.net/ajax/libs/pdf.js/版本号/pdf.worker.min.js
    例:https://cdn.bootcdn.net/ajax/libs/pdf.js/4.0.269/pdf.worker.min.js

请访问 BootCDN 官网查找您需要的 pdf.js 版本对应的具体文件路径。

重要: 在选择 CDN 后,请务必替换 HTML 中的 [CDN_URL_FOR_PDF.MIN.JS][CDN_URL_FOR_PDF.WORKER.MIN.JS] 为您选择的 CDN 提供的实际链接,并确保两个文件的版本号一致。

3. 加载本地 PDF 文件

PDF.js 可以通过多种方式加载 PDF 源,包括 URL、 TypedArray (如 ArrayBuffer)、以及 Blob。要加载本地文件,最常用的方式是结合 <input type="file">FileReader API,将文件读取为 ArrayBuffer,然后传递给 PDF.js。

首先,在 HTML 中添加一个用于用户选择本地文件的输入框,以及一个用于渲染 PDF 的 canvas 元素:

<input type="file" id="pdfFile" accept=".pdf">
<canvas id="the-canvas"></canvas>

然后,使用 JavaScript 监听文件输入框的 change 事件,读取文件内容并使用 PDF.js 加载和渲染:

document.getElementById('pdfFile').addEventListener('change', function(event) {var file = event.target.files[0]; // 获取用户选择的第一个文件// 检查文件类型if (file.type !== "application/pdf") {alert(file.name + " 不是一个有效的 PDF 文件。");return;}var fileReader = new FileReader();// 当文件读取完成后fileReader.onload = function() {// 文件内容作为 ArrayBuffervar typedarray = new Uint8Array(this.result);// 使用 PDF.js 加载 PDF 文档const loadingTask = pdfjsLib.getDocument(typedarray);loadingTask.promise.then(function(pdf) {console.log('PDF 加载成功');// 以第一页为例进行渲染pdf.getPage(1).then(function(page) {console.log('页面加载成功');var scale = 1.5; // 缩放比例var viewport = page.getViewport({ scale: scale });// 获取 canvas 元素及其上下文var canvas = document.getElementById('the-canvas');var context = canvas.getContext('2d');// 设置 canvas 的尺寸与页面 viewport 匹配canvas.height = viewport.height;canvas.width = viewport.width;// 渲染页面到 canvasvar renderContext = {canvasContext: context,viewport: viewport};var renderTask = page.render(renderContext);renderTask.promise.then(function() {console.log('页面渲染完成');});});}, function(reason) {// PDF 加载失败的处理console.error('PDF 加载失败: ' + reason);});};// 读取文件内容为 ArrayBufferfileReader.readAsArrayBuffer(file);
});

这段代码演示了如何加载用户选择的本地 PDF 文件,并将其第一页渲染到页面上指定的 canvas 元素中。你可以根据需要扩展代码,实现多页加载、滚动、缩放等功能。

4. 关于批注功能

当涉及到 PDF 批注时,需要明确一点:PDF.js 的核心功能是渲染和显示 PDF 文档内容,这包括显示 PDF 文件本身已经包含的标准批注类型(如文本标记、高亮、形状等)。

但是,PDF.js (包括 5.x 版本) 本身并不提供创建**、编辑保存新批注的内置交互式工具或 API。**

这意味着:

  • 如果你加载的本地 PDF 文件本身已经包含了批注,PDF.js 在渲染时会尝试将其显示出来。通常情况下,如果批注是标准的 PDF 批注类型,它们会随着页面内容一起被绘制到 Canvas 上,或者作为独立的图层数据提供(需要进一步处理)。
  • 如果你希望实现用户在网页上添加修改删除批注的功能,仅仅依靠 PDF.js 的核心库是不够的。你需要自己实现一套完整的批注交互逻辑和数据管理系统。这通常非常复杂,需要:
    • 监听鼠标事件,识别用户在 Canvas 上的操作。
    • 在 Canvas 上方叠加一个交互层(例如另一个 Canvas 或 SVG)来绘制批注的图形表示。
    • 根据用户操作,创建或修改批注的数据结构。
    • 将这些批注数据保存下来,如果需要保存回 PDF 文件本身,则需要更高级的库(如 PDF-LIB,它可以在浏览器端修改 PDF 文件,但功能有限)或依赖后端服务来处理 PDF 文件的修改。

建议:

如果你的需求是实现功能完善的交互式批注工具,考虑到其复杂性,你可能需要:

  • 深入研究 PDF.js 的底层 API 如何获取批注信息,并结合 Canvas 或 SVG 绘图技术自行实现批注的绘制和交互逻辑。
  • 考虑使用第三方的 JavaScript PDF SDK 或库,这些库通常基于 PDF.js 或其他渲染引擎构建,并提供了开箱即用的批注创建、编辑和保存功能。一些库声称与 PDF.js 兼容,或者提供了更高级的 API 来处理 PDF 文档的结构和批注。

总结

本文详细介绍了如何在中国大陆地区选择合适的 CDN(如 jsDelivr 或 BootCDN),通过 CDN 引入 PDF.js 5.x 版本,并使用 JavaScript 加载用户选择的本地 PDF 文件并将其渲染到网页的 Canvas 元素上。

同时,我们澄清了 PDF.js 在批注功能方面的能力:它能很好地显示 PDF 中已有的批注,但不包含创建和编辑批注的内置工具。如果你需要完整的交互式批注功能,需要进行额外的开发或考虑使用更专业的第三方库。

希望这篇博文对你在使用 PDF.js 构建 Web PDF 应用时有所帮助!

相关文章:

使用 CDN 在国内加载本地 PDF 文件并处理批注:PDF.js 5.x 实战指南

PDF.js 是一个强大的开源 JavaScript 库&#xff0c;用于在 Web 浏览器中渲染 PDF 文件。它由 Mozilla 开发&#xff0c;能够将 PDF 文档绘制到 HTML5 Canvas 或 SVG 上&#xff0c;无需任何本机代码或浏览器插件。对于许多需要在网页中展示 PDF 内容的应用场景来说&#xff0c…...

SpringBoot指定项目层日志记录

1、新建一个Springboot项目&#xff0c;添加Lombok依赖&#xff08;注意&#xff1a;这里使用的Lombok下的Slf4j快速日志记录方式&#xff09; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependenc…...

使用Mathematica内置函数绘制Sierpinski地毯

除了SierpinskiCurve之外&#xff0c;Mathematica还内置了SierpinskiMesh这个函数&#xff0c;用来绘制地毯。 SierpinskiMesh[n] gives a mesh region representing the n-step Sierpiński triangle. SierpinskiMesh[n,d] gives the n-step Sierpiński sponge in dimension…...

CMake笔记(简易教程)

CMake笔记 概述&#xff08;需要提前了解的知识&#xff09; 一个c/c程序从代码到生成二进制文件&#xff0c;需要经历的几个关键步骤&#xff1a;预编译&#xff08;预处理&#xff09;、编译、汇编、连接 【编译链接的几个步骤】 编译器&#xff1a;目前市面常见的编译器有…...

现代健康养生新范式:多维度守护身心活力

在快节奏的现代生活中&#xff0c;健康养生是维持高品质生活的关键。从环境调节到生活习惯养成&#xff0c;多个维度的协同发力&#xff0c;才能为健康注入持久动力。​ 良好的生活环境是健康的基础。室内空气流通至关重要&#xff0c;每天开窗通风 2-3 次&#xff0c;每次 30…...

推测式思维树:让大模型快速完成复杂推理

论文标题 Accelerating Large Language Model Reasoning via Speculative Search 论文地址 https://www.arxiv.org/pdf/2505.02865 作者背景 中科大&#xff0c;华为诺亚方舟实验室&#xff0c;天津大学 ICML 2025接收 动机 之前介绍过多篇投机解码&#xff08;推测式解…...

软考错题(三)

telnet协议是一种基于TCP的远程登录协议 占用辅助空间最多的是归并排序 直接插入&#xff0c;堆排&#xff0c;简单选择&#xff0c;冒泡的空间复杂度是O(1) 快排是O(logn) 归并是O(n) B树的叶子节点通过指针链接为有序表&#xff0c;不是b-树 python中切片语法[start,end,s…...

注解的定义

一、理论说明 1. 注解的定义 Java 注解是从 JDK 5.0 开始引入的一种元数据机制&#xff0c;它可以为代码添加额外的信息&#xff0c;这些信息不影响程序的运行逻辑&#xff0c;但可以在编译期、类加载期或运行期被读取和处理。注解本质上是一种特殊的接口&#xff0c;所有注解…...

企业微信自建消息推送应用

企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求&#xff0c;所以配置一个应用专门用来推送消息。实现过程大致为&#xff1a;服务器生成每天的报告&#xff0c;通过调用API来发送消息。以前一直都是发邮件&#xff0c;整个邮箱里全是报告文件&#xff0c…...

swagger3融入springboot

标签&#xff1a; 放controller上面 Api(description "xxx") 放方法上面 Operation(summary "xxx") 引入&#xff1a; 我用的是swagger3.X 需要在yml配置文件中加上&#xff1a; spring:mvc:pathmatch:matching-strategy: ant_path_matcher 然后生…...

CH32V208GBU6沁恒绑定配对获取静态地址

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

[计算机科学#11]:编程语言简史,从二进制到简约表达的华丽转身,造就原因——“懒”

【核知坊】&#xff1a;释放青春想象&#xff0c;码动全新视野。 我们希望使用精简的信息传达知识的骨架&#xff0c;启发创造者开启创造之路&#xff01;&#xff01;&#xff01; 内容摘要&#xff1a; 由于早期的编程需要直接操作硬件&#xff0c;例如使…...

Kubernetes HPA 深度解析:生产环境自动扩缩容实战指南

一、HPA 核心原理剖析 1. 运作机制三步曲 (图示&#xff1a;指标采集 → 决策计算 → 执行扩缩容的完整闭环) 指标采集层&#xff1a;通过 Metrics Server/Prometheus 等组件实时收集 CPU、内存或自定义指标决策计算层&#xff1a;根据当前指标值与目标阈值的比例计算所需副本…...

Matlab 四分之一车体被动和模糊控制对比

1、内容简介 Matlab215-四分之一车体被动和模糊控制对比 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

pm2如何执行脚本批量启动多个服务

在 PM2 中批量启动多个服务&#xff0c;可以通过以下几种高效方式实现&#xff0c;具体操作如下&#xff1a; 方法1&#xff1a;使用 ecosystem.config.js 配置文件&#xff08;推荐&#xff09; 步骤1&#xff1a;生成配置文件 在项目根目录运行以下命令&#xff0c;生成模板…...

Debian系统详解

以下是关于 Debian 操作系统 的超详细深度解析&#xff0c;涵盖历史、架构、功能特性、管理细节及应用场景等方面&#xff0c;帮助你全面掌握这一经典 Linux 发行版&#xff1a; 一、Debian 概述&#xff1a;开源社区的基石 1. 历史与定位 • 诞生&#xff1a;1993 年由 Ian…...

Dify X 奇墨科技,让AI大模型从“巨头专属”变为“触手可及”

AI大模型和AI Agent蓬勃发展&#xff0c;企业比拼的已不仅是AI技术储备&#xff0c;更是AI应用落地的实战能力。奇墨科技正式成为 AI 应用开发平台Dify中国大陆区企业版合作伙伴&#xff0c;帮助企业更便捷地接触到Dify并使用其开发AI应用。 Dify 是一款简单易用的 LLM 应用开…...

CSS相对定位与绝对定位

在网页设计里&#xff0c;相对定位&#xff08;Relative Positioning&#xff09;和绝对定位&#xff08;Absolute Positioning&#xff09;是 CSS&#xff08;层叠样式表&#xff09;里控制元素位置的关键手段。下面为你详细讲解它们的概念、特点与应用场景。 相对定位 概念…...

正则表达式(Regular Expression)详解

正则表达式&#xff08;简称"regex"或"regexp"&#xff09;是一种强大的文本模式匹配工具&#xff0c;它使用特定语法来描述、匹配和操作字符串。 基本概念 正则表达式是由普通字符&#xff08;如字母a到z&#xff09;和特殊字符&#xff08;称为"元…...

OpenCV-Python (官方)中文教程(部分一)_Day22

22.3 2D直方图 在前面的部分我们介绍了如何绘制一维直方图,之所以称为一维,是因为我们只考虑了图像的一个特征&#xff1a;灰度值。但是在 2D 直方图中我们就要考虑 两个图像特征。对于彩色图像的直方图通常情况下我们需要考虑每个的颜色&#xff08;Hue&#xff09;和饱和度&…...

【软考-高级】【信息系统项目管理师】【论文基础】采购管理过程输入输出及工具技术的使用方法

采购管理概念 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。项目采购管理包括编制和管理协议所需的管理和控制过程&#xff0c;例如合同、订购单、协议备忘录&#xff08;MOA&#xff09;和服务水平协议&#xff08;SLA&#xff09;。 采购管理…...

基于STM32、HAL库的CP2102-GMR USB转UART收发器 驱动程序设计

一、简介: CP2102-GMR是Silicon Labs公司生产的一款USB转UART桥接芯片,主要特点包括: 集成USB 2.0全速功能控制器 内置USB收发器,无需外部电阻 工作电压:3.0V至3.6V 支持的数据格式:数据位8,停止位1,无校验 最高支持1Mbps的波特率 内置512字节接收缓冲区和512字节发送…...

信息系统项目管理工程师备考计算类真题讲解十四

一、最小生成树问题 此问题采用破圈法来解决&#xff0c; 1&#xff09;以1节点为例&#xff0c;找到路径最小 点&#xff1a;1--5&#xff1a;距离为3 2&#xff09;找1--5最短的节点&#xff0c;选择4&#xff1a;1--5--4&#xff1a;距离为&#xff1a;5 3&#xff09;找…...

二叉树的基本操作

二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。二叉树通常以结构体的形式定义,如下,结构体内容包括三部分:本节点所存储…...

网络基础入门第6-7集(抓包技术)

前言&#xff1a; 来自小迪安全v2023 内容&#xff1a; 第六集&#xff1a; 大致内容&#xff1a;burpsuit、茶杯、fiddler的抓包流程 1、安装抓包软件的相关证书 2、各大抓包软件的测试 注意用burp抓模拟器的数据包&#xff0c;需要将ip地址设置为本地的ip地址&#xff…...

自定义Widget开发:自定义布局实现

自定义Widget开发&#xff1a;自定义布局实现 一、Flutter布局系统基础 1. 布局约束&#xff08;Constraints&#xff09; 在Flutter中&#xff0c;布局系统基于约束&#xff08;Constraints&#xff09;的概念。每个widget都会接收来自其父widget的约束&#xff0c;并根据这…...

MyBatis(进阶)(xml标签)

本节⽬标 1. 学习MyBatis的动态SQL查询 2. 掌握MyBatis在项⽬中的应⽤, 可以使⽤Spring MVC完成⼀些基础的功能 1. 动态SQL&#xff08;XML&#xff09; 动态 SQL 是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接 可以参考官⽅⽂档&#xff1a; M…...

英皇娱乐X乐华娱乐携手造星!“英皇乐华青少年艺人培训班”正式启动!

2025年5月8日&#xff0c;英皇娱乐集团与乐华娱乐集团联合宣布&#xff0c;双方将在北京市燕京实验中学合作开设“英皇乐华青少年艺人培训班”&#xff0c;为8至18岁的青少年提供专业的演艺及才艺学习平台。此次合作旨在集合两大娱乐公司在演艺行业的资源与优势&#xff0c;共同…...

Linux云计算训练营笔记day04(Rocky Linux中的命令)

mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件&#xff0c;没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录&#xff0c;没有改名 mv /opt/gongli tedu 移动目录&#xff0c;改名了 …...

枚举 · 例13-【模板】双指针

登录—专业IT笔试面试备考平台_牛客网 代码区&#xff1a; #include<algorithm> #include<iostream> #include<vector> #include<unordered_set> using namespace std;struct INTER{int left,right; }; bool compare(const INTER&a,const INTER&a…...

Linux网络编程day7 线程池and UDP

线程池 typedef struct{void*(*function)(void*); //函数指针&#xff0c;回调函数void*arg; //上面函数的参数 }threadpool_task_t; //各子线程任务的结构体/*描述线程池相关信息*/struct threadpool_t{pthread_mutex_t lock; …...

WHAT - ahooks vs swr 请求

文章目录 ahooks特点常用 Hooks 示例1. useRequest — 封装网络请求逻辑&#xff08;比 SWR / React Query 更轻量&#xff09;2. useDebounce — 防抖值3. useLocalStorageState — 本地存储的状态4. useBoolean — 快速管理布尔状态5. useEventListener — 添加事件监听 ahoo…...

算法训练营第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

150. 逆波兰表达式求值 题目 思路与解法 第一思路&#xff1a; 比较简单 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …...

可视化图解算法35:在二叉树中找到两个节点的最近公共祖先(二叉树的最近公共祖先)

1. 题目 描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2&#xff0c;请找到 o1 和 o2 的最近公共祖先节点。 数据范围&#xff1a;树上节点数满足 1≤n≤105 , 节点值val满足区间 [0,n) 要求&#xff1a;时间复杂度 O(n) 注&#xff1a;本题保…...

如果说开启的TIM3定时器有ccr1,ccr2,ccr3,我想要关闭ccr2的PWM输出,怎么通过代码实现

目录 作用概述&#xff1a; 具体原理&#xff1a; 代码的操作细节&#xff1a; 实际效果&#xff1a; 示意全文&#xff1a; 小结&#xff1a; TIM3->CCER & ~TIM_CCER_CC2E; 作用概述&#xff1a; 作用是禁用 TIM3 的通道 2&#xff08;CCR2&#xff09;的捕获…...

高能数造全固态电池干法电极高品质原纤化技术:驱动干法和全固态电池制造新进程

技术背景 传统湿法电极制备工艺的局限:传统的湿法电极制备工艺需要使用大量的溶剂来溶解粘结剂和分散活性物质&#xff0c;后续还需要复杂的干燥工序来去除溶剂。这不仅增加了生产成本和能源消耗&#xff0c;溶剂的使用和处理还会带来环境污染和安全隐患。 新能源产业发展的需…...

AI驱动的制造工艺:系统化探索与创新

DeepSeek 技术全景 在当今 AI 技术蓬勃发展的时代,DeepSeek 已成为该领域中一颗耀眼的明星。自 2023 年 7 月 17 日成立以来,这家由知名私募巨头幻方量化孕育而生的公司,迅速在 AI 领域崭露头角 。DeepSeek 的目标是开发顶尖的大语言模型(LLM),并利用数据蒸馏技术打造更精…...

Mac 平台获取地区标识符号

以下是添加了详细中文注释的代码版本&#xff0c;解释每一行代码的作用&#xff1a; #include <CoreFoundation/CoreFoundation.h> #include <vector> #include <string> #include <iostream>// 将 Core Foundation 的字符串(CFStringRef)转换为标准 …...

PyTorch 实战:从 0 开始搭建 Transformer

导入必要的库 python import math import torch import torch.nn as nn from LabmL_helpers.module import Module from labml_n.utils import clone_module_List from typing import Optional, List from torch.utils.data import DataLoader, TensorDataset from torch imp…...

Java 显式锁与 Condition 的使用详解

Java 显式锁与 Condition 的使用详解 在多线程编程中&#xff0c;线程间的协作与同步是核心问题。Java 提供了多种机制来实现线程同步&#xff0c;除了传统的 synchronized 关键字外&#xff0c;ReentrantLock 和 Condition 是更灵活且功能强大的替代方案。本文将详细介绍显式…...

【MySQL】存储引擎 - CSV详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

LeetCode算法题(Go语言实现)_62

题目 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如 “L” 的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不…...

矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践

矿井设备通信破局&#xff1a;ModbusTCP转DeviceNet网关应用实践 在500米深的金属矿井中&#xff0c;传统人工操控采掘设备存在高风险、低效率问题。某矿业集团引入海希无线遥控器远程控制掘进机&#xff0c;却因通信协议冲突陷入困局&#xff1a;海希遥控器采用DeviceNet协议…...

GrassRoot备份项目

Windows服务项目 Grass.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http.Headers; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Time…...

多级路由器如何避免IP冲突

在多级路由器架构中&#xff0c;避免IP冲突的核心在于合理规划子网、正确配置路由器角色与功能。以下是综合多个搜索结果的解决方案及操作步骤&#xff1a; 一、划分不同子网段 修改LAN口IP地址 主路由器默认LAN口IP为192.168.1.1&#xff0c;次级路由器需更改为不同网段&#…...

VGGNet详解

VGGNet 由牛津大学视觉几何组&#xff08;Visual Geometry Group&#xff09;在2014年提出&#xff0c;凭借极简的 33卷积核堆叠设计 成为经典模型&#xff0c;影响了后续大量网络架构。 1. 网络结构 VGGNet 的核心思想是 通过多层小卷积核&#xff08;33&#xff09;替代大卷…...

TDengine 在新能源行业应用

简介 在当前可再生能源迅速发展的浪潮中&#xff0c;分布式光伏和可再生能源的装机容量已经达到相当可观的规模。尽管新能源的发展得到政策的鼎力扶持&#xff0c;但其并网后对电网的运行调度、供电可靠性以及系统的安全稳定带来诸多新挑战。 分布式光伏&#xff0c;即分布式…...

[人机交互]设计,原型建立和构造

一.建立和构造原型 1.1理解用户需要和技术之间的关系 用户需要和技术之间是一个鸡和蛋的问题 • 用户对产品的理解建立在 与该产品交互 的基础上 • 用户只有在熟悉后&#xff0c;才能 评价 是否需要&#xff0c;及 进一步 的需要 • 构造最终产品需要大量资源 • 原型化 是 …...

C#生成二维码和条形码

C# 实现二维码和条形码生成&#xff1a;从入门到实战 文章目录 C# 实现二维码和条形码生成&#xff1a;从入门到实战一、引言二、准备工作2.1 开发环境搭建2.2 引入相关库 三、生成条形码3.1 条形码基本概念3.2 使用[ZXing.Net](https://ZXing.Net)生成条形码3.2.1 核心代码实现…...

2025.5.8总结(中期审视)

今日记录&#xff1a; 晚上&#xff0c;主管找我聊了关于中期绩效审视的问题。 首先就是让我汇报上半年的工作进展&#xff0c;汇报完后&#xff0c;感觉体现不出自己的工作量&#xff0c;这确实考验个人的汇报能力。 汇报完工作后&#xff0c;主管开始给我提了一些建设性的…...