彩票走势图

VintaSoft Imaging .NET使用教程:创建 PDF 发票生成器

原创|使用教程|编辑:张莹心|2021-10-27 09:54:49.550|阅读 317 次

概述:自 VintaSoft Imaging .NET SDK 10.1 版以来,可以以编程方式编辑现有的 DOCX 和 XLSX 文档。本文使用此功能创建一个简单且易于定制的 PDF 文档格式发票生成器。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>


VintaSoftImaging.NET SDK是一个为.NET开发人员开发的,强大而易于使用的图像工具包。它可以让你加载、查看、处理、打印和保存数字图像,可将它们转换为不同的图像格式,可用多种TIFF和动态GIF文件提高您的工作效率。

【VintaSoftImaging.NET SDK下载】

PDF 文档是矢量文档,不具备内容排版功能。可以编写编程代码,使用矢量图形在 PDF 页面上绘制文档标记,但代码会很复杂,而且其开发可能需要很长时间。 经常出现以 PDF 文档格式创建发票的任务。通常代表发票的文档包含一个复杂的布局:带有徽标和公司信息的标题、有关卖方和买方的信息、包含订购项目的表格、包含附加信息的页脚。

一个复杂的任务可以通过分为 2 个部分来简化:

  1.  在文本编辑器中创建一个文档模板。
  2.  编写用动态数据填充模板的编程代码。
DOCX 文档以标记的形式存储内容,因此 DOCX 文档可用于为任何复杂性的发票创建模板。自 VintaSoft Imaging .NET SDK 10.1 版以来,可以以编程方式编辑现有的 DOCX 和 XLSX 文档。可以使用此功能创建一个简单且易于定制的 PDF 文档格式发票生成器。

发票生成器应包含两个主要部分:

  1. 包含发票静态标记的 DOCX 文档格式的发票模板,
  2. 将动态数据填入发票模板并将发票保存为PDF文档的应用程序代码。
基于DOCX文档模板创建发票生成器的优点是:
  1. 更改发票静态标记的简单性,为此,使用 MS Word 更改模板就足够了
  2. 应用程序代码的简单性,因为应用程序只填写数据
必须执行以下步骤来创建发票生成器,该生成器生成 PDF 文档格式的发票:
  1. 使用 MS Word 创建发票模板 Invoice_template.docx,其中将包含发票的所有静态标记。
  2. 在应用程序中使用DocxDocumentEditor类实现用动态数据填写发票。
以下代码显示了如何创建发票并将其保存为 PDF 文档:
// 使用此代码的项目必须引用以下程序集:
// - Vintasoft.Imaging 
// - Vintasoft.Imaging.Office.OpenXml 
// - Vintasoft.Imaging.Pdf 
// - Vintasoft.Barcode

/// <summary> 
/// 生成发票,基于DOCX文档模板。
/// </summary> 
public  static  void GenerateInvoiceUseDocxTemplate()
{
    //创建DOCX文档编辑器和使用文件“Invoice_template.docx”作为文档模板
    使用(Vintasoft.Imaging.Office.OpenXml.Editor。DocxDocumentEditor编辑器=
        新Vintasoft.Imaging.Office.OpenXml.Editor。DocxDocumentEditor(“Invoice_template.docx” ))
    {
        // 生成 30 个项目的测试发票数据
        InvoiceData testData = GetTestData(30);

        // 填写发票数据
        FillInvoiceData(editor, testData);

        // 如有必要,将发票保存到 DOCX 文档
        //editor.Save("Invoice.docx");

        // 将发票导出到 PDF 文档
        editor.Export( "Invoice_docx.pdf" );
    }
}

