onlyoffice表格字体渲染实现思路

Docker部署OnlyOffice中文字体配置全指南 中文字体缺失是Linux容器化办公服务的典型兼容性问题,其本质源于字体管理机制(fontconfig索引)、用户权限模型(UID/GID映射)与服务级缓存(core-fonts路径)三者的协同失效。Noto Sans CJK SC和WenQuanYi Zen Hei作为合规开源字体,凭借SIL授权与GB2312/GBK/UTF-8三级编码支持,成为OnlyOffice文档服务器中文字体适配的事实标准。该方案不仅解决PDF导出乱码、Word样式丢失等表层问题,更构建了挂载持久化、缓存自动化、权限零冲突的工程化 阅读详情

前言

字体渲染是浏览器自带的基本能力,不管是基于HTML还是Canvas渲染技术;针对大型Excel表格,onlyoffice内部使用Canvas技术来渲染表格内容;现代浏览器实现Canvas内字体设置和渲染的方案有成熟的API直接使用,代码简写如下:

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.font = '微软雅黑';
ctx.fillText('中', 0, 0) 

这种方案能满足大部分场景需求,不过不同浏览器在字体解析和渲染实现存在差异,这会出现一致性问题:同样的字符,在不同操作系统、不同浏览器展示效果可能不一致,知乎上也有类似问题提到一致性现象;所以如果编辑器产品方案要考虑浏览器兼容性和渲染一致性问题时,那么编辑器内部就要接管字体的解析和渲染工作。本文介绍onlyoffice解决这个问题的一种思路,希望能抛砖引玉。限于本文水平有限,有不准确的地方欢迎指正或者讨论。

实现细节

onlyoffice整体方案类似浏览器底层文本渲染引擎的实现思路,浏览器内部展示文本的整体流程包括三个步骤:

  • 查找字体:根据CSS font-face语法指定一系列字体列表,查找时按照顺序遍历列表,找到第一个符合条件(比如本地是否有该字体的TTF文件)的字体
  • 加载字体:加载符合条件的本地字体文件
  • 渲染字体:这个步骤浏览器调用OS提供的文本排版引擎,然后调用浏览器的渲染引擎(一般是CG图形接口)直接绘制,不同OS实现了不同文本排版引擎,比如IOS提供CoreText,Window7后提供DirectWrite引擎,每种排版引擎都是各自自研的。

读到这里了解到字符展示的全流程,但是网页包括很多字符,这些是通过HTML标签和CSS来组织结构,最终通过浏览器布局引擎决定文本位置,而布局引擎内部涉及到文本排版相关也是调用了OS提供的文本排版API实现。

Onlyoffice内部基本上模拟了这个流程,不过每个步骤的实现方案和浏览器原生实现不一样,整体流程如下:

下面分步骤说明具体实现思路,其中每个逻辑内部依赖freetype库,它是一个完全免费、高质量的且可移植的字体函数库,提供统一的接口来操作(比如读取、绘制字体位图信息等)多种字体格式文件;以下内容每个部分都和该库有关,下面文字渲染部分也会简单说明该库的内部原理

字体查找

在表格编辑器中,查找字体的目标是根据给定字体名字,找到最适合展示该字体的ttf文件。比如用户在工具栏-字体选择列表选中名字Aria,希望找到对应的Aria.ttf文件。

看到这里容易有这样的误解:列表项名字和对应ttf文件是一对一关系;事实上并不完全是这样,在解释之前先穿插说明下工具栏-字体选择列表中每项含义:每项代表一个字体集(font family)。一个字体集列包含一组密切相关的字体,它们差别在样式、亮度等差异,样式包括是否bold、是否斜体;例如,Aria是一个字体集,它包含如下ttf文件:

Aria.ttf (Roman常规样式的ttf文件)
Aria-Bold.ttf (样式为加粗的ttf文件)
Aria-Italic.ttf (样式为斜体的ttf文件)
Arial_Bold_Italic.ttf(样式为斜体加粗的ttf文件) 

