开发者社区> 范大脚脚> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【译】在Asp.Net中操作PDF – iTextSharp - 使用表格

简介:
+关注继续查看
  使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观。本篇文章并不会深入探讨表格,仅仅是提供一个使用iTextSharp生成表格的方法介绍,本文需要阅读我之前iTextSharp系列文章作为基础:

 

    在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中:

 

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方法加入,最后文档的效果如下:

    1

     

    下面代码从数据库抽取值,并将数据插入到iTextSharp生成的表格中,下面代码还设置了一些表格的展现方式:

 

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.如果你想设置每列的绝对宽度,只需要将列宽度和表格的总宽度传入,例如:

float[] widths = new float[] { 100f, 116f };
 

   通过设置表格的SpacingBefore和SpacingAfter属性,可以分别设置表格头部离上一个元素的距离以及表格结束离下一个元素的距离.在文档中有几个表格紧挨着时,这个功能尤其有效。如果不设置上述属性,那表格之间的距离就像在word中一个回车的距离一样,那会和针一样细。接下来我们通过设置第一个单元格的边框为0,colspan为列数,居中使其像表格的标题一样。接下来就是我们用编程的方式将从SqlDataReader读取到的数据动态的添加到单元格中最后加入表格:

     2

 

   接下来的代码展示了格式化单元格的一些选项,正如你所见,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);
 

3

   上面代码中不难看出,通过设置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);
 

    4   

    最后,在这篇阐述使用表格的文章末尾,我们来看看如何将一个单元格中的文本进行旋转:

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效果一样,这个度数默认是按逆时针算的:

  

    5

 

   实际上iTextSharp可以操作表格的功能非常强大,在未来的文章中我会更加详细的阐述。于此同时,大家可以使用Visual Studio的智能感知和对象浏览器充分挖掘iTextSharp的潜力,并看看最终生成的结果如何.

 

--------------------------------

原文链接:iTextSharp-Introducing-Tables

translated by CareySon

标签: iTextSharp, Pdf, Asp.net创建PDF




本文转自CareySon博客园博客,原文链接:http://www.cnblogs.com/CareySon/archive/2011/11/05/2237116.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【译】在Asp.Net中操作PDF – iTextSharp - 使用表格
原文 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格   使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观。本篇文章并不会深入探讨表格,仅仅是提供一个使用iTextSharp生成表格的方法介绍,本文需要阅读我之前iTextSharp系列文章作为基础:       在ASP.
1127 0
跟我一起学习ASP.NET 4.5 MVC4.0(一)
原文 : http://www.cnblogs.com/xdotnet/archive/2012/03/05/aspnet_mvc40_preview.html   由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最近想给团队成员做一个系统的解说,让大家都可以学习一 下ASP.NET MVC3.0。
1076 0
跟我一起学习ASP.NET 4.5 MVC4.0(五)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/29/aspnet_mvc4_html_control_checkboxlist.html 前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装。
884 0
跟我一起学习ASP.NET 4.5 MVC4.0(四)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/27/aspnet_mvc4_authorize.html 前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是 权限验证,即AuthorizeAttribute。
850 0
跟我一起学习ASP.NET 4.5 MVC4.0(六)
原文http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 这一系列文章跨度有点大,由于最近忙于其他事情,没有更新,今天重新安装了下Win8系 统,VS2012和SQLServer 2012,顺便抽空继续一篇。
968 0
跟我一起学习ASP.NET 4.5 MVC4.0(三)
原文 http://www.cnblogs.com/xdotnet/archive/2012/03/07/aspnet_mvc40_validate.html 今天我们继续ASP.NET 4.5 MVC 4.0,前两天熟悉了MVC4.0在VS11和win8下的更新,以及MVC中的基础语法和几个关键字的使用。
920 0
跟我一起学习ASP.NET 4.5 MVC4.0(二)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/06/aspnet_mvc40_keywords.html 上一篇文章中(跟我一起学习ASP.NET 4.5 MVC4.0(一)) 我们基础的了解了一下ASP.NET MVC4.0的一些比较简单的改变,主要是想对于MVC3.0来说的。
961 0
+关注
3656
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载