原創|使用教程|編輯:張瑩心|2021-10-27 09:54:49.550|閱讀 410 次
概述:自 VintaSoft Imaging .NET SDK 10.1 版以來,可以以編程方式編輯現有的 DOCX 和 XLSX 文檔。本文使用此功能創建一個簡單且易于定制的 PDF 文檔格式發票生成器。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
VintaSoftImaging.NET SDK是一個為.NET開發人員開發的,強大而易于使用的圖像工具包。它可以讓你加載、查看、處理、打印和保存數字圖像,可將它們轉換為不同的圖像格式,可用多種TIFF和動態GIF文件提高您的工作效率。
PDF 文檔是矢量文檔,不具備內容排版功能。可以編寫編程代碼,使用矢量圖形在 PDF 頁面上繪制文檔標記,但代碼會很復雜,而且其開發可能需要很長時間。 經常出現以 PDF 文檔格式創建發票的任務。通常代表發票的文檔包含一個復雜的布局:帶有徽標和公司信息的標題、有關賣方和買方的信息、包含訂購項目的表格、包含附加信息的頁腳。
一個復雜的任務可以通過分為 2 個部分來簡化:
發票生成器應包含兩個主要部分:
// 使用此代碼的項目必須引用以下程序集:
// - 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@ke049m.cn