C#生成PDF格式的合同文件

最近接手了一个项目,其中有个功能是生成PDF格式的合同文件。为此,现将代码分享出来!

效果图如下:

在这里插入图片描述

一、准备工作

首先C#代码操作pdf文件,需要引用一个pdf官方提供的两个dll,去网上下载,并将其添加引用到项目即可。
官方下载地址

PDF相关动态库
提取码:0jue
在这里插入图片描述

在代码中引用

using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

二、创建PDF文件

private static void Main() {
    // 创建PDF文件
    FileStream pdfFs = new FileStream("C:\\MyText.pdf", FileMode.Create);//C:\\MyText.pdf为保存路径
    
    // 获取实例
    Document doc = new Document();
    PdfWriter.GetInstance(doc, pdfFs);
    
    // 打开pdf
    doc.Open();
	
	iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance("C:\\logo.jpg");//C:\\logo.jpg为logo路径
    image.ScaleAbsolute(50, 50);
    image.SetAbsolutePosition(50, PageSize.A4.Height-50);
    doc.Add(image);
    
    Font font = SetFontSizeColor(20, BaseColor.BLACK);
    Paragraph tit = new Paragraph("深圳市双睿鑫科技有限公司", font);
    tit.Alignment = 1;//居中
    doc.Add(tit);
    
	// 合并多个表格
    List<PdfPTable> allTable = new List<PdfPTable>();
    allTable.Add(SetTitlePDf());
    PdfPTable table = MergeMult(allTable);
    doc.Add(table);//添加表格

    font = SetFontSizeColor(14, BaseColor.BLACK);
    tit = new Paragraph("订单详情", font);
    tit.IndentationLeft = 20;//左边距
    doc.Add(tit);

    // 合并多个表格
    allTable = new List<PdfPTable>();
    allTable.Add(SetMessPDF());
    table = MergeMultTable(allTable);
    doc.Add(table);// 添加表格

    font = SetFontSizeColor(14, BaseColor.BLACK);
    tit = new Paragraph("费用明细", font);
    tit.IndentationLeft = 20;//左边距
    doc.Add(tit);

    // 合并多个表格
    allTable = new List<PdfPTable>();
    allTable.Add(SetInfoPDF());
    table = MergeMultTable(allTable);
    doc.Add(table);//添加表格

    font = SetFontSizeColor(14, BaseColor.BLACK);
    tit = new Paragraph("合同条款", font);
    tit.IndentationLeft = 20;//左边距
    doc.Add(tit);
	
    List<string> str = new List<string>();
    str.Add("第一条合同条款。");
    str.Add("第二条合同条款。");
    str.Add("第三条合同条款。");
    str.Add("第四条合同条款。");
    str.Add("第五条合同条款。");
    str.Add("第六条合同条款。");
    str.Add("第七条合同条款。");
    str.Add("第八条合同条款。");
    str.Add("第九条合同条款。");
    str.Add("第十条合同条款。");
    doc = contract(str, doc);
	
	//合并多个表格
	allTable = new List<PdfPTable>();
	allTable.Add(SetBottomPDf());
	table = MergeMultTable(allTable);
	doc.Add(table);//添加表格
	
	image = iTextSharp.text.Image.GetInstance("C://contract.jpg");//C:\\contract.jpg为合同章路径
	image.ScaleAbsolute(150, 150);
	image.SetAbsolutePosition(PageSize.A4.Width-300, 10);
	doc.Add(image);
    
	//关闭
    doc.Close();
    pdfFs.Close();
}

三、写入内容

