【译】在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=Righttable.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 pointstable.TotalWidth = 216f;//fix the absolute width of the tabletable.LockedWidth = true;//relative col widths in proportions - 1/3 and 2/3float[] widths = new float[] { 1f, 2f };table.SetWidths(widths);table.HorizontalAlignment = 0;//leave a gap before and after the tabletable.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

转载于:https://www.cnblogs.com/CareySon/archive/2011/11/05/2237116.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux docker导入镜像,Docker镜像的导入和导出

相关阅读:场景描述:需要在客户现场快速部署应用,东西多,时间短场景分析:为了节省时间,使用docker进行快速部署,由于不是内部环境,无法使用内部私有库,于是构建镜像&#…

有些图,只要看错一眼就再也回不去了!

全世界只有3.14 % 的人关注了爆炸吧知识平时在网络上逛,你会发现有种图片,一旦看茬,就再也回不去了!今天就来集体复习一下:首先是这张著名的图,很可爱的小盆友但如果告诉你:那两个大黑点是鼻孔&…

2015年网页设计最佳颜色搭配的9种选择

2019独角兽企业重金招聘Python工程师标准>>> 2015年网页设计最佳颜色搭配的9种选择 还在为你的网站选用哪种色调发愁,难易选择吗?本篇为你总结了2015年国外网友设计最佳颜色搭配的9个方案,供你参考... 详细解读 和小伙伴们一起来吐…

CryEngine

最近CryEngine3已经发布了(实际上已经到3.1了),看到很多朋友都想要拿到最新的版本,在这里附上具体的申请方法。楼主看到了,麻烦看看能不能置个顶。 CryEngine对于教育机构是有免费授权的。实际上授权也十分宽松&#x…

EF Core的一个紧急bug,我这样修改

1背景今日在生产环境碰到如下错误ASP.NET MVC项目 Repository层中,Delete总是失败another entity of the same type already has the same primary key value具体错误提示:Attaching an entity of type ResearchManager.Models.BigTracker_UI.Product_Tr…

电脑home键在哪_如何灵活使用电脑键盘上的各个键

电脑上的键有很多但是你真的了解它们的用法么,今天笔者给大家分享一下电脑键盘上各个键的作用。区域一:共有13个按键,ESC,F1-F2。F1:帮助信息。F2:选定一个文件或文件夹。按下F2可以重命名。F3:…

svn强制注释 linux,svn强制要求提交注释

看了N多资料,不知道为什么我总是不成功。现在终于测试成功了,下面是实际操作过程~~使用bitnami一键安装了subversion,在使用中,希望开发人员提交时必须输入日志内容,可通过以下方法实现。首先转到相应的库的hook目录中…

jquery easyui datagrid getSelections用法

1.datagrid、 数据绑定 $(#tt).datagrid({ url: GetDataJosn, title: DataGrid, width: 800, height: 300, pageSize: 10, idField: productid, fitColumns: true,…

XCode5 真机调试及发布应用

一、XCODE 真机测试 Xcode5已经很智能,只需生成一个开发证书,安装后,插入设备会自动添加,注意,当Mac系统升级后,证书需要重新生成。证书生成步骤:1、生成 CertificateSigningRequest.certSignin…

身家4400亿美元的他,吃低于3美元的早餐,和2个老婆同居28年!

全世界只有3.14 % 的人关注了爆炸吧知识1930年8月30日,巴菲特出生在美国内布拉斯加州的奥马哈市。当时的美国还笼罩在经济大萧条的阴影中,还好父亲是位出色的股票掮客,这也让小巴菲特的童年过得顺顺利利。但小巴同学从小就不合群,…

怎么才能把项目做烂?!

上一篇聊聊《为什么被用户牵着鼻子走?刚参加工作做项目常说的一句话:没有困难,制造困难也得上。到不是真闲得蛋疼制造困难,而是表达解决困难的决心。2009年在某煤炭集团做了一个动态监测煤质煤量的实时系统,当时一般为…

电脑重新分区扩大c盘_两种方法,给电脑C盘增加10G的容量,电脑焕然一新

在我们日常的生活工作中,手机电脑已经成为了不可或缺的存在。然而当我们的手机电脑经过长年累月的使用之后,手机电脑都会变得很卡,在电脑上最直观的显示就是电脑C盘分区显示为红色,可用空间已经不够用了。我们知道,电脑…

python wx提示框字体_使用wxStyledTextCtrl实现代码提示

wxStyledTextCtrl是wxPython对流行的Scintilla的包装,Scintilla的网站(http://www.scintilla.org/),wxStyledTextCtrl是一个功能强大的富文本编辑控件,常见的编辑器功能都能找到,包括代码高亮,搜索替换,拷贝…

PHP5中PDO的简单使用

PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 6都要出来的时候,PHP 6只默认使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的php_mysql.dll之类的了,那怎么办捏,我们…

redis在linux搭建集群,Linux/Centos 7 redis4 集群搭建

背景说明:项目初期使用AWS的ElastiCache Redis作为系统的数据缓存,近期由于数据量和QPS加大,导致Redis存在压力,进行了两次的单点垂直升级,缓解了目前的压力。项目组进行了数据和费用的评估,考虑到日后升级…

远程控制

我和舍友共用ADSL,我的电脑接在宽带路由器上面。为了能远程控制家里的电脑,我是煞费苦心,最后终于OK了,把一些经验心得写出来。 首先想要远程登录的机器最好是WinXP或者Win2003(据说Win2003更好一些,可以多用户同时登…

防SQL注入的最好实现方式是什么?

咨询区 LeonidasFett:我的问题是:如何在 C# 中是使用SQL防注入,我的模糊理解是可以通过限定应用程序接收的字段格式来实现最终目的,比如说:email字段只能接收email的格式,name字段不能输入特殊字符&#xf…

微软职位内部推荐-Senior SW Engineer for Application Ecosystem

微软近期Open的职位:Job posting title: Senior Development EngineerLocation: China, BeijingDivision: Operations System Group Engineering&nbsp Group OverviewOSG is delivering flagship products in Microsoft. China is a second largest economy in the world. …

数学除了摧残祖国的花朵外,竟然还可以赢钱!

全世界只有3.14 % 的人关注了爆炸吧知识端午节假期结束了,知识君又可以开心地回到工作岗位上了。我热爱学习,也热爱工作。这两天,知识君又听到了“哼,数学除了摧残我们这些祖国的花朵之外,然而并没有什么卵用。”知识君…

rocketmq 顺序消费_10 分钟看懂消息队列 RocketMQ

RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和…