Java与XML(五)xml的转换之pdf (xml+xsl 2 pdf)

fop生成PDF支持中文(xml & xsl) http://oudoud.iteye.com/blog/1755054 本例可将xml格式数据按xsl模板转化为PDF 1.首先,程序结构如下:  2.FopReport.java  Java代码   // Step 1: Construct a FopFactory       private static final FopFactory fopFactory = Fo... 阅读详情

做pdf转换是很实用的工作。已然存在的的转换工具就有很多,其中包括一些成熟的商业软件。而作为java程序开发,我们将借助一个叫FOP的开源工具。

在开始转换之前,我们不得不认识先一下FOP并对它的使用做简单的了解。

FOP (Formatting Objects Processor) 是第一个基于XSL:FO的打印格式处理器,也是第一个与输出无关的格式处理器。它是一个Java程序,能够从对象树中读入然后生成渲染过的页面输出到指定的流。目前支持的输出格式有PDF,PCL,PS,SVG,XML(以树形结构表示),打印机,AWT,MIF和TXT。最主要的输出指的是PDF。
James Tauber 
- FOP 的最初作者。他开发了该工具的原始版本,而且很大方地开放了该代码,后来又将它移交给 Apache XML Project。(他还给该工具选了一个极好的名称;除了该名称是字首组合词之外,Webster 对 fop 的定义是“过分讲究外表的人”。)现在 James 是 Bowstreet 的首席 XML 设计师。Apache XML项目以开放与合作的方式开发的,提供商业品质的基于XML标准的解决方案。从标准的实施角度看,它能给标准机构(比如IETF和W 3C )提供反馈信息。

FOP主页 http://xml.apache.org/fop/

 

FOP使用方式

FOP有3种使用方式,分别为命令行,程序嵌入,XT 嵌入。这里将主要介绍如何在程序中嵌入FOP功能。将XML文件转换为PDF实际上分为2步,第1步是利用XSLT将XML转换为XSL-FO,第2步是将XSL-FO转换为PDF。这里只讲述如何进行第2步的转换编程。

 

下载fop包后,你需要在CLASSPATH中添加下述jar文件:

{FOP安装目录}/build/fop.jar

{FOP安装目录}/lib/batik.jar

{FOP安装目录}/lib/xalan- 2.0.0 .jar

{FOP安装目录}/lib/xerces- 1.2.3 .jar

{FOP安装目录}/lib/avalon-framework-4.0.jar

{FOP安装目录}/lib/logkit-1.0b4.jar

{FOP安装目录}/lib/jimi-1.0.jar

我是使用Eclipse,只需要在工程属性->构建路径中加入他们,就可以使用这个伟大的工具了。

 

下面是具体的程序:

 

这是一个xml文件 test.xml:
<FeatureSRS title="SRS">

<introduction>

<objective>objective here</objective>

<scope>scope here</scope>

<responsibilities>responsibilities here</responsibilities>

<references>reference here</references>

<DAA>

<term>

term here

</term>

<definition>

definition here

</definition>

</DAA>

</introduction>

<generalDescription>

<featureName>

<summary>summary here</summary>

<breakdown>breakdown here</breakdown>

</featureName>

<requirement>

<content>

content here.

</content>

</requirement>

<requirement>

<content>

content2 here.

</content>

</requirement>

<featureInteractions>featureInteractions here</featureInteractions>

</generalDescription>

<strResources>

<strResource>

<estring>

estring here

</estring>

<resourceid>

resourceid here

</resourceid>

<rqmt>

rqmt here.

</rqmt>

</strResource>

</strResources>

</FeatureSRS>

 

这是它的xsl文件 test.xsl:

 

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">

<xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>

<!-- ========================= -->

<!-- root element: projectteam -->

<!-- ========================= -->

<xsl:template match="FeatureSRS">

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>

<fo:simple-page-master master-name="simpleA4" page-height=" 29.7cm " page-width=" 21cm " margin-top=" 2cm " margin-bottom=" 2cm " margin-left=" 2cm " margin-right=" 2cm ">

<fo:region-body/>

</fo:simple-page-master>

</fo:layout-master-set>

<fo:page-sequence master-reference="simpleA4">

<fo:flow flow-name="xsl-region-body">