所以需要根据选中的字体集,加载对应所有字体文件;这就需要提前建立字体集和字体文件的映射关系,这部分逻辑在服务端启动时通过运行脚本程序生成,生成逻辑如下:

  • 遍历机器中事先指定的字体文件所在目录(一般是/user/share/fonts),获取所有字体文件列表(假设结果是fileFontList)
  • 遍历_fileFontList_每个字体文件,建立以下信息* 建立字体路径(wsFontPath)和索引下标的映射关系mapFontFiles,因为wsFontPath值是唯一的,索引下标的意义是通过数值索引给字体文件重命名* 根据freetype库读取字体文件内部的元信息,保存在字体文件信息列表里* 建立字体集内部对象fontMap:以字体集名字作为key,value是字体集内部元信息,其结构如下;其中Index*对应字体文件的索引号,以属性IndexI为例,其值设置依据:判断当前bItalic是否为真,bBold是否为假,是就根据wsFontPath,从mapFontFiles获取索引号,作为IndexI的值
  • 根据fontMap,按照字体集名字以字典序进行排序,得到字体集列表uiFontList,这个信息最终决定了用户在前端工具栏看到的字体下拉选择列表内容。
// 字体集内部结构
interface CFontInfo {...IndexI number //IndexB numberIndexBI numberIndexR number // Name string // 字体集名字
} 

最终字体集和字体文件的关联图如下,这些信息最终写到JS文件,前端在页面初始化时加载和执行该JS文件,将信息反序列化为页面内部数据结构。

字体加载

字体加载前后主要考虑两个问题:

1、怎么决定首次请求加载哪些字体?

先解释下为何要考虑这点,难道不能事先把工具栏里涉及到的所有字体列都下载下来?从用户体验角度看,这个方案是不可行,因为字体列表数量多(默认字体集列表里有一百多个列表项),而且有些字体比较大,比如微软雅黑对应TTF格式文件的大小超过20M,所以如果一开始全部加载,会造成用户首次打开时速度慢,页面内存占用大的问题。所以为了减少不必要的字体加载,加快首页打开速度,需要根据一定策略决定要请求加载目标字体名。

这个策略有两种类型:

  • 静态:比如业务只考虑中文环境,中文默认使用黑体展示,英文使用Times系列,那么事先就默认指定请求这两种字体即可。国内的石墨表格就是这么做
  • 动态:这个类型一开始不知道是哪种业务环境,可能是中文、英文、日文、韩文、阿拉伯文等情况,所以需要有个启发式分析过程,找到后再去加载字体。像onlyoffice表格编辑器就使用该策略。

当然如果单元格内已经指定了固定字体名字,那么首次加载就必须包含这些字体了。现在考虑动态策略里的启发式分析过程,核心拆解成两个步骤

  • 找到目标文字 :就是查找表格内部使用到哪些语言的文字,比如用户将本地语言设置为中文,那么菜单、日期等格式化文案就显示为中文,这些内部配置的格式化文案可以看作“目标文本”。目前编辑器内部默认使用本地语言配置、文件名作为策略,然后遍历目标文本(比如格式化文案、文件名包含的所有文字),每个文字作为下一步的输入
  • 根据文字找到匹配的字体:简单来说这一步就是给定文字的unicode值,查询索引区间表,判断unicode落在哪个区间,这个区间内的值就是字体索引文件名。这里解释下什么是索引区间表, 如下图:

这个区间表是服务端生成后返回给前端:内部遍历所有unicode字符范围(大概100w个),计算每个unicode值对应最佳展示字体,用文件名索引值表示计算结果;考虑到存储所有字符的效率低,以及观察到某段unicode范围内对应相同的计算结果,所以通过区间表这个数据结构表示结果就比较高效。

根据上图可知区间表下标是有序的,所以给定某个unicode值,查找时就可以用折半算法来快速找到所在区间。该区间的值就是要找到的文件名索引。

索引区间表还有个很重要作用是当字体文件内部不支持展示某个文字时的默认回退策略。怎么理解?举个例子:默认情况下编辑器单元格内设置了Calibri字体作为默认字体,假设要显示“中”,根据字体匹配流程,Calibri字体集匹配到的字体文件名是Carlito.TTF(实际是一个索引名,比如063.TTF这样),但是该字体文件支持的字形列表不包含中文,此时就根据“中”对应的unicode码点,到索引区间表查询最佳的字体,假设结果是黑体,所以在设置Calibri字体集下,最终“中”这个文字以“黑体”效果展示。

