原創|使用教程|編輯:張瑩心|2021-10-27 09:54:49.550|閱讀 395 次
概述:自 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@fc6vip.cn