<fo:block font-size=" 20pt " font-weight="bold" space-after=" 5mm " text-align="center">Cardiac Feature SRS

</fo:block>

<fo:block font-size=" 10pt ">

<xsl:apply-templates/>

</fo:block>

</fo:flow>

</fo:page-sequence>

</fo:root>

</xsl:template>

<!-- ========================= -->

<!-- child element: member -->

<!-- ========================= -->

<xsl:template name="introduction" match="introduction">

<fo:block font-size=" 18pt " font-weight="bold" space-after=" 5mm ">1. Intruction</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">1.1 Objective</fo:block>

<fo:block font-size=" 10pt " font-weight="normal" space-after=" 5mm " margin-left=" 7mm ">

<xsl:value-of select="objective"/>

</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">1.2 Scope</fo:block>

<fo:block font-size=" 10pt " font-weight="normal" space-after=" 5mm " margin-left=" 7mm ">

<xsl:value-of select="scope"/>

</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">1.3. Responsibilities</fo:block>

<fo:block font-size=" 10pt " font-weight="normal" space-after=" 5mm " margin-left=" 7mm ">

<xsl:value-of select="responsibilities"/>

</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">1.4. References</fo:block>

<fo:block font-size=" 10pt " font-weight="normal" space-after=" 5mm " margin-left=" 7mm ">

<xsl:value-of select="references"/>

</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">1.5. Definitions, Acronyms, and Abbreviations</fo:block>

<fo:block font-size=" 10pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">

<fo:table table-layout="fixed" border=" 2cm " background-color="#fff2d9" >

<fo:table-column column-width=" 4cm "/>

<fo:table-column column-width=" 6cm "/>

<fo:table-body>

<fo:table-row border="2">

<fo:table-cell>

<fo:block>

<xsl:text>Term</xsl:text>

</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block>

<xsl:text>Definition</xsl:text>

</fo:block>

</fo:table-cell>

</fo:table-row>

<xsl:for-each select="DAA">

<fo:table-row border="2">

<fo:table-cell>

<fo:block>

<xsl:value-of select="term"/>

</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block>

<xsl:value-of select="definition"/>

</fo:block>

</fo:table-cell>

</fo:table-row>

</xsl:for-each>

</fo:table-body>

</fo:table>

</fo:block>

</xsl:template>

<xsl:template name="generalDescription" match="generalDescription">

<fo:block font-size=" 18pt " font-weight="bold" space-after=" 5mm ">2. General Description</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">2.1. Feature Name</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 7mm "> 2.1.1 . Feature Summary</fo:block>

<fo:block font-size=" 10pt " font-weight="normal" space-after=" 5mm " margin-left=" 9mm ">

<xsl:value-of select="featureName/summary"/>

</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 7mm "> 2.1.2 . Feature Breakdown</fo:block>

<fo:block font-size=" 10pt " font-weight="normal" space-after=" 5mm " margin-left=" 9mm ">

<xsl:value-of select="featureName/breakdown"/>

</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">2.2. Feature Requirements</fo:block>

<fo:block font-size=" 10pt " font-weight="normal" space-after=" 5mm " margin-left=" 7mm ">

<xsl:for-each select="requirement">

<xsl:value-of select="content"/>

</xsl:for-each>

</fo:block>

<fo:block font-size=" 14pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">2.3. Feature Interactions</fo:block>

<fo:block font-size=" 10pt " font-weight="normal" space-after=" 5mm " margin-left=" 7mm ">

<xsl:value-of select="featureInteractions"/>

</fo:block>

</xsl:template>

<xsl:template name="strResources" match="strResources">

<fo:block font-size=" 18pt " font-weight="bold" space-after=" 5mm ">3. String Resources </fo:block>

<fo:block font-size=" 10pt " font-weight="bold" space-after=" 5mm " margin-left=" 5mm ">

<fo:table table-layout="fixed" border=" 2cm " background-color="#fff2d9" >

<fo:table-column column-width=" 4cm "/>

<fo:table-column column-width=" 10cm "/>

<fo:table-column column-width=" 4cm "/>

<fo:table-body>

<fo:table-row border="2">

<fo:table-cell>

<fo:block>

<xsl:text>English String</xsl:text>

</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block>

<xsl:text>Resource ID</xsl:text>

</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block>

<xsl:text>Rqmt</xsl:text>

