服务端自定义生成PDF的几种方案

告别后端依赖!微信小程序云开发生成PDF的两种实用方案对比(wxml-to-canvas vs. 服务端渲染) 本文深度对比了微信小程序中生成PDF的两种实用方案:纯前端渲染(wxml-to-canvas)与服务端渲染。详细解析了各自的技术实现、性能表现及适用场景,帮助开发者根据项目需求选择最优方案,特别适合需要高效PDF生成功能的微信小程序开发者。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:Java知音

ac54a90557303fae2cff29a6919682eb.jpeg


这个文档太复杂了,还要导出pdf?

废话不多说直接进入正题,首先分析生成pdf场景及生成内容,考虑复用性和维护难度是我们当前开发工作的第一要务!

下面是调研的几个主要方案:

一、itext 表单填充

使用方式:

  • itext表单填充方案是以pdf作为基础模板,通过在pdf中嵌入表单元素组件的方式(需要使用pdf编辑工具),最后由程序进行数据填充并另存为pdf结果。

方案优缺点:

  • 优点:代码优雅,生成后格式变化影响极小。

  • 缺点:原始模板变化需要重新生成pdf,重新编辑表单元素;不支持列表填充数据。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、freemarker + doc4J 基于Word 生成 PDF

使用方式:

  • 首先将调整好格式的原始 word 导出为 XML 格式,编辑 XML 模板中需要填充元素的位置,最后由程序处理先由freemarker模板工具替换元素内容,再使用doc4J进行pdf导出。

方案优缺点:

  • 优点:通用性强,基于模板引擎功能强大。

  • 缺点:XML 格式的word真的有够复杂,想要在此模板上调整样式真的难上加难;由于系统不支持的原因需要导入中文字体库;doc4J 部分 doc 元素不支持(例如直线),导出格式差异较大。

这可能是由于doc4J迭代问题无法保证新元素的支持,导出结果比较奔放。。。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、freemarker + aspose-words 导出PDF

使用方式:

  • 类似于 freemarker+doc4J 方式,同样需要编辑XML,导出格式相较doc4J而言有极大提升。

方案优缺点:

  • 优点:通用性强,基于模板引擎功能强大,无需手工管理字体(macOS),代码简单,导出格式与模板基本无差异。

  • 缺点:需要编辑 XML 模板;该方案不是免费版(当然有大神)。

受限于调试前期需要的修修改改,模板能给人整吐了,所以才有了下一个方案。

四、html + freemarker + itextpdf(html2pdf)

使用方式:

  • 翻译 word 为 html 页面(当然就是手写啦,还原度很重要!),html中模板元素插入(文字填充、列表循环 freemarker 支持的全都能写),最后由程序处理先由freemarker模板工具替换元素内容,再使用html2pdf进行pdf导出。

方案优缺点:

  • 优点:可维护性相较与上面方案都有极大提升(调试可见性,动态替换生效);通用性强,基于模板引擎功能强大;导出格式可控性较强;

  • 缺点:需要中文字体库。

这个方案是综合以上多次踩坑的结果,结果是显而易见的。

浅浅来一点代码,省的大家到处找

<dependencies>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.0.3</version>
</dependency>
<dependency>
<groupId>binarta.oss</groupId>
<artifactId>groovy-template-enginex-freemarker</artifactId>
<version>0.1.3</version>
</dependency>
<dependencies>

个人以为自己的代码会自解释,就不贴太多注释了dff828abc6fe7d1fe55d0b7edee3ae86.jpeg

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
import com.google.common.collect.Lists;
import com.itextpdf.text.pdf.BaseFont;
import freemarker.cache.ByteArrayTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.SneakyThrows;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;

public class HtmlToPdfUtil {

    private static final ByteArrayTemplateLoader TEMPLATE_LOADER = new ByteArrayTemplateLoader();

    // 导入需要字体库的位置哦;simsun 为 宋体
    public static final String FRONT_PATH = "/usr/share/fonts/simsun.ttc";

    /**
     * 看明白的话只用这个方法就够
     */
    public static ByteArrayOutputStream htmlToPdf(String templateName, Supplier<byte[]> loadTemplateSupplier, Map<String, Object> modeViewMap) {

        String html = xmlFormat(templateName, loadTemplateSupplier, modeViewMap);

        return htmlToPdf(html);
    }

    @SneakyThrows
    public static ByteArrayOutputStream htmlToPdf(String htmlStr) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(htmlStr);
        ITextFontResolver resolver = renderer.getFontResolver();
        //添加字体,解决中文不显示的问题
        resolver.addFont(FRONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        renderer.layout();
        renderer.createPDF(outputStream);
        return outputStream;
    }


    public static String xmlFormat(String templateName, Supplier<byte[]> loadTemplateSupplier, Map<String, Object> modeViewMap) {
        if (Objects.isNull(TEMPLATE_LOADER.findTemplateSource(templateName))) {
            synchronized (TEMPLATE_LOADER) {
                if (Objects.isNull(TEMPLATE_LOADER.findTemplateSource(templateName))) {
                    TEMPLATE_LOADER.putTemplate(templateName, loadTemplateSupplier.get());
                }
            }
        }
        return xmlFormat(templateName, modeViewMap);
    }

    @SneakyThrows
    public static String xmlFormat(String templateName, Map<String, Object> modeViewMap) {
        Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        // 指定FreeMarker模板文件的位置
        cfg.setTemplateLoader(TEMPLATE_LOADER);
        // 设置模板的编码格式
        cfg.setEncoding(Locale.CHINA, Charset.defaultCharset().name());
        // 获取模板文件 template
        Template template = cfg.getTemplate(templateName, Charset.defaultCharset().name());
        StringWriter stringWriter = new StringWriter();

        BufferedWriter writer = new BufferedWriter(stringWriter);
        template.process(modeViewMap, writer);
        return stringWriter.toString();
    }

}

结

解决这个问题的核心思路方案其实一直没变,变化的只是工具,一定要思路清晰!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

a32e0ee5eda5ed8969cbac09688c2519.png

已在知识星球更新源码解析如下:

f88b164114b799f809dd8d2e996abccc.jpeg

9eabedfa1cb2bdb243f3a6e9f7bb3588.jpeg

a60af619d40964ffb93d3844616810d7.jpeg

fcc1f565f219475ef42db9b5778717be.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
YOLOv11 模型改进全流程:从代码修改到性能跃升,让你打造专属检测利器 无论是科研中需要发表创新点满满的论文,还是企业里要解决特定场景的检测难题,这套方法都能让你在YOLOv11的基础上打造出“量身定制”的检测模型。别再让通用模型的“平庸性能”限制你的项目上限——现在就动手修改代码,让你的YOLOv11模型在精度、速度或小样本适应能力上实现跨越式提升,用技术突破证明你的AI研发实力!本文将带你从代码层面入手,完成从骨干网络到损失函数的全维度改进,真正掌握让YOLOv11“为你所用”的技术实力。该改进对小样本类别(如数据集中仅占5%的“稀有缺陷”)的识别精度提升显著。 阅读详情

相关推荐

【车辆仿真】从0开始建立dSPACE RT Simulink工程:CAN通信(RTICANMM方法)

【工程环境信息】:本文基于链接文章搭建SCALEXIO Rack RTPC总线节点,用于与AutoBox通信硬件:上位机:惠普台式PC(Windows 11专业版)下位机(实时机):AutoBox (DS1006)板卡:DS6342软件:本文所使用的DBC链接提示:以下是本篇文章正文内容,下面案例可供参考!!!的部分一定记得配置,其他的按需配置RTICANMM的灵活度非常高,尽可能参考Help文档,理解相应的配置内容官方有RTICANMM的样例工程,在下方路径。

winnizap的博客 2382

服务端pdf渲染方案

近期需要每天查询数据,生成PDF,并在前端实现预览效果,需要满足以下几点要求。首先PDF生成预览有两种实现方案前三个需求算是比较基本的,前后端都可以实现,但是第四个需求涉及到匹配,且项目中部分文件PDF已有(规章制度、合同等),固定且无法更改,无需生成也不应该渲染生成。所以思路应该是在服务端生成PDF。下文中同样也会介绍一下前端PDF预览的方案。