/// <summary>
/// 合同条款
/// </summary>
/// <param name="contractList">合同条款</param>
/// <param name="doc">pdf内容</param>
/// <returns></returns>
private static Document contract(List<string> contractList, Document doc)
{
    Font font;
    Paragraph tit;
    for (int i = 0; i < contractList.Count; i++)
    {
        font = SetFont(10, BaseColor.BLACK);
        tit = new Paragraph((i + 1) + "、" + contractList[i], font);
        tit.IndentationLeft = 20;//左边距
        tit.IndentationRight = 20;//右边距
        tit.FirstLineIndent = 20;
        doc.Add(tit);
    }
    return doc;
}
/// <summary>
/// 创建一行N列
/// </summary>
/// <param name="columnNameList">列的元素</param>
/// <param name="fontSize">字号大小</param>
/// <returns></returns>
private static PdfPTable CreateOneRow(List<string> columnNameList, int fontSize)
{
    // 定义表格对象,参数是该表格的列数
    PdfPTable table = new PdfPTable(columnNameList.Count);
    // 实现自动换页
    table.SplitLate = false;
    table.SplitRows = true;

    // 获取字号
    Font font = SetFontSizeColor(fontSize, BaseColor.BLACK);
    // 定义单元格对象
    PdfPCell cell;

    int rowCount = columnNameList.Count;
    for (int i = 0; i < rowCount; i++)
    {
        if (columnNameList[i] != null)
        {
            cell = new PdfPCell(new Phrase(columnNameList[i], font));   // 将内容绑定到单元格中
            cell.PaddingTop = 20;
            cell.PaddingBottom = 30;
            cell.HorizontalAlignment = 1;   // 居中
            cell.DisableBorderSide(15);
            table.AddCell(cell);
        }
    }

    return table;
}
/// <summary>
/// 创建一行N列
/// </summary>
/// <param name="columnNameList">列的元素</param>
/// <param name="fontSize">字号大小</param>
/// <returns></returns>
private static PdfPTable CreateBottomRow(List<string> columnNameList, int fontSize)
{
    // 定义表格对象,参数是该表格的列数
    PdfPTable table = new PdfPTable(columnNameList.Count);
    // 实现自动换页
    table.SplitLate = false;
    table.SplitRows = true;

    // 获取字号
    Font font = SetFontSizeColor(fontSize, BaseColor.BLACK);
    // 定义单元格对象
    PdfPCell cell;

    int rowCount = columnNameList.Count;
    for (int i = 0; i < rowCount; i++)
    {
        if (columnNameList[i] != null)
        {
            cell = new PdfPCell(new Phrase(columnNameList[i], font));   // 将内容绑定到单元格中
            cell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT;   // 右对齐
            cell.DisableBorderSide(15);
            table.AddCell(cell);
        }
    }

    return table;
}
/// <summary>
/// 创建一行N列表格
/// </summary>
/// <param name="columnNameList">列的元素</param>
/// <param name="fontSize">字号大小</param>
/// <returns></returns>
private static PdfPTable CreateOneRowTable(List<string> columnNameList, int fontSize)
{
    // 定义表格对象,参数是该表格的列数
    PdfPTable table = new PdfPTable(columnNameList.Count);
    // 实现自动换页
    table.SplitLate = false;
    table.SplitRows = true;

    // 获取字号
    Font font = SetFontSizeColor(fontSize, BaseColor.BLACK);
    // 定义单元格对象
    PdfPCell cell;

    int rowCount = columnNameList.Count;
    for (int i = 0; i < rowCount; i++)
    {
        if (columnNameList[i] != null)
        {
            cell = new PdfPCell(new Phrase(columnNameList[i], font));   // 将内容绑定到单元格中
            cell.HorizontalAlignment = 1;   // 居中
            table.AddCell(cell);
        }
    }

    return table;
}
/// <summary>
/// 设置字号与字体颜色
/// </summary>
/// <returns></returns>
private static Font SetFontSizeColor(int size, BaseColor color)
{

    BaseFont bfchinese = BaseFont.CreateFont(_WebConfig.GetAppSettingsString("ttf_url"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//simkai.ttf
    Font ChFont = new iTextSharp.text.Font(bfchinese, size, Font.NORMAL, color);//Font.BOLD:加粗
    return ChFont;
}

/// <summary>
/// 设置字号与字体颜色
/// </summary>
/// <returns></returns>
private static Font SetFont(int size, BaseColor color)
{

    BaseFont bfchinese = BaseFont.CreateFont(_WebConfig.GetAppSettingsString("ttf_url"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//simkai.ttf
    Font ChFont = new iTextSharp.text.Font(bfchinese, size, Font.NORMAL, color);
    return ChFont;
}

// 标题部分表格
public static PdfPTable SetTitlePDf()
{
    // 定义一个字符串链表,用于存储填入表格中的数据
    List<string> text = new List<string>();

    text.Add("商品销售合同");
    PdfPTable tableMain = CreateOneRow(text, 14);  // 创建一张仅有一行一列的表格

    text = new List<string>();
    text.Add("需求方(甲方):");
    text.Add("供应商(乙方):深圳市双睿鑫科技有限公司");
    text.Add("联系人:");
    text.Add("客服人员:张先生");
    text.Add("收货地址:");
    text.Add("地址:广东省深圳市龙华区");
    PdfPTable tableMess = CreateMultRowMultColumn(2, text);    // 根据数据创建多行多列表格
    // 将两张表合并成一张表
    PdfPTable table = MergeTwo(tableMain, tableMess);

    return table;

}
// 标题部分表格
public static PdfPTable SetBottomPDf()
{
    // 定义一个字符串链表,用于存储填入表格中的数据
    List<string> text = new List<string>();

    text.Add("合同生成日期:" + DateTime.Now.ToLongDateString().ToString());
    PdfPTable tableMain = CreateBottomRow(text, 10);  // 创建一张仅有一行一列的表格

    text = new List<string>();
    text.Add("甲方代表签字:");
    text.Add("乙方代表签字:张先生");
    text.Add("盖章:");
    text.Add("盖章:");
    PdfPTable tableMess = CreateMultRowMultColumn(2, text);    // 根据数据创建多行多列表格
    // 将两张表合并成一张表
    PdfPTable table = MergeTwo(tableMain, tableMess);

    return table;

}
/// <summary>
/// 合并两个表格
/// </summary>
/// <param name="table1"></param>
/// <param name="table2"></param>
/// <returns></returns>
public static PdfPTable MergeTwoTable(PdfPTable table1, PdfPTable table2)
{
    // 定义表格对象,参数代表是该表格一共由多少列
    PdfPTable table = new PdfPTable(1);
    // 定义单元格对象
    PdfPCell cell;

    // 实现自动换页
    table.SplitLate = false;
    table.SplitRows = true;

    // 这个函数写死是合并两个单元格
    int rowCount = 2;
    for (int i = 0; i < rowCount; i++)
    {
        switch (i)
        {
            case 0:
                // 单元格中添加表格1
                cell = new PdfPCell(table1);
                // 居中
                cell.Padding = 0;
                cell.DisableBorderSide(15);
                // 将单元格添加到表格中
                table.AddCell(cell);
                break;
            case 1:
                cell = new PdfPCell(table2);
                cell.Padding = 0;
                cell.DisableBorderSide(15);
                table.AddCell(cell);
                break;
            default:
                break;
        }
    }

    // 最后将合并好的表格返回
    return table;
}

/// <summary>
/// 合并两个表格
/// </summary>
/// <param name="table1"></param>
/// <param name="table2"></param>
/// <returns></returns>
public static PdfPTable MergeTwo(PdfPTable table1, PdfPTable table2)
{
    // 定义表格对象,参数代表是该表格一共由多少列
    PdfPTable table = new PdfPTable(1);
    // 定义单元格对象
    PdfPCell cell;

    // 实现自动换页
    table.SplitLate = false;
    table.SplitRows = true;

    // 这个函数写死是合并两个单元格
    int rowCount = 2;
    for (int i = 0; i < rowCount; i++)
    {
        switch (i)
        {
            case 0:
                // 单元格中添加表格1
                cell = new PdfPCell(table1);
                // 居中
                cell.Padding = 0;
                cell.DisableBorderSide(15);
                // 将单元格添加到表格中
                table.AddCell(cell);
                break;
            case 1:
                cell = new PdfPCell(table2);
                cell.Padding = 0;
                cell.DisableBorderSide(15);
                table.AddCell(cell);
                break;
            default:
                break;
        }
    }

    // 最后将合并好的表格返回
    return table;
}

// 订单详情部分表格
public static PdfPTable SetMessPDF()
{
    List<string> checkNameList = new List<string>();

    checkNameList.Add("商品");
    checkNameList.Add("单价");
    checkNameList.Add("数量");
    checkNameList.Add("总价");
    checkNameList.Add("周期");
    checkNameList.Add("发票");
    PdfPTable tableTitle = CreateOneRowTable(checkNameList, 12);    // 生成一张表格

    checkNameList = new List<string>();
    checkNameList.Add("iPhone 13");
    checkNameList.Add("¥5399");
    checkNameList.Add("100部");
    checkNameList.Add("¥53990");
    checkNameList.Add("5天");
    checkNameList.Add("增值税发票");

    PdfPTable tableMess = CreateMultRowMultColumnTable(6, checkNameList);       // 创建多行多列表格
    PdfPTable tableOverall = MergeTwoTable(tableTitle, tableMess);  // 两张表格上下合并

    //PdfPTable table = CreateRowTitleRowDataTable("订单详情", tableOverall, 5);  // 合并左边带标题信息的表格

    return tableOverall;
}
/// <summary>
/// 创建带行标题和一组数据的表格
/// </summary>
/// <param name="columnTitleName">行标题</param>
/// <param name="messPDFTable">数据表格</param>
/// <param name="columnCount">数据表的比例</param>
/// <returns></returns>
private static PdfPTable CreateRowTitleRowDataTable(string columnTitleName, PdfPTable messPDFTable, int columnCount)
{
    // 创建两列的表格
    PdfPTable table = new PdfPTable(2);
    // 设置列宽比例
    table.SetWidths(new int[] { 1, columnCount });  // 猜测:1比columnCount的比例
                                                    // 设置自动换页
    table.SplitLate = false;
    table.SplitRows = true;
    // 设置字号字体颜色
    Font font = SetFontSizeColor(15, BaseColor.BLUE);

    PdfPCell cell;
    int rowCount = 2;

    for (int i = 0; i < rowCount; i++)
    {
        switch (i)
        {
            case 0:
                cell = new PdfPCell(new Phrase(columnTitleName, font));     // 新建一个单元格,数据作为参数
                cell.HorizontalAlignment = 1;
                table.AddCell(cell);        // 单元格添加到表格中
                break;
            case 1:
                cell = new PdfPCell(messPDFTable);  // 新建一个单元格,表格作为参数
                cell.Padding = 0;
                table.AddCell(cell);    // 单元格添加到表格中
                break;
            default:
                break;
        }
    }

    return table;
}
/// <summary>
/// 创建多行多列
/// </summary>
/// <param name="column">列数</param>
/// <param name="columnDataNameList">数据</param>
/// <returns></returns>
private static PdfPTable CreateMultRowMultColumn(int column, List<string> columnDataNameList)
{
    // 创建多列表格
    PdfPTable table = new PdfPTable(column);
    // 设置字号与字体颜色
    Font font = SetFontSizeColor(12, BaseColor.BLACK);

    // 设置自动换页
    table.SplitLate = false;
    table.SplitRows = true;

    // 定义单元格
    PdfPCell cell;

    // 这里的意思是:
    // 将链表中的数据一个一个的设置到单元格中,然后单元格添加到表格中
    // 这里需要注意,因为我们定义表格对象是设置了列数,所以设置单元格达到表的列数后,再次往表中添加单元格会自动换行添加!
    int rowColumn = columnDataNameList.Count;
    for (int i = 0; i < rowColumn; i++)
    {
        // 实例化单元格对象,数据与字体设置到单元格中
        cell = new PdfPCell(new Phrase(columnDataNameList[i], font));
        cell.PaddingTop = 5;
        cell.PaddingBottom = 5;
        cell.DisableBorderSide(15);
        // 将单元格添加到表格中
        table.AddCell(cell);
    }

    return table;
}

/// <summary>
/// 创建多行多列表格
/// </summary>
/// <param name="column">表格列数</param>
/// <param name="columnDataNameList">表格中的数据</param>
/// <returns></returns>
private static PdfPTable CreateMultRowMultColumnTable(int column, List<string> columnDataNameList)
{
    // 创建多列表格
    PdfPTable table = new PdfPTable(column);
    // 设置字号与字体颜色
    Font font = SetFontSizeColor(12, BaseColor.RED);

    // 设置自动换页
    table.SplitLate = false;
    table.SplitRows = true;

    // 定义单元格
    PdfPCell cell;

    // 这里的意思是:
    // 将链表中的数据一个一个的设置到单元格中,然后单元格添加到表格中
    // 这里需要注意,因为我们定义表格对象是设置了列数,所以设置单元格达到表的列数后,再次往表中添加单元格会自动换行添加!
    int rowColumn = columnDataNameList.Count;
    for (int i = 0; i < rowColumn; i++)
    {
        // 实例化单元格对象,数据与字体设置到单元格中
        cell = new PdfPCell(new Phrase(columnDataNameList[i], font));
        cell.HorizontalAlignment = 1;
        // 将单元格添加到表格中
        table.AddCell(cell);
    }

    return table;
}

// 费用明细部分表格
public static PdfPTable SetInfoPDF()
{
    List<string> checkNameList = new List<string>();

    checkNameList.Add("订单编号");
    checkNameList.Add("商品金额");
    checkNameList.Add("税费");
    checkNameList.Add("总金额");
    PdfPTable tableTitle = CreateOneRowTable(checkNameList, 12);    // 生成一张标题表格

    checkNameList = new List<string>();
    checkNameList.Add("20220512001");
    checkNameList.Add("¥53990");
    checkNameList.Add("¥7018.7");
    checkNameList.Add("¥61008.7");


    PdfPTable tableMess = CreateMultRowMultColumnTable(4, checkNameList);    // 根据数据创建多行多列表格
    PdfPTable tableOverall = MergeTwoTable(tableTitle, tableMess);              // 将两张表合并成一张表

    // 新建一个表格,一行两列,第一列写入参数一数据,第二列放入参数二表格
    //PdfPTable table = CreateRowTitleRowDataTable("费用明细", tableOverall, 5);

    return tableOverall;
}
/// <summary>
/// 合并多个表格
/// </summary>
/// <param name="pdfList"></param>
/// <returns></returns>
public static PdfPTable MergeMultTable(List<PdfPTable> pdfList)
{
    PdfPTable table = new PdfPTable(1);
    PdfPCell cell;

    table.SplitLate = false;
    table.SplitRows = true;

    // 将表格绑定到单元格中,然后将单元格插入汇总表格
    foreach (PdfPTable pdf in pdfList)
    {
        cell = new PdfPCell(pdf);
        cell.Padding = 0;
        cell.PaddingTop = 10;
        cell.DisableBorderSide(15);//隐藏Table边框
        table.AddCell(cell);
    }

    return table;
}
/// <summary>
/// 合并多行
/// </summary>
/// <param name="pdfList"></param>
/// <returns></returns>
public static PdfPTable MergeMult(List<PdfPTable> pdfList)
{
    PdfPTable table = new PdfPTable(1);
    PdfPCell cell;

    table.SplitLate = false;
    table.SplitRows = true;

    // 将表格绑定到单元格中,然后将单元格插入汇总表格
    foreach (PdfPTable pdf in pdfList)
    {
        cell = new PdfPCell(pdf);
        cell.PaddingLeft = -30;
        cell.PaddingRight = -30;
        cell.DisableBorderSide(15);//隐藏Table边框
        table.AddCell(cell);
    }

    return table;
}

四、总结

C#生成PDF文件无非就是表格类PdfPTable与单元格类PdfPCell互相配合使用而已!根据自己的需求封装函数创建表格返回就行。

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
C#实现生成PDF文档(附源码) 收藏 //write by wenhui.org using System; using System.IO; using System.Text; using System.Collections; namespace PDFGenerator { public class PDFGenerator { static float pageWidth = 594.0f; static float pageDepth = 828.0f; static float pageMargin = 30.0f; static float fontSize = 20.0f; static float leadSize = 10.0f; static StreamWriter pPDF=new StreamWriter("E:\myPDF.pdf"); static MemoryStream mPDF= new MemoryStream(); static void ConvertToByteAndAddtoStream(string strMsg) { Byte[] buffer=null; buffer=ASCIIEncoding.ASCII.GetBytes(strMsg); mPDF.Write(buffer,0,buffer.Length); buffer=null; } static string xRefFormatting(long xValue) { string strMsg =xValue.ToString(); int iLen=strMsg.Length; if (iLen<10) { StringBuilder s=new StringBuilder(); int i=10-iLen; s.Append('0',i); strMsg=s.ToString() + strMsg; } return strMsg; } static void Main(string[] args) { ArrayList xRefs=new ArrayList(); //Byte[] buffer=null; float yPos =0f; long streamStart=0; long streamEnd=0; long streamLen =0; string strPDFMessage=null; //PDF文档头信息 strPDFMessage="%PDF-1.1 "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage="1 0 obj "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="<> "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="stream "; ConvertToByteAndAddtoStream(strPDFMessage); ////////PDF文档描述 streamStart=mPDF.Length; //字体 strPDFMessage="BT /F0 " + fontSize +" Tf "; ConvertToByteAndAddtoStream(strPDFMessage); //PDF文档实体高度 yPos = pageDepth - pageMargin; strPDFMessage=pageMargin + " " + yPos +" Td " ; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage= leadSize+" TL " ; ConvertToByteAndAddtoStream(strPDFMessage); //实体内容 strPDFMessage= "(http://www.wenhui.org)Tj " ; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage= "ET "; ConvertToByteAndAddtoStream(strPDFMessage); streamEnd=mPDF.Length; streamLen=streamEnd-streamStart; strPDFMessage= "endstream endobj "; ConvertToByteAndAddtoStream(strPDFMessage); //PDF文档的版本信息 xRefs.Add(mPDF.Length); strPDFMessage="2 0 obj "+ streamLen + " endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage="3 0 obj <> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage="4 0 obj <</Type /Pages /Count 1 "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="/Kids[ 3 0 R ] "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="/Resources<</ProcSet[/PDF/Text]/Font<> >> "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="/MediaBox [ 0 0 "+ pageWidth + " " + pageDepth + " ] >> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage="5 0 obj <> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); xRefs.Add(mPDF.Length); strPDFMessage="6 0 obj <> endobj "; ConvertToByteAndAddtoStream(strPDFMessage); streamStart=mPDF.Length; strPDFMessage="xref 0 7 0000000000 65535 f "; for(int i=0;i<xRefs.Count;i++) { strPDFMessage+=xRefFormatting((long) xRefs[i])+" 00000 n "; } ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="trailer <> "; ConvertToByteAndAddtoStream(strPDFMessage); strPDFMessage="startxref " + streamStart+" %%EOF "; ConvertToByteAndAddtoStream(strPDFMessage); mPDF.WriteTo(pPDF.BaseStream); mPDF.Close(); pPDF.Close(); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新鑫S

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值