</fo:block>

</fo:table-cell>

</fo:table-row>

<xsl:for-each select="strResource">

<fo:table-row border="2">

<fo:table-cell>

<fo:block>

<xsl:value-of select="estring"/>

</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block>

<xsl:value-of select="resourceid"/>

</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block>

<xsl:value-of select="rqmt"/>

</fo:block>

</fo:table-cell>

</fo:table-row>

</xsl:for-each>

</fo:table-body>

</fo:table>

</fo:block>

</xsl:template>

</xsl:stylesheet>

 

注意,以上文件不要加:<?xml version="1.0" encoding="UTF-8"?> 这句。

 

转换的java代码 ExampleXML2PDF.java:

 

package src;

import java.io.File;

import java.io.IOException;

import java.io.OutputStream;

import javax.xml.transform.Result;

import javax.xml.transform.Source;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.sax.SAXResult;

import javax.xml.transform.stream.StreamSource;

import org.apache.avalon.framework.ExceptionUtil;

import org.apache.avalon.framework.logger.ConsoleLogger;

import org.apache.fop.apps.Driver;

import org.apache.fop.messaging.MessageHandler;

 

public class ExampleXML2PDF{

 

public void convertXML2PDF(File xml, File xslt, File pdf)

throws TransformerException, IOException {

Driver driver = new Driver();

ConsoleLogger logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO);

driver.setLogger((org.apache.avalon.framework.logger.Logger) logger);

MessageHandler.setScreenLogger((org.apache.avalon.framework.logger.Logger) logger);

 

//Setup Renderer (output format)

driver.setRenderer(Driver.RENDER_PDF);

 

//Setup output

OutputStream out = new java.io.FileOutputStream(pdf);

try {

driver.setOutputStream(out);

 

//Setup XSLT

TransformerFactory factory = TransformerFactory.newInstance();

Transformer transformer = factory.newTransformer(new StreamSource(xslt));

 

//Setup input for XSLT transformation

Source src = new StreamSource(xml);

 

//Resulting SAX events (the generated FO) must be piped through to FOP

Result res = new SAXResult(driver.getContentHandler());

 

//Start XSLT transformation and FOP processing

transformer.transform(src, res);

} finally {

out.close();

}

}

 

public static void main(String[] args) {

try {

System.out.println("FOP ExampleXML2PDF/n");

System.out.println("Preparing...");

 

//Setup directories

File baseDir = new File(".");

File outDir = new File(baseDir, "out");

outDir.mkdirs();

 

File xmlfile = new File("f://tomcat5//webapps//myxml//xmldata//test.xml");

File xsltfile = new File("f://tomcat5//webapps//myxml//xmldata//test.xsl");

File pdffile = new File("f://tomcat5//webapps//myxml//xmldata//test.pdf");

 

System.out.println("Input: XML (" + xmlfile + ")");

System.out.println("Stylesheet: " + xsltfile);

System.out.println("Output: PDF (" + pdffile + ")");

System.out.println();

System.out.println("Transforming...");

 

ExampleXML2PDF app = new ExampleXML2PDF();

app.convertXML2PDF(xmlfile, xsltfile, pdffile);

 

System.out.println("Success!");

} catch (Exception e) {

System.err.println(ExceptionUtil.printStackTrace(e));

System.exit(-1);

}

}

}

 

编译执行即可。

12、将 XML 转换为 PDF 本文详细介绍了如何使用 Apache FOP 将 XML 文档转换为 PDF 格式。内容包括软件安装、Eclipse 项目设置、XML 到 XSL-FO 的转换、PDF 文档的生成以及完整的示例代码。适合需要实现文档自动化生成的开发者参考。 阅读详情

相关推荐

掌握XSL格式化对象:将XML文档转换为PDF

本章节深入介绍了XSL(可扩展样式表语言)格式化对象的使用,展示了如何利用XSL将XML文档转换为多种格式,包括PDF。详细讲解了Apache FOP工具的安装和配置,以及如何使用XSL格式化对象标记文档。通过实际案例和步骤,读者将学会如何将XSL文档转换成PDF格式,同时对XSL格式化对象的结构和应用有了更深刻的理解。

weixin_33814090的博客 353

java 使用documents4j将XML转为pdf文件的方式