/// <summary> 
/// 使用 DOCX 文档编辑器填写发票数据。
/// </summary> 
/// <param name="documentEditor">DOCX 文档编辑器。</param> 
/// <param name="invoiceData">发票数据。</param> 
private  static  void FillInvoiceData (
    Vintasoft.Imaging.Office.OpenXml.Editor。DocxDocumentEditor文档编辑器,
    发票数据发票数据)
{
    //
    使用( Vintasoft.Imaging.VintasoftImage qrCodeImage = invoiceData.GetBarcodeImage(200))创建 200x200 像素的二维码图像
    {
        // 将条码图像设置为索引 1 处的图像元素
        documentEditor.Images[1].SetImage(qrCodeImage);
    }

    // 填充文档头
    documentEditor.Body[ "[company_name]" ] = invoiceData.Company.CompanyName;
    documentEditor.Body[ "[company_address]" ] = invoiceData.Company.Address;
    documentEditor.Body[ "[company_city]" ] = invoiceData.Company.City;
    documentEditor.Body[ "[company_phone]" ] = invoiceData.Company.GetPhones();
    documentEditor.Body[ "[invoice_number]" ] = invoiceData.InvoiceNumber;
    documentEditor.Body[ "[invoice_date]" ] = System. 日期时间.Now.ToShortDateString();

    // 获取文档
    Vintasoft.Imaging.Office.OpenXml.Editor 的所有表格。OpenXmlDocumentTable [] 表格 = documentEditor.Tables;

    // 填充“客户信息”表
    Vintasoft.Imaging.Office.OpenXml.Editor. OpenXmlDocumentTable customerInformationTable = tables[0];
    SetCompanyInformation(customerInformationTable, "billing" , invoiceData.BillingAddress);
    SetCompanyInformation(customerInformationTable, "shipping" , invoiceData.ShippingAddress);

    // 填充“运输方式”表
    Vintasoft.Imaging.Office.OpenXml.Editor. OpenXmlDocumentTable shippingMethodTable = tables[1];
    ShippingMethodTable[ "[shipping_method]" ] = invoiceData.ShippingMethod;

    // 填充“订单信息”表
    Vintasoft.Imaging.Office.OpenXml.Editor. OpenXmlDocumentTable orderInformationTable = 表格[2];
    Vintasoft.Imaging.Office.OpenXml.Editor。OpenXmlDocumentTableRow templateRow = orderInformationTable[1];
    int orderItemNumber = 1;
    //对于invoice 
    foreach中的每个项目(invoiceItem orderItem in invoiceData.OrderItems)
    {
        // 复制模板行并在模板行后插入副本
        Vintasoft.Imaging.Office.OpenXml.Editor. OpenXmlDocumentTableRow currentRow = templateRow;
        templateRow =(Vintasoft.Imaging.Office.OpenXml.Editor。OpenXmlDocumentTableRow)templateRow.InsertCopyAfterSelf();

        // 填充当前行的数据
        currentRow[ "[p_n]" ] = orderItemNumber.ToString();
        currentRow[ "[p_description]" ] = orderItem.Product;
        currentRow[ "[p_qty]" ] = orderItem.Quantity.ToString();
        currentRow[ "[p_unit_price]" ] = invoiceData.GetPriceAsString(orderItem.Price);
        currentRow[ "[p_price_total]" ] = invoiceData.GetPriceAsString(orderItem.TotalPrice);

        orderItemNumber++;
    }
    // 删除模板行
    templateRow.Remove();

    // 填写订单信息汇总字段
    orderInformationTable[ "[subtotal]" ] = invoiceData.GetPriceAsString(invoiceData.Subtotal);
    orderInformationTable[ "[tax]" ] = invoiceData.GetPriceAsString(invoiceData.Tax);
    orderInformationTable[ "[shipping]" ] = invoiceData.GetPriceAsString(invoiceData.Shipping);
    orderInformationTable[ "[grand_total]" ] = invoiceData.GetPriceAsString(invoiceData.GrandTotal);

    // 填充“Notes”表
    Vintasoft.Imaging.Office.OpenXml.Editor. OpenXmlDocumentTable notesTable = 表格[3];
    notesTable[ “[日期]” ] = System. 日期时间.Now.ToShortDateString();
    notesTable[ “[时间]” ] = System. 日期时间.Now.ToLongTimeString();
}