峰 733

Amber分子动力学模拟:蛋白结构准备全流程与关键注意事项

分子动力学模拟是研究蛋白结构、配体结合与构象变化的重要计算手段,其结果的可靠性高度依赖初始结构的质量。在Amber模拟体系中,结构准备是决定后续计算成败的“一票否决”环节,任何缺失残基、错误质子化状态或未处理的二硫键都可能让长时程模拟失去意义。从PDB原始文件出发,需依次完成结构检查与清洗、残基命名统一、配体参数化、金属离子建模、加氢及质子化状态判断,最后通过tleap构建力场、溶剂盒子与离子环境。这一过程看似琐碎,却直接决定了蛋白在模拟中的物理合理性。无论是解析催化机制、评估药物结合亲和力,还是探索构象变

weixin_31714129的博客 241

生成PDF文件的几种方法

<br />生成PDF有几种方法,最常见的也是大家用的最多的,就是利用PDF插件,将其他的文件格式如Word, PPT 等直接转换成PDF,这种处理方式的结果即可以使文档看起来更加美观,又能防止文档发布之后别人任意删改。<br /> <br />刚才那种方式生成的PDF是静态的PDF,下面我来介绍一下生成交互式PDF的方法:<br />AcroForm:<br />所需软件:Adobe InDesign,Adobe Acrobat.<br />1.  在InDesign中,创建要用于该表单的文档。使用表格和

ifbateam的专栏 2304

NXP ChessDE的安装和激活

如果客户申请的是试用版,那么一份为期 30 天的 License 将会发送申请人的账号或邮箱中,客户使用该文件进行安装即可。② 将“VENDOR snpslmd /path/to/snpslmd”中的“/path/to/snpslmd”替换成 snpslmd.exe 实际存放路径(位于 SCL 安装目录下的 win32\bin 文件夹中,默认安装的情况下就是“VENDOR snpslmd C:\Synopsys\SCL\<version>\win32\bin\snpslmd.exe”)。

weixin_47351160的博客 2045

OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域

OpenCV是一个强大的计算机视觉库,广泛应用于图像处理、计算机视觉和机器学习等领域。本文将介绍OpenCV中的一些基础功能,包括如何绘制图形、创建图像金字塔以及如何处理感兴趣区域(ROI)。

吾家有猫名探花的博客 1963

springboot使用freemaker模板生成图片

springboot通过freemaker动态渲染数据,生成图片

kehonghg的博客 7906

利用eds editor生成CANOPEN 设备eds文件

通过以上步骤,您可以根据实际设备的功能特性,自动生成一份符合CANopen协议标准的电子数据表(EDS文件),该文件可以被上位机软件或其他CANopen主站设备用于识别、配置和控制您的CANopen从站设备。使用CANopen EDS Editor生成CANOPEN设备的EDS文件是一个系统化的过程,它涉及将设备的具体技术参数和功能映射到CANopen规范定义的对象字典中。

weixin_38604759的博客 6460

【采坑日记】Linux Server下使用PDFKit生成pdf文件

Python-PDFKit: HTML to PDF wrapper Github:https://github.com/JazzCore/python-pdfkit 这个第三方库是Ruby PDFKit库的改编版本,实际上是对wkhtmltopdf进行的一次封装。所以,在使用这个库时,应该也安装上wkhtmltopdf库。 安装 1. Install python-pdfkit: $ pip install pdfkit (or pip3 for python3) 2. Install wkhtm

厂长的博客 3021

Centos7 XFS(dm-0):Internal error XFS_WANT_CORRUPTED_GOTO

在k8s的道路上我们都是小白,每天启动虚机都会遇到各种各样的问题,这不。部署的k8s虚机启动发现操作系统启动异常,提示如下报错信息。进入/dev/mapper目录下,查询目录下路径信息。可以通过对文件系统进行修复操作,操作如下。重启完成后虚机恢复正常登录。

hedao0515的专栏 4583

CentOS 7下Synopsys DC综合工具安装与配置全攻略(附常见报错解决方案)

本文详细介绍了在CentOS 7操作系统上安装与配置Synopsys Design Compiler(DC)综合工具的完整流程。内容涵盖从系统环境准备、软件安装、许可证配置到实战综合的全过程,并针对DC综合工具在安装和运行中常见的报错问题提供了具体的解决方案,帮助数字IC设计初学者快速搭建稳定的EDA学习环境。

weixin_29159441的博客 259

【转】 java生成pdf方案总结

java生成pdf方案总结<br />文章分类:Java编程java生成pdf方案很多,常用的如下: <br /><br />1. 利用jacob生成pdf:这种方法调用office的本地方法实现对pdf API的操作,只能在windows平台使用 <br /><br />2. 利用openoffice生成pdf:openoffice是开源软件且能在windows和linux平台下运行 <br /><br />3. itext + flying saucer生成pdf:itext和flying saucer

strawbingo的专栏 3296

Java 实现 MP3 音频合并工具类:摆脱 FFmpeg,高效低 CPU 的纯本地方案【需求已解决】

本方案充分发挥了 Java 音频 SPI 的潜力,实现了轻量、跨平台、低 CPU 消耗的 MP3 音频合并工具类。 对于希望在服务器或桌面应用中集成音频处理功能的开发者而言,这无疑是一个可行且优雅的解决方案。

一键难忘的博客 545

探讨服务端自定义生成PDF的几种方案

废话不多说直接进入正题,首先分析生成pdf场景及生成内容,考虑复用性和维护难度是我们当前开发工作的第一要务!

LoveSummer 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

基于前端技术生成PDF方案

需求背景 业务系统需要预览报告(如产品周报,体检报告等)并生成pdf格式供用户下载,或者定期发送给指定用户 报告格式相对固定,由文本,图片和图表组成,基本与前端页面保持一致 解决方案 需求分为两步:报告预览和报告生成。 报告预览在前端进行展示,可使用前端技术,如React/Vue等技术栈对其进行还原,数据从服务端获取。 报告生成需要对第一步生成的HTML进行PDF的转换生成,HTML2PDF...

weixin_34187822的博客 1255

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

纯前端实现导出pdf文件(服务端不参与)

前端导出pdf文件

weixin_56663184的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Vue项目中html2pdf.js实现自动化PDF生成与分页优化

本文详细介绍了如何在Vue项目中集成和使用html2pdf.js实现前端自动化PDF生成。内容涵盖从快速集成、核心配置到实战优化,重点解决了多组件异步渲染、智能分页(避免表格/图表被截断)、页眉页脚定制以及性能优化等常见痛点,帮助开发者高效创建专业、规范的PDF报告。

ujm567890的博客 798

前端HTML转PDF全方案解析:从原生打印到React PDF生成

在前端开发中,将HTML内容转换为PDF是常见的需求,尤其在需要文档存档、合同打印或报表导出的场景。其核心原理是利用浏览器或JavaScript库将网页内容渲染为固定版面的便携式文档格式(PDF),以确保跨设备的一致性呈现。从技术价值看,这不仅能减轻服务器压力,还能实现离线转换和提升用户体验。常见的应用场景包括电子发票、数据报告、合同协议等需要标准化输出的文档。本文将深入探讨几种主流方案,包括原生window.print()与打印样式、html2canvas与jsPDF的截图拼接法、以及声明式的@react

weixin_28718755的博客 243

JSON转PDF API:一次HTTP调用实现高效文档生成的技术方案

在数据驱动的业务场景中,PDF文档因其格式固定、跨平台兼容的特性,成为报告、合同等关键文件分发的标准格式。其生成原理通常基于模板渲染或声明式布局,将结构化数据转换为固定版式。从技术价值看,通过API封装PDF生成逻辑,能实现业务逻辑与文档渲染的解耦,提升开发效率与系统可维护性。在应用场景上,这种方案尤其适用于自动化报告生成、批量单据处理等需要高效、一致文档输出的领域。本文聚焦于通过一次API调用实现JSON到PDF的高效转换,深入探讨了基于Puppeteer等无头浏览器技术的实现方案,并提供了性能优化与生产