XML广泛应用于数据存储、数据交换和Web服务等领域,它提供了一种灵活和可扩展的方式来组织和传输数据。

askf01的博客 3579

Java平台XSL解析器实现与应用实战

在现代数据交换和内容呈现体系中,XML(Extensible Markup Language)作为一种结构化、可扩展的数据格式,广泛应用于配置文件、消息传输、文档存储等领域。而XSL(Extensible Stylesheet Language)及其核心组件XSLT(XSL Transformations),则提供了将XML数据转换为HTML、文本或其他结构化输出的强大能力。理解XML与XSLT的基础语法不仅是掌握Java XSL解析器的前提,更是构建高效、灵活的数据转换管道的关键一步。

weixin_35755640的博客 765

java-接收xml文本并转换为pdf上传

java-接收xml文本并转换为pdf上传

Top_xze的博客 1887

Xml2Pdf-开源

Xml2Pdf是一个小型实用程序,允许将xml文件转换为pdf。 这不是通用转换器,而是一组3个特定的转换器:DVD,漫画和寓言。 使用iTextSharp库进行转换。

Pdf--to--XML:PDF TO XML 转换器(Web 应用程序)

PDF TO XML 转换器(Web 应用程序) 使用的工具: Java Apache PDFBox API SpringMVC Jquery、AJAX、JS 和 CSS 引导框架 STS(弹簧工具套件) 描述: 该Web应用程序旨在解析pdf文件(Employess Payslip)并使用pdfbox api从pdf文件中提取详细信息,然后转换为json,然后转换为xml,然后使用xstl转换为xml。 用户可以在 UI 中看到所有类型的格式,如果需要任何更改,这些文本区域也可以编辑,最后如果一切正常,将弹出下载按钮以下载 xml 文件。 注意:需要根据pdf文件修改代码。

java xsl转换pdf_Java转换为PDF

I am doing a POC for one of my performance projects. Currently I'm facing an OutOfMemoryError. First we had loaded an XML file using DOM and then attempted to transform it with XSL into a PDF. After r...

weixin_39732316的博客 390

XML转PDF的FOP包和代码

XML转PDF的FOP包和代码,具体使用方式度娘上有很多,这里只提供一些包,祝你好运!

java xsl转换pdf_JavaEE XML XSL转换(XSLT)

XSL转换(XSLT)@author ixenos定义:XSL转换机制可以指定将XML文档转换为其他格式的规则,例如,txt纯文本、XHTML或其他任何XML格式。用途:XSLT通常用来将某种机器可读的XML格式转译为另一种机器可读的XML格式,或者将XML转译为适合人类阅读的表示格式步骤:1、 需要提供XSLT样式表,它描述了XML文档向某种格式转换的规则2、 XSLT处理器读入XML文档和XS...

weixin_39897070的博客 273

javaxml,xsl,html文件转换.pdf

javaxml,xsl,html文件转换.pdf

【驭风计划 机器学习】实验6 基于集成学习的 Amazon 用户评论质量预测

¶随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

Mege1的博客 472

Java与XML(六)xml的转换之pdf (fo 2 pdf)

如果有fo文件,则可以直接转换成pdf。具体方法如下:一个fo文件simple.fo:http://www.w3.org/1999/XSL/Format">            margin-top="36pt" margin-bottom="36pt"       page-width="8.5in" page-height="11in"       margin-left="72pt" ma

智在居士草堂 5794

CS231n+assignment2(一)

cs231n作业二详解+代码

qq_56551150的博客 2411

java xsl转换pdf,Java转换为PDF

I am doing a POC for one of my performance projects. Currently I'm facing an OutOfMemoryError. First we had loaded an XML file using DOM and then attempted to transform it with XSL into a PDF. After r...

weixin_35238815的博客 136

从零到一:用AXI DataMover在Zynq MPSoC上实现高效DMA传输(附Vitis HLS驱动示例)

本文详细介绍了如何在Xilinx Zynq UltraScale+ MPSoC平台上使用AXI DataMover实现高效的DMA数据传输。通过解析AXI DataMover架构、Vivado工程配置、Vitis HLS驱动开发及性能优化技巧,帮助开发者快速构建高性能数据传输通道,并提供了可直接复用的代码示例。

weixin_42520796的博客 426

非技术面试题精选大全