/// <summary> 
/// 设置公司信息。
/// </summary> 
/// <param name="table">表格。</param> 
/// <param name="fieldName">字段名称。</param> 
/// <param name="company">公司。</param> 
private  static  void SetCompanyInformation(
    Vintasoft.Imaging.Office.OpenXml.Editor。OpenXmlDocumentTable表,字符串字段名称 
    ,
    公司公司)
{
    串fieldFormat =串.Format(“[{0} _ {1}]”,fieldName的,“{0}”);
    table[ string .Format(fieldFormat, "company" )] = company.CompanyName;
    table[ string .Format(fieldFormat, "name" )] = company.Name;
    table[ string .Format(fieldFormat, "address" )] = company.Address;
    table[ string .Format(fieldFormat, "phone" )] = company.GetPhones();
    table[ string .Format(fieldFormat, "city" )] = company.City;
}
以下代码为发票生成器创建测试数据:
/// <summary> 
/// 返回发票测试数据。
/// </summary> 
/// <returns>发票测试数据。</returns> 
public  static InvoiceData GetTestData( int orderItemsCount)
{
    公司 vintasoftCompany = new Company();
    vintasoftCompany.CompanyName = "VintaSoft Ltd." ;
    vintasoftCompany.Address = "M.Nagibina Ave. 33a/47" ;
    vintasoftCompany.City = "Rostov-on-Don, 344068, Russia" ;
    vintasoftCompany.Phones.Add( "+78632924297" );
    vintasoftCompany.Phones.Add( "+78632924322 (传真)" );

    公司 billingCompany = new Company();
    billingCompany.CompanyName = "Billing Global Company Inc." ;
    billingCompany.Name = "Q 先生" ;
    billingCompany.Address = " Address1 " ;
    billingCompany.City = "City1" ;
    billingCompany.Phones.Add( "9876543210" );
    billingCompany.Phones.Add( "7654321098 (传真)" );

    公司shipingCompany = new Company();
    shipingCompany.CompanyName = "Shipping Global Company Inc." ;
    shipingCompany.Name = "Z 先生" ;
    shipingCompany.Address = " Address2 " ;
    shipingCompany.City = "City2" ;
    shipingCompany.Phones.Add( " 1122334455 " );
    shipingCompany.Phones.Add( "5544332211 (传真)" );

    发票数据数据 =新发票数据();

    系统。随机随机=新系统。随机();
    data.InvoiceNumber = string .Format ( "{0}-{1}" , random.Next(100000, 999999), random.Next(0, 9));

    data.Company = vintasoftCompany;
    data.BillingAddress = billingCompany;
    data.ShippingAddress = shipingCompany;

    InvoiceItem[] availableProducts = new InvoiceItem[] {
         new InvoiceItem( "VintaSoft Imaging .NET SDK, Site license for Desktop PCs" , 659.95f),
         new InvoiceItem( "VintaSoft Annotation .NET Plug-in, Site license for Desktop PCs" , 449.95f),
         new InvoiceItem( "VintaSoft Office .NET Plug-in, Site license for Desktop PCs" , 569.95f),
         new InvoiceItem( "VintaSoft PDF .NET Plug-in (Reader+Writer), Site license for Desktop PCs" , 1499.95f),
         new InvoiceItem( "VintaSoft PDF .NET Plug-in (Reader+Writer+VisualEditor),台式电脑的站点许可”, 2999.95f),
         new InvoiceItem( "VintaSoft JBIG2 .NET Plug-in, Site license for Desktop PCs" , 1139.95f),
         new InvoiceItem( "VintaSoft JPEG2000 .NET Plug-in, Site license for Desktop PCs" , 689.95f) ,
         new InvoiceItem( "VintaSoft Document Cleaup .NET Plug-in, Site license for Desktop PCs" , 569.95f),
         new InvoiceItem( "VintaSoft OCR .NET Plug-in, Site license for Desktop PCs" , 509.95f),
         new InvoiceItem (“VintaSoft DICOM .NET 插件(编解码器+MPR),台式电脑的站点许可”,1199.95f),
        新的InvoiceItem(“VintaSoft 表单处理 .NET 插件,台式机站点许可”,509.95f),
        新的InvoiceItem(“VintaSoft Barcode .NET SDK(1D+2D 读写器),台式机站点许可”,1379.95f),
         new InvoiceItem(“VintaSoft Twain .NET SDK,站点许可”,539.95f)
    };

    for ( int i = 0; i < orderItemsCount; i++)
    {
        int数量 = 1 + random.Next(10);
        int index = random.Next(availableProducts.Length - 1);
        data.OrderItems.Add( new InvoiceItem(availableProducts[index],quantity));
    }

    返回数据;
}

/// <summary> 
/// 表示公司信息。
/// </summary>
公共 类公司
{

    /// <summary> 
    /// 公司名称。
    /// </summary>
    公共 字符串CompanyName;

    /// <summary> 
    /// 人名。
    /// </summary>
    公共 字符串名称;

    /// <summary> 
    /// 公司所在地城市。
    /// </summary>
    公共 字符串城市;

    /// <summary> 
    /// 公司地址。
    /// </summary>
    公共 字符串地址;

    /// <summary> 
    /// 公司电话号码。
    /// </summary>
    公共System.Collections.Generic。List < string > Phones = new System.Collections.Generic。列表<字符串>();



    /// <summary> 
    /// 返回电话号码。
    /// </summary>
    公共 字符串GetPhones()
    {
        if (Phones.Count == 1)
            返回Phones[0];
        系统.文本。StringBuilder结果 =新System.Text。字符串生成器();
        for ( int i = 0; i < Phones.Count - 1; i++)
        {
            result.Append(电话[i]);
            result.Append( ", " );
        }
        result.Append(Phones[Phones.Count - 1]);
        返回结果.ToString();
    }

}

/// <summary> 
/// 代表发票订单项。
/// </summary>
公共 类InvoiceItem
{

    /// <summary> 
    /// 初始化 <see cref="InvoiceItem"/> 类的新实例。
    /// </summary> 
    /// <param name="product">产品名称。</param> 
    /// <param name="price">产品价格。</param> 
    public InvoiceItem( string product ,浮动价格)
    {
        产品 = 产品;
        数量 = 1;
        价格 = 价格;
    }

    /// <summary> 
    /// 初始化 <see cref="InvoiceItem"/> 类的新实例。
    /// </summary> 
    /// <param name="source">来源<see cref="InvoiceItem"/>。</param> 
    /// <param name="quantity">产品数量。< /param> 
    public InvoiceItem(InvoiceItem 来源,浮动数量)
    {
        产品 = 来源.产品;
        价格 = 来源。价格;
        数量 = 数量;
    }



    /// <summary> 
    /// 产品名称。
    /// </summary>
    公共 字符串产品;

    /// <summary> 
    /// 产品数量。
    /// </summary>
    公众 持股量;

    /// <summary> 
    /// 产品价格。
    /// </summary>
    公开 浮动价格;



    /// <summary> 
    /// 获取产品总价。
    /// </summary>
    公开 浮动总价
    {
        得到
        {
            退货价格 * 数量;
        }
    }

}

/// <summary> 
/// 表示发票数据。
/// </summary>
公共 类InvoiceData
{

    /// <summary> 
    /// 订单商品列表。
    /// </summary>
    公共System.Collections.Generic。List <InvoiceItem> OrderItems = new System.Collections.Generic。列表<InvoiceItem>();

    /// <summary> 
    /// 发票编号。
    /// </summary>
    公共 字符串InvoiceNumber;

    /// <summary> 
    /// 运送方式。
    /// </summary> 
    public  string ShippingMethod = "Email" ;

    /// <summary> 
    /// 公司账单地址。
    /// </summary> 
    public Company BillingAddress = new Company();

    /// <summary> 
    /// 公司送货地址。
    /// </summary> 
    public Company ShippingAddress = new Company();

    /// <summary> 
    /// 表示公司信息的对象。
    /// </summary> 
    public Company Company = new Company();

    /// <summary> 
    /// 发票中使用的货币。
    /// </summary> 
    public  string Currency = "EUR" ;

    /// <summary> 
    /// 获取或设置税值。
    /// </summary>
    公共 浮动税 = 0;

    /// <summary> 
    /// 获取或设置运费。
    /// </summary> 
    public  float Shipping = 0;



    /// <summary> 
    /// 获取小计值。
    /// </summary>
    公共 浮动小计
    {
        得到
        {
            浮点值 = 0;
            for ( int i = 0; i < OrderItems.Count; i++)
                value += OrderItems[i].TotalPrice;
            返回值;
        }
    }


    /// <summary> 
    /// 获取总计值。
    /// </summary>
    公众 持股量GrandTotal
    {
        得到
        {
            返回小计+运费+税金;
        }
    }



    /// <summary> 
    /// 以字符串形式返回价格。
    /// </summary> 
    /// <param name="price">价格。</param> 
    /// <returns>字符串表示的价格。</returns> 
    public  string GetPriceAsString( float price)
    {
        return  string .Format( "{0} {1}" , price.ToString( "f2" , System.Globalization. CultureInfo .InvariantCulture), Currency);
    }

    /// <summary> 
    /// 创建二维码图像。
    /// </summary> 
    /// <param name="size">条形码大小。</param> 
    /// <returns><see cref="Vintasoft.Imaging.VintasoftImage"/> 类的一个实例包含二维码图像。</returns> 
    public Vintasoft.Imaging。VintasoftImage GetBarcodeImage( int size)
    {
        Vintasoft.Barcode.BarcodeWriter writer = new Vintasoft.Barcode.BarcodeWriter();

        writer.Settings.Barcode = Vintasoft.Barcode.BarcodeType.QR;

        writer.Settings.Value = string .Format ( "INVOICE={0};TOTAL={1}" , InvoiceNumber, GetPriceAsString(GrandTotal));

        writer.Settings.SetWidth(size);

        Vintasoft.Imaging。VintasoftImage结果 = 
            新的Vintasoft.Imaging。VintasoftImage (writer.GetBarcodeAsBitmap(), true );
        result.Crop(新。System.Drawing中矩形(0,0,result.Width,result.Width));

        返回结果;
    }
}

购买最新正版授权!""

慧都年终盛典火爆开启,一年仅一次的最强促销,十八周年盛“惠”不容错过!!优惠详情点击查看>>


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP