一样,iTextSharp中列表同样分为有序列表和无序列表.下面我们来直接看如何生成列表的代码:
第一件事是创建一个List对象,并传入一个布尔类型的参数告诉List生成的是有序或无序列表.默认是False(也就是无序列表), 第二个参数(float类型)传入List的构造函数,用于将每一个列表项的缩进设置成10(也就是列表符号和列表项第一个字符的距离。).然后我通过SetListSymbol方法将列表项符号改成更传统的”.”,最后我将整个列表向右缩进30然后为List加入了5个项。第一个项是通过匿名函数传入String参数类型来创建ListItem并传入,从第二个开始,则是直接传入String类型的参数.最后是创建一个Paragraph对象和list对象共同传入document。
如果你使用有序列表并将罗马数字作为标识,你可以使用RomanList类。
List list = new List(List.UNORDERED, 10f);
list.SetListSymbol(“\u2022”);
list.IndentationLeft = 30f;
list.Add(new ListItem(“One”));
list.Add(“Two”);
list.Add(“Three”);
list.Add(“Four”);
list.Add(“Five”);
Paragraph para = new Paragraph();
para.Add(“Lists”);
document.Add(para);
document.Add(list);
5.向PDF里面添加图片。
Fimg为图片路径,创建一个iTextSharp.text.Image对象,将该对象添加到文档里面。SetAbsolutePosition方法是设置图片出现的位置。
在iTextSharp中使用Image.GetInstance()方法创建图片有很多种方式许最常用的方式是传文件的路径名:
string imgurl = @System.Web.HttpContext.Current.Server.MapPath(Fimg);
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(imgurl);
img.SetAbsolutePosition(0, 0);
writer.DirectContent.AddImage(img);
设置图片的属性和方法
Image jpg = Image.GetInstance(“Sunset.jpg”);
Paragraph paragraph = new Paragraph(@“Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse blandit blandit turpis. Nam in lectus ut dolor consectetuer bibendum. Morbi neque ipsum, laoreet id; dignissim et, viverra id, mauris. Nulla mauris elit, consectetuer sit amet, accumsan eget, congue ac, libero. Vivamus suscipit. Nunc dignissim consectetuer lectus. Fusce elit nisi; commodo non, facilisis quis, hendrerit eu, dolor? Suspendisse eleifend nisi ut magna. Phasellus id lectus! Vivamus laoreet enim et dolor. Integer arcu mauris, ultricies vel, porta quis, venenatis at, libero. Donec nibh est, adipiscing et, ullamcorper vitae, placerat at, diam. Integer ac turpis vel ligula rutrum auctor! Morbi egestas erat sit amet diam. Ut ut ipsum? Aliquam non sem. Nulla risus eros, mollis quis, blandit ut; luctus eget, urna. Vestibulum vestibulum dapibus erat. Proin egestas leo a metus?”);
paragraph.Alignment = Element.ALIGN_JUSTIFIED;
jpg.ScaleToFit(250f, 250f);
jpg.Alignment = Image.TEXTWRAP | Image.ALIGN_RIGHT;
jpg.IndentationLeft = 9f;
jpg.SpacingAfter = 9f;
jpg.BorderWidthTop = 36f;
jpg.BorderColorTop = BaseColor.WHITE;
jpg.Border = Rectangle.BOX;
jpg.BorderColor = BaseColor.YELLOW;
jpg.BorderWidth = 5f;
document.Add(jpg);
document.Add(paragraph);
6.向PDF里面添加表格,表格对象为PdfTable对象。
iTextSharp中表格元素的命名方式和HTML与CSS中非常类似。iTextSharp提供了多个类用于创建表格,为了不让读者产生混淆,这里我使用PdfPTable这个专门为在PDF中创建表格的类,下面代码展示了如何创建一个表格并将其加入PDF中:
PdfPTable table = new PdfPTable(3);//为pdfpTable的构造函数传入整数3,pdfpTable被初始化为一个三列的表格
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”);
document.Add(table);
为pdfpTabled添加单元格有多种方式,第一个单元格是通过PdfPCell对象添加进去的,PdfPCell的构造函数接受一个Phrase对象作为参数,然后将Cell的colspan设置为3,这样这个单元格占了整个一行.就像HTML中表格那样,单元格的水平对齐方式使用了三个值中的一个(译者:左对齐,居中,右对齐),这三个值我加在了注释中。后面的单元格我都通过AddCell方法加入,最后文档的效果如下:
下面的示例一开始被初始化为两列的表格,然后设置了表格的固定宽度,然后对每一列设置相对宽度为别为整个表格的三分之一和三分之二。如果你想将宽度设置为5分之一和是5分之四,只需要将参数分别改为1f和4f.如果你想设置每列的绝对宽度,只需要将列宽度和表格的总宽度传入
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;
该类的构造函数可以设置表格的列数,new float[] { 180, 140, 140, 160, 180, 140, 194 }里面是每列的宽度,也可在构造函数里面直接写列数如:new PdfPTable(3);
接下来需要将单元格扔到表格里面,单元格为PdfPCell对象,构造函数里面可以写入单元格要显示的文本信息,其中fontb为字体,如果是显示中文必须创建中文字体:
BaseFont bsFont = BaseFont.CreateFont(@System.Web.HttpContext.Current.Server.MapPath(“./upload/fonts/MSYH.TTC”) + “,0”, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font fontb = new Font(bsFont, Tab_Content_FontSize, Font.BOLD, new BaseColor(0xFF, 0xFF, 0xFF));
单元格创建出来扔到表格中排列方式类似与HTML里面的流式布局,没有行一说,所以造的单元格数量和列数相挂钩才能显示正确。
PdfPTable tablerow1 = new PdfPTable(new float[] { 180, 140, 140, 160, 180, 140, 194 });
tablerow1.TotalWidth = 1000; //表格宽度
tablerow1.LockedWidth = true;
//造单元格
PdfPCell cell11 = new PdfPCell(new Paragraph(“单元格内容”, fontb));
cell11.HorizontalAlignment = 1;
cell11.PaddingBottom = 10;
cell11.PaddingTop = 10;
cell11.BorderColor = borderColor;
cell11.SetLeading(1.2f, 1.2f);
tablerow1.AddCell(cell11);//将单元格添加到表格中
document.Add(tablerow1);//将表格添加到pdf文档中
单元格格式可以进行设置:
- HorizontalAlignment:代表单元格内文本的对齐方式
- PaddingBottom和PaddingTop:为单元格内间距(下,上)
- BorderColor:边框颜色
- SetLeading():该方法设置单元格内多行文本的行间距
PdfPTable table = new PdfPTable(3);
table.AddCell(“Cell 1”);
PdfPCell cell = new PdfPCell(new Phrase(“Cell 2”, FontFactory.GetFont(BaseFont.COURIER, 12f, Font.NORMAL, BaseColor.YELLOW)));
cell.BackgroundColor = new BaseColor(0, 150, 0);
cell.BorderColor = new BaseColor(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”);
document.Add(table);
7.图像和文本的绝对位置
将文本放到页面指定位置PdfContentByte。
PdfContent对象可以通过在使用Writer对象中使用getDirectContent()方法来得到该对象。
PdfContentByte cb = writer.DirectContent;
Phrase txt = new Phrase(“测试文本”, fontb);
ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT, txt, 425, 460, 0);
我们可以使用诸如moveTo和lineTo方法移动到页面上当前位置然后画一条直线到其他位置。例如
cb.LineWidth=10f;
cb.moveTo(100,700);
cb.lineTo(200,800);
cb.stroke();
8.创建新的页面
如果想要创建出新一页的话需要使用代码:
如果创建的新页面需要重新开始计算页数的话,在创建新页面之前:
document.ResetPageCount();
9.添加页眉页脚及水印
添加页眉页脚及水印,页脚需要显示页数,如果正常添加很简单,但需求里面要求有背景色,有水印,而且背景色在最底层,水印在上层,文字表格等在最上层,处理这个需求是整个iTextSharp最难的地方。
先分析一下,如果在创建Rectangle对象的时候添加背景色,那么接下来加水印有两种可选情况:
1.水印加在内容下面,可选,但水印会加到背景色的下面导致水印不显示。
2.水印加在内容上面,不可选,水印会覆盖最上层的文字,实现的效果不好。
为了解决这个问题,找到了iTextSharp提供的一个接口IPdfPageEvent及PdfPageEventHelper,该接口里面有一个方法可以实现,该方法为:OnEndPage当页面创建完成时触发执行。
那么就利用这个方法来实现:先添加背景色,再添加水印,添加在内容下方即可。
实现该方法需要一个类来实现接口:
public class IsHandF : PdfPageEventHelper, IPdfPageEvent
{
///
/// 创建页面完成时发生
///
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
//页眉页脚使用字体
BaseFont bsFont = BaseFont.CreateFont(@System.Web.HttpContext.Current.Server.MapPath(“./upload/fonts/MSYH.TTC”) + “,0”, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
iTextSharp.text.Font fontheader = new iTextSharp.text.Font(bsFont, 30, iTextSharp.text.Font.BOLD);
iTextSharp.text.Font fontfooter = new iTextSharp.text.Font(bsFont, 20, iTextSharp.text.Font.BOLD);
//水印文件地址
string syurl = “./upload/images/sys/black.png”;
//获取文件流
PdfContentByte cbs = writer.DirectContent;
cbs.SetCharacterSpacing(1.3f); //设置文字显示时的字间距
Phrase header = new Phrase(“页眉”, fontheader);
Phrase footer = new Phrase(writer.PageNumber.ToString(), fontfooter); //writer.PageNumber.ToString()为页码。
//页眉显示的位置
ColumnText.ShowTextAligned(cbs, Element.ALIGN_CENTER, header,
document.Right / 2, document.Top + 40, 0);
//页脚显示的位置
ColumnText.ShowTextAligned(cbs, Element.ALIGN_CENTER, footer,
document.Right / 2, document.Bottom - 40, 0);
//添加背景色及水印,在内容下方添加
PdfContentByte cba = writer.DirectContentUnder;
//背景色
Bitmap bmp = new Bitmap(1263, 893);
Graphics g = Graphics.FromImage(bmp);
Color c = Color.FromArgb(0x33ff33);
SolidBrush b = new SolidBrush©;//这里修改颜色
g.FillRectangle(b, 0, 0, 1263, 893);
System.Drawing.Image ig = bmp;
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(ig, new BaseColor(0xFF, 0xFF, 0xFF));
img.SetAbsolutePosition(0, 0);
cba.AddImage(img);
//水印
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(@System.Web.HttpContext.Current.Server.MapPath(syurl));
image.RotationDegrees = 30;//旋转角度
PdfGState gs = new PdfGState();
gs.FillOpacity = 0.1f;//透明度
cba.SetGState(gs);
int x = -1000;
for (int j = 0; j < 15; j++)
{
x = x + 180;
int a = x;
int y = -170;
for (int i = 0; i < 10; i++)
{
a = a + 180;
y = y + 180;
image.SetAbsolutePosition(a, y);
cba.AddImage(image);
}
}
}
}
该类创建完成后,在需要添加页眉页脚水印的页面代码位置添加如下代码,整个文档生成过程中添加一次即可,确保该事件可以触发,添加该代码后在剩余的页面都会触发生成页眉页脚:
writer.PageEvent = new IsHandF();