2、找到指定字体文件后,怎么加载字体?

这个逻辑比较简单,基本上通过AJAX技术动态加载字体,关于动态加载的代码实现,主要是维护内部的请求状态,这块感兴趣的可以自己尝试实现。

字体渲染

前面描述了字体元信息含义,提到字体依赖该信息查询到对应ttf格式文件。字体渲染就是按照指定TTF格式,渲染某个文字。这个内部实现也是依赖FreeType字体引擎,也就是说FreeType是实现字体跨平台一致性效果的核心实现,目前编辑器实现跨平台文字渲染用到它。所以在详细说明字体渲染之前先了解FreeType引擎内部原理;

FreeType引擎提供的API核心能力是将字形关键点按照规则连线变成指定设备下的字符轮廓,最后再将轮廓填充成Bitmap位图显示在光栅设备上。内部主要涉及四个步骤:

  1. 假设已经给定了字体文件,以及要渲染指定大小的文字‘A’,根据JS提供的charCodeAt 方法得到对应的UTF-16编码值。然后把这些信息作为FreeType API的输入

2.字体文件查找字形:这涉及到字体文件内部格式的理解,以TTF格式为例,可以简单理解该文件内存储每个字符编码和对应字形的映射关系,每个字形存储了轮廓信息,每个轮廓实际上就是一系列坐标点,几何意义上表示直线或者贝塞尔曲线。或者把轮廓想象成汉字的笔画就行,每个笔画用直线或者贝塞尔曲线表示,所有笔画组成字形的轮廓。3.初始化字体大小和位置,位置根据字体是否加粗、斜体、描边、阴影等效果来决定。这一步目的是将轮廓缩放成需要的尺寸。4.转换位图:FreeType根据字形轮廓和给定字体信息,填充为位图。也可以简单理解成把轮廓内部的坐标点填充在屏幕就行了上述流程实现的源码在这里。目前FreeType引擎和上述流程的实现使用C语言开发,所以为了让它在页面执行,WebAssembly技术登场了。编辑器前端使用Emscripten将C语言代码编译到 WebAssembly,生成wasm格式的文件,然后页面首次打开时加载该文件。具体build逻辑见这里。

所以使用freeType引擎渲染文字得到的位图信息,就可以在Canvas上展示了。至此从编辑器角度,一个字符的核心渲染思路就比较清晰了。现在站在使用者角度,梳理下设置单元格字体到最终字体展示的逻辑:

  • 查询要渲染字符对应的unicode码点
  • 调用freeType库暴露的API,传入码点和具体ttf文件,得到对应字形的bitmap位图信息
  • 通过Canvas的drawImage方法绘制字形,在指定光栅设备(例如显示器)渲染bitmap位图信息展示文字

总结

本文介绍onlyoffice表格编辑器内部文字渲染的基本流程,为了效果一致性考虑,它并没有直接调用浏览器内部提供的fillText这样API,而是基于FreeType字体库重新实现了一套全生命周期的渲染逻辑,包括字体查找、加载和渲染的流程;通过前后端协同,服务端事先准备字体的元信息、字体集列表、字体索引区间表信息并返回给前端页面,然后页面内部根据指定的文字和设置的字体集,查找对应的字体文件,通过FreeType库渲染得到该文字对应的位图信息,最终绘制该位图到Canvas画布上以展示文字

当然这套逻辑比较定制化,这部分源码不那么清晰易懂,而且FreeType渲染引擎和操作系统自带的文字渲染引擎差异可能会出现同样的文字渲染出细微差异,这给用户体验上也带来困扰,所以上述技术实现思路在大部分业务场景是使用不到的。但不妨作为一次学习机会了解文字渲染底层思路,以及wasm技术的应用,也能帮助理解基于Canvas技术内部的文字渲染原理

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

onlyoffice第一次打开特别慢的问题优化 阅读详情

相关推荐

如何将字体添加到 ONLYOFFICE 桌面编辑器8.0

阅读本文,了解如何在 ONLYOFFICE 编辑器桌面版上添加新的字体

ONLYOFFICE的官方博客 2847