weixin_30458043的博客 582

WEB在线预览PDF,WORD方案总结

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受。 目录 一、PDF的预览方式 1.PDFObject 2.PDF.JS 3.jsPDF 4.jQuery Media Plugin 5.Google Docs PDF viewer 6.ZOHO Viewer 7.Anychart:使用JavaScript导出PDF 8.jQuery Document Viewer 二、Word的预览方式 1.jQuery Media Plugin 2.PDFObje

草原孤狼的专栏 5798

内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档

另外,对于原生的PDF文件来说,仅包含英文字体,不包含任何中文字体,因此当导出的内容中含有中文字体编码时,就会显示乱码,所以通常情况下,我们都需要为PDF进行字体注册操作。当然也会有一定的缺点,对于字体较多的文件,需要注册不同的字体,字体文件越大,占用的带宽就越大。具体如何转,可以找一些在线的文件转换器,不过在线的有可能会因为字体文件太大而崩溃,或者有能力的大佬可以自己写一个转换的工具。正如前面所说的,在国内,使用中文的报告是一件再常见不过的事,在计量检测等相关场景,特殊字符的使用也较多。

葡萄城技术团队博客 4677

前端魔法:如何把后端返回HTML 内容一键变成 PDF/Word?这几种方案让你秀翻全场!

本文解析前端HTML转PDF/Word的解决方案:PDF生成推荐html2canvas+jsPDF处理复杂布局,pdfmake构建动态表格;Word生成采用docx.js实现全样式支持,mammoth.js直接转换HTML。提供字体缺失、图片跨域、分页截断等常见问题解决方案,并给出性能优化建议,拓展了实时报告生成、文档水印等创新应用场景,助力高效实现文件导出需求。

chl13218996367的博客 1202

【项目技术点总结之三】使用Java生成复杂好看的word或pdf报告的解决方案

前言 项目中往往会遇到需要生成报告的场景,不管是简单报告还是复杂报告,其实都需要找很多资料去尝试,本文会提出几种个人完美解决报告生成的解决方案,而且会提出几个失败但是能生成报告的设想,当然都是踩过坑的,也找了一些java常见的几种报告生成方法。 其实对生成报告而言,解决方案可能也蛮多,但是面对甲方的苛刻要求,即要报告好看,又要图文并茂,本着没有技术解决不了的思想,只能硬着头皮折腾了。一个是记录一下技术点,一个是给有同样需求的哥们一些参考,先上效果图: 一、使用技术介绍 1.1 报告图表生成使用html2

大牛的博客 1804

Vue项目实战:用html2pdf.js自动生成带分页的PDF报告(附完整代码)

本文详细介绍了如何在Vue项目中利用html2pdf.js实现高性能的PDF自动生成方案,解决大数据量报表的分页、渲染顺序控制等企业级难题。通过核心配置解析、企业级功能实现和高级优化技巧,帮助开发者快速掌握纯前端PDF生成技术,提升工作效率。

xxx12的博客 575

多张照片怎么合成一个PDF?分享几种把图片转为PDF的实用方法

【摘要】将多张图片合并为PDF的需求常见于文件提交、报销申报、资料归档等场景,主要解决散装图片不易整理和传输的问题。本文提供三种实用方案:1)Windows系统自带打印功能或Office软件直接转换,适合少量图片快速处理;2)Python脚本批量合成(使用img2pdf库),适合大量文件自动化处理;3)在线工具(如91aitool.cn)免安装跨平台操作,适合临时需求但需注意隐私风险。建议根据使用频率(偶尔/批量)、技术能力和隐私要求选择方案,合并后务必检查页码顺序。不同方案在安装需求、处理能力和隐私性上各

qq_42215257的博客 1431

vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

不用多说,vue前端的框架,echarts用来根据数据生成的带有样式效果的图表;html2canvas与dom-to-image都是将界面上的dom生成图片。

zhangzuying的博客 8855
上一篇: 业务开发时,接口不能对外暴露怎么办?
下一篇: ByteHouse实践与思考:如何补全ClickHouse高可用短板?
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值