回答提示:一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验,这些在简历上都有,其实,企业最希望知道的是求职者能否胜任工作,包括:最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,主要的成就等,这些都可以和学习无关,也可以和学习有关,但要突出积极的个性和做事的能力,说得合情合理企业才会相信。企业喜欢有礼貌的求职者。

吃面爱放香菜的博客 435

java xsl转换pdf_如何使用Java使用XSL转换XML

我目前正在使用标准的javax.xml.transform库使用XSL将XML转换为CSV.我的XSL文件很大-大约950行.我的XML文件也可能很大.它在原型阶段运行良好,仅在大约50行左右就安装了XSL的一部分.现在,在“最终系统”中,当执行转换时,会出现错误分支目标偏移量过短的错误.private String transformXML() {String formattedOutput =...

weixin_39881387的博客 170

基于STM32设计的太阳能智慧路灯_444

本文设计并实现了一种基于 STM32 的太阳能智慧路灯系统。系统以 STM32F103C8T6 单片机为核心,集成温湿度检测、空气质量检测、环境光照检测、行人检测和路灯故障检测等功能,实现对路灯运行环境和工作状态的实时感知。

462

java xsl转换pdf_fop生成PDF支持中文(xml & xsl) - 飞猪 - ITeye博客

2.FopReport.java// Step 1: Construct a FopFactoryprivate static final FopFactory fopFactory = FopFactory.newInstance();/*** 根据xsl模板及xml数据文件生成pdf* @param xsltFile xsl模板* @param xmlFile xml数据文件* @return...

weixin_39690625的博客 501

Unity之ASE如何实现UV扰动闪电效果

UV扰动,顾名思义,就是通过干扰原贴图的UV,使UV发生变化,导致贴图出现会动的效果,如果我们贴图和扰动的速度调整的刚好合适的话,会出现一些非常棒的效果,比如下图所示的闪电效果:好了,一个简单的UV扰动就讲完了,同学们可以发挥想象力,我们是否可以利用UV扰动的原理,做一点别的炫酷的效果出来,比如,交错流动,流光效果等等。很期待你的留言,这篇文章就到这里,希望对你有所帮助。

TxNet 1791

Android 10.0 SystemUI 屏蔽状态栏消息推送弹出的悬浮通知

在状态栏中,有一些通知类似 消息推送 弹出的 悬浮通知,弹出30秒之后会消失掉 要想屏蔽掉这些通知,首选知道这些通知是怎么产生的 通知类型 NotificationContentInflater.java 详细的介绍各种通知的类型 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java /** * The defau

安卓兼职framework和app工程师的博客 1542

XSL-FO 与 XSLT

XSL-FO与XSLT的关系总结: XSL-FO是最终排版语言,而XSLT是生成FO的转换工具。实际应用中,99.9%的场景都是通过XSLT将业务XML(如订单、发票)转换为FO格式,再通过FOP等处理器生成PDF。2025年主流用法包括:1)XSLT直出PDF(最常见);2)生成中间FO文件;3)Java/.NET程序调用;4)极少手写FO。典型技术栈组合推荐Java+Saxon+FOP或.NET+Saxon-CS+Antenna House。核心结论:永远用XSLT生成FO,掌握XSLT在金融、政务领域

likuolei的博客 874

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

xml转PDF(xml&xslt-」fo-」pdf)_完整项目_CodingPark编程公园

文章介绍 1 制作一个xml实例 2 制作一个XSLT(fo)式样单 3 将XML文档通过XSLT转换成XSL-FO 4 采用FOP将上述文档转换成PDF格式 5 总结与思考 预备知识语法库 xml 与 xsl(fo) <?xml version="1.0" encoding="UTF-8"?> <!--如果xml+xslt(fo)可以不写 | 如果xml+xsl可以写,当你...

CodingPark 编程公园 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java中xsl用法_XSL-FO 简单使用方法(java & xsl-fo & xml)

XSL-FO 简单使用方法(java & xsl-fo & xml)package testfop;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.OutputStream;import javax.xml.transform.Res...

weixin_33140809的博客 498
上一篇: Java与XML(四)xml的转换之html
下一篇: Java与XML(六)xml的转换之pdf (fo 2 pdf)
delva
博客等级 码龄23年 16粉丝 90原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值