原文 【譯】在Asp.Net中操做PDF – iTextSharp - 使用表格html
使用Asp.Net生成PDF最經常使用的元素應該是表格,表格能夠幫助好比訂單或者發票類型的文檔更加格式化和美觀。本篇文章並不會深刻探討表格,僅僅是提供一個使用iTextSharp生成表格的方法介紹,本文須要閱讀我以前iTextSharp系列文章做爲基礎:web
在ASP.NET中建立PDF-iTextSharp起步數據庫
在Asp.Net中操做PDF - iTextSharp - 使用字體編程
在Asp.Net中操做PDF – iTextSharp -利用塊,短語,段落添加文本瀏覽器
在Asp.Net中操做PDF – iTextSharp-列表
在Asp.Net中操做PDF – iTextSharp - 使用連接和書籤函數
使用iTextSharp來操做表格是一件簡單的事,尤爲是iTextSharp中表格元素的命名方式和HTML與CSS中很是相似。iTextSharp提供了多個類用於建立表格,爲了避免讓讀者產生混淆,這裏我使用PdfPTable這個專門爲在PDF中建立表格的類,下面代碼展現瞭如何建立一個表格並將其加入PDF中:post
PdfPTable table = new PdfPTable(3); PdfPCell cell = new PdfPCell(new Phrase("Header spanning 3 columns")); cell.Colspan = 3; cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right table.AddCell(cell); table.AddCell("Col 1 Row 1"); table.AddCell("Col 2 Row 1"); table.AddCell("Col 3 Row 1"); table.AddCell("Col 1 Row 2"); table.AddCell("Col 2 Row 2"); table.AddCell("Col 3 Row 2"); doc.Add(table);
經過爲pdfpTable的構造函數傳入整數3,pdfpTable被初始化爲一個三列的表格.爲pdfpTabled添加單元格有多種方式,第一個單元格是經過PdfPCell對象添加進去的,PdfPCell的構造函數接受一個Phrase對象做爲參數,而後將Cell的colspan設置爲3,這樣這個單元格佔了整個一行.就像HTML中表格那樣,單元格的水平對齊方式使用了三個值中的一個(譯者:左對齊,居中,右對齊),這三個值我加在了註釋中。後面的單元格我都經過AddCell方法加入,最後文檔的效果以下:字體
下面代碼從數據庫抽取值,並將數據插入到iTextSharp生成的表格中,下面代碼還設置了一些表格的展示方式:url
PdfPTable table = new PdfPTable(2); //actual width of table in points table.TotalWidth = 216f; //fix the absolute width of the table table.LockedWidth = true; //relative col widths in proportions - 1/3 and 2/3 float[] widths = new float[] { 1f, 2f }; table.SetWidths(widths); table.HorizontalAlignment = 0; //leave a gap before and after the table table.SpacingBefore = 20f; table.SpacingAfter = 30f; PdfPCell cell = new PdfPCell(new Phrase("Products")); cell.Colspan = 2; cell.Border = 0; cell.HorizontalAlignment = 1; table.AddCell(cell); string connect = "Server=.\\SQLEXPRESS;Database=Northwind;Trusted_Connection=True;"; using (SqlConnection conn = new SqlConnection(connect)) { string query = "SELECT ProductID, ProductName FROM Products"; SqlCommand cmd = new SqlCommand(query, conn); try { conn.Open(); using (SqlDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { table.AddCell(rdr[0].ToString()); table.AddCell(rdr[1].ToString()); } } } catch(Exception ex) { Response.Write(ex.Message); } doc.Add(table); }
這個表格一開始被初始化爲兩列的表格,而後設置了表格的固定寬度,而後對每一列設置相對寬度爲別爲整個表格的三分之一和三分之二。若是你想將寬度設置爲5分之一和是5分之四,只須要將參數分別改成1f和4f.若是你想設置每列的絕對寬度,只須要將列寬度和表格的總寬度傳入,例如:spa
float[] widths = new float[] { 100f, 116f };
經過設置表格的SpacingBefore和SpacingAfter屬性,能夠分別設置表格頭部離上一個元素的距離以及表格結束離下一個元素的距離.在文檔中有幾個表格緊挨着時,這個功能尤爲有效。若是不設置上述屬性,那表格之間的距離就像在word中一個回車的距離同樣,那會和針同樣細。接下來咱們經過設置第一個單元格的邊框爲0,colspan爲列數,居中使其像表格的標題同樣。接下來就是咱們用編程的方式將從SqlDataReader讀取到的數據動態的添加到單元格中最後加入表格:
接下來的代碼展現了格式化單元格的一些選項,正如你所見,iTextSharp的做者遵循CSS的命名規則來設置單元格的選項使格式化單元格更加容易(固然,我假設你瞭解CSS。。。):
PdfPTable table = new PdfPTable(3); table.AddCell("Cell 1"); PdfPCell cell = new PdfPCell(new Phrase("Cell 2", new Font(Font.HELVETICA, 8f, Font.NORMAL, Color.YELLOW))); cell.BackgroundColor = new Color(0, 150, 0); cell.BorderColor = new Color(255,242,0); cell.Border = Rectangle.BOTTOM_BORDER | Rectangle.TOP_BORDER; cell.BorderWidthBottom = 3f; cell.BorderWidthTop = 3f; cell.PaddingBottom = 10f; cell.PaddingLeft = 20f; cell.PaddingTop = 4f; table.AddCell(cell); table.AddCell("Cell 3"); doc.Add(table);
上面代碼中不難看出,經過設置colspan來讓一個單元格在水平上跨多行十分容易。那若是是在垂直上使單元格跨越多行呢?在HTML中,你可使用Rowspan屬性,可是在iTextSharp中並無Rowspan屬性。因此達到這個目的的方法只有嵌套表格。下面代碼建立了一個四列的表格,右下的表格橫跨三列,豎跨三行。固然,這是表面看起來這樣,但其實是經過在表格左下角的單元格中嵌套一個三行一列的子表格,咱們將左下角嵌套子表格的單元格的padding所有設置爲0使被嵌入的子表格佔據了整個左下單元格:
PdfPTable table = new PdfPTable(4); table.TotalWidth = 400f; table.LockedWidth = true; PdfPCell header = new PdfPCell(new Phrase("Header")); header.Colspan = 4; table.AddCell(header); table.AddCell("Cell 1"); table.AddCell("Cell 2"); table.AddCell("Cell 3"); table.AddCell("Cell 4"); PdfPTable nested = new PdfPTable(1); nested.AddCell("Nested Row 1"); nested.AddCell("Nested Row 2"); nested.AddCell("Nested Row 3"); PdfPCell nesthousing = new PdfPCell(nested); nesthousing.Padding = 0f; table.AddCell(nesthousing); PdfPCell bottom = new PdfPCell(new Phrase("bottom")); bottom.Colspan = 3; table.AddCell(bottom); doc.Add(table);
最後,在這篇闡述使用表格的文章末尾,咱們來看看如何將一個單元格中的文本進行旋轉:
PdfPTable table = new PdfPTable(3); table.TotalWidth = 144f; table.LockedWidth = true; table.HorizontalAlignment = 0; PdfPCell left = new PdfPCell(new Paragraph("Rotated")); left.Rotation = 90; table.AddCell(left); PdfPCell middle = new PdfPCell(new Paragraph("Rotated")); middle.Rotation = -90; table.AddCell(middle); table.AddCell("Not Rotated"); doc.Add(table);
Rotation屬性必須設置成90的倍數,不然就會引起錯誤,middle單元格的Rotation在這裏設置成-90和270效果同樣,這個度數默認是按逆時針算的:
實際上iTextSharp能夠操做表格的功能很是強大,在將來的文章中我會更加詳細的闡述。於此同時,你們可使用Visual Studio的智能感知和對象瀏覽器充分挖掘iTextSharp的潛力,並看看最終生成的結果如何.
--------------------------------
原文連接:iTextSharp-Introducing-Tables
translated by CareySon