onlyoffice-test

Create React App入门 该项目是通过引导的。 可用脚本 在项目目录中,可以运行: npm start 在开发模式下运行应用程序。打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。您还将在控制台中看到任何棉绒错误。 npm test 在交互式监视模式下启动测试运行器。有关更多信息,请参见关于的部分。 npm run build 构建生产到应用程序build文件夹。它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 生成被最小化,并且文件名包括哈希值。您的应用已准备好进行部署! 有关更多信息,请参见关于的部分。 npm run eject 注意:这是单向操作。 eject ,您将无法返回! 如果您对构建工具和配置选择不满意,则可以随时eject 。此命令将从项目中删除单个构建依赖项。 相反,它将所有配置文件和传递依赖项(webpack,Babel,ESLin

Vue中实现Word文档渲染、在线编辑与保存的完整方案

在Web办公场景中,Word文档的在线预览与编辑始终是高频刚需。前端处理docx文件的核心原理,是通过解析Word的XML结构,将其转换为浏览器可渲染的HTML或接入独立文档服务。技术选型上,docx-preview适合轻量只读预览,OnlyOffice则提供接近原生体验的在线编辑能力。无论是OA审批、合同管理还是知识库,都需要在Vue项目中打通从文件流获取、文档渲染、用户编辑到服务端保存的完整链路。文章结合实战经验,详细拆解了基于docx-preview的预览实现、OnlyOffice的集成方式与异步回调

weixin_34060741的博客 219

Onlyoffice字体修改完整流程

若与前端项目可进行联调测试,需要清除浏览器的缓存,清了缓存就不会有旧字体了,新字体也会生效;近期通过度娘搜索了onlyoffice字体修改方法,其他作者的修改方法都不是我想要的,今天给大家带来我自己汇总的方法。2.接着,进入容器内的字体文件夹,将系统字体和onlyoffice自带的字体全部删除。3.退出容器,将你要新增的字体(可以是文件夹)复制到容器内的系统字体文件夹下。4.再次进入容器,进入指定文件夹下执行下方命令,使新增的字体生效。到此就完成了新增字体并删除旧字体的所有操作。若不需要删除可忽略此步。

尽我所能,分享开发问题的解决方式 5029

ONLYOFFICE文档服务器深度解析:从在线协同到私有化部署实战

在线文档协同编辑已成为现代团队协作的基石,其核心原理在于通过实时操作转换技术,实现多用户对同一文档的无缝协作。这项技术不仅提升了团队效率,更在远程办公、教育、软件开发等领域展现出巨大价值。随着企业对数据安全和格式保真度的要求日益提高,能够深度兼容微软Office格式、支持私有化部署的解决方案成为刚需。本文聚焦于ONLYOFFICE文档编辑器,深入剖析其文档服务器与前端分离的架构设计,详解如何解决格式兼容性、字体嵌入、JWT安全配置等工程实践中的关键问题,并涵盖从Docker快速部署到生产环境调优的完整指南,

weixin_30321709的博客 513

在线文档选型指南:Univer、JSpreadsheet与OnlyOffice对比与实践

在线表格与协同编辑已成为业务系统的基础能力,但如何选择合适的底层技术方案却让很多团队纠结。前端表格组件、文档服务器、多人协作、Spring Boot集成等概念,本质上都围绕着“如何在浏览器中还原桌面级办公体验”这一核心诉求展开。纯前端SDK侧重渲染与交互,通过Canvas或DOM提供类Excel操作界面;而完整的文档服务则需要独立部署、具备格式解析与协同存储能力。前者接入轻、定制灵活,适合内嵌数据录入与展示场景;后者功能完整、协作成熟,适合企业级文档平台。面对Univer、JSpreadsheet和Only

weixin_29233333的博客 146

OnlyOffice添加中文字体和修改字号

一、复制c:\windows\fonts字体,使用FontCreator制作字体点击File->Open打开字体文件(ttf格式,如果是ttc程序会转一下),点击Font->Properties,修改FontFamily为字体名称,点击ok点击File->Export Font as->Export Desktop Font(ttf/otf),保存字体文件为ttf格式没转的字体文件改为大写TTF后缀。sudo docker cp /usr/share/fonts 替换为容器id:/usr/share。

weixin_44048054的博客 4816

Docker部署OnlyOffice添加中文字体解决乱码完整指南

容器化部署已成为现代应用交付的主流方式,而字体渲染是其中常被忽视的一环。Linux环境下,应用通过fontconfig机制管理字体查找与匹配,容器与宿主机文件系统隔离导致内部缺字。Docker部署的OnlyOffice在编辑中文文档或导出PDF时,若容器内缺少中文字体,就会出现方块或乱码。理解这一原理后,可通过docker cp、目录挂载或自定义镜像等方式注入中文字体,并执行fc-cache刷新缓存。本文结合工程实践,详解容器内字体管理、OnlyOffice中文字体添加及乱码排查技巧,帮助开发者在Linux

weixin_32576389的博客 220

ONLYOFFICE自托管部署实战:用Docker换掉按席位订阅的协作办公

企业文档协作的日常运转,离不开在线编辑与多人协同的高效支撑。传统按席位订阅的SaaS办公套件在团队扩大后,License费用持续膨胀,数据还被托管在服务商机房,令许多中小型组织陷入成本与安全的两难。开源办公套件的自托管部署,将文档服务、权限控制和数据存储全部收归企业内部,既保留多人实时协同的体验,又实现数据主权可控。借助Docker Compose可快速搭建环境,配合JWT鉴权、WebSocket反代与中文字体配置,即可稳定支撑日常文档流转。无论是替换老牌Office还是嵌入Nextcloud/OA系统,这

weixin_33552698的博客 278

ONLYOFFICE原生支持WPS格式:打通办公协作的格式壁垒

文档格式兼容性是构建高效数字工作流的基础技术挑战,其核心在于不同办公软件(如Microsoft Office、WPS Office)采用各自独立的文件格式规范。这导致了跨平台文档交换时常见的格式错乱、内容丢失等问题,严重阻碍了团队协作与信息流通。从技术原理看,实现高保真格式兼容需要文档处理引擎具备强大的解析与双向转换能力,将外部格式精准映射到统一的内部文档模型。ONLYOFFICE此次更新,原生支持.wps、.et、.dps系列格式,正是其文档核心引擎在格式处理能力上的重要突破。这一技术升级的工程价值在于,

weixin_30325487的博客 370

ONLYOFFICE文档编辑器:从格式兼容到高效协作的深度使用指南

文档格式兼容与实时协同编辑是现代办公协作的核心需求。其原理在于通过支持开放的Office Open XML标准(如.docx),确保文件在不同平台和工具间流转时格式稳定。这项技术的价值在于打破了私有格式的壁垒,为团队提供了统一、可预测的文档处理基础。在实际应用场景中,无论是本地编辑还是云端协作,都能保障功能与体验的一致性,从而支撑起复杂的混合办公流程。本文聚焦于ONLYOFFICE这一深度对标传统桌面套件、原生为云端协作设计的工具,将详细解析其以DOCX为“通用语”的格式兼容逻辑与无缝融合客户端与协作端的架

weixin_28523493的博客 272

从OnlyOffice迁移到LibreOffice Online:在线文档编辑方案选型与实战

在线文档编辑的核心在于渲染引擎与进程模型,前者决定格式兼容性,后者影响并发能力与资源开销。LibreOffice Online复用桌面版渲染引擎,通过WebSocket实现服务端文档处理,在内存占用和并发稳定性上表现更优。对于Java后端与Vue前端项目,集成时需关注文档获取与保存接口、URL编码及iframe通信。该方案适合对资源效率和长期维护性有要求的教育、企业协作等场景,本文记录了从OnlyOffice迁移的完整实践与踩坑经验。

weixin_34284188的博客 357

LibreOffice与ONLYOFFICE实测:开源Office选型与在线协作部署指南

开源办公套件在企业文档协作中扮演关键角色,但桌面编辑与在线协同的技术路径截然不同。LibreOffice作为传统桌面套件,擅长离线处理和格式转换,但通过命令行实现服务化需自行封装;ONLYOFFICE则以Docker容器化部署原生支持实时协作、命令服务和回调机制,适合与业务系统集成。理解文档服务器的端口映射、JWT鉴权、强制保存与回调地址的配合,是避免“组件打开失败”等问题的核心。本文基于真实测试,对比两者在字体依赖、API扩展、保存链路等场景的差异,为团队选型与部署提供参考。

weixin_33805743的博客 423

Linux部署OnlyOffice Docs:解决中文字体与生产环境调优全攻略

在线文档协作是现代企业提升效率的核心技术,其原理在于通过Web技术实现文档的实时协同编辑与云端渲染。这项技术的价值在于打破了办公软件的地域与设备限制,为团队协作提供了统一平台。在私有化部署场景中,开源方案OnlyOffice Docs因其对Office格式的深度兼容性而备受关注。然而,在Linux服务器上部署时,中文字体缺失导致的乱码问题以及生产环境下的性能与安全配置,是决定其能否真正投入使用的关键挑战。本文聚焦于OnlyOffice Docs的部署实践,详细解析了从依赖冲突排查、中文字体安装与缓存重建,到

weixin_32306957的博客 214

Fedora 43 ARM设备安装ONLYOFFICE:Flatpak与RPM实战指南

在Linux生态中,软件安装方式直接影响使用体验,尤其对于ARM架构的设备,包管理器的兼容性常成为痛点。Fedora 43 aarch64平台下,安装办公套件需要认清系统架构与软件源差异。ONLYOFFICE桌面编辑器作为兼容微软Office格式的免费方案,在ARM设备上提供Flatpak与RPM两条安装路径。Flatpak通过沙箱隔离依赖,简化部署;RPM包则需手动处理依赖与环境变量。无论选择哪种方式,合理的配置输入法与渲染优化,都能让文档编辑流程更加稳定高效。本文结合实际部署经验,为ARM Linux用

weixin_33226548的博客 296

ONLYOFFICE 8.2深度评测:自部署协作与中文排版避坑指南

办公套件选型涉及文档编辑、协作平台与自部署架构。ONLYOFFICE 8.2以Document Server为核心,通过WebSocket实现实时协同编辑,支持私有化部署与细粒度权限管理,技术价值在于数据自主可控和团队协作效率提升。典型应用场景包括团队知识库、开发文档管理和敏感数据协作。然而,中文排版引擎差异导致行距异常、标点挤压等问题,需手动调整固定行距和字体回退。本文基于一周实测,对比WPS,拆解ONLYOFFICE 8.2的协作优势与中文排版短板,提供部署配置与避坑实操建议。

weixin_33960567的博客 151

ONLYOFFICE 原生支持 WPS 格式:打通私有化部署与在线协作的关键一步

在文档协作与办公自动化领域,文件格式兼容性是保障工作流顺畅的核心基础。其原理在于,不同的办公软件使用各自专有的文件格式存储数据,若协作平台无法原生解析这些格式,就需要进行有损的格式转换,导致排版错乱、内容丢失等问题。这一问题的技术价值在于,原生格式支持能实现文档从创作、流转到协作、归档的无损衔接,保护了文档资产的完整性与一致性。在私有化部署、混合办公软件环境以及信创国产化等应用场景中,格式兼容性直接决定了整个文档管理体系的效率与体验。本文聚焦于ONLYOFFICE Docs最新版本对WPS Office原生

weixin_33847182的博客 444

开源Office实测:LibreOffice与ONLYOFFICE选型与集成对比

随着企业推进软件正版化和数据私有化部署,开源Office逐渐成为替换商业办公套件的重要选项。办公软件的核心能力不再只是本地编辑文档,而是如何将文档处理能力嵌入业务系统,实现在线预览、多人协作与格式转换。LibreOffice作为经典桌面套件,在单机文档处理和Word转PDF等场景中依然可靠;而ONLYOFFICE则凭借服务端架构和文档服务API,更适合团队协同与系统集成。两者在安装部署、文档兼容性、二次开发方面差异显著。从实际办公场景出发,梳理两者的技术原理、典型应用边界以及服务端集成方案,并结合JODCo

weixin_34265814的博客 313
上一篇: Node.js 基于区块链的游戏应用的首选
下一篇: Qt编程基础:认识常用的基本类型
梅花十三儿
博客等级 码龄5年 1038粉丝 444原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值