一步一步 IText.Sharp Chunk Phrase Paragraph List使用

上面两篇介绍了PDF文档的创建和中文支持设置方法,下面对文档经常使用的对象时行介绍:

块(Chunk)、短句(Phrase)、段落(Paragraph)、列表(List)

文档中的对象UML图,如下:

image

一、块(Chunk)

块(Chunk)是能被添加到文档的文本的最小单位,块可以用于构建其他基础元素如短句、段落、锚点等,块是一个有确定字体的字符串,要添加块到文档中时,其他所有布局变量均要被定义。

它有字体、大小、颜色、粗体,背景色、下划线,删除线等属性。

示例代码:

   1: static  void RegisterFont()
   2:         {
   3:             BaseFont.AddToResourceSearch("iTextAsian.dll");
   4:             BaseFont.AddToResourceSearch("iTextAsianCmaps.dll");
   5:             FontFactory.Register(Environment.GetFolderPath(Environment.SpecialFolder.System) +
   6:                                  @"\..\Fonts\STSONG.ttf");
   7:             FontFactory.Register(Environment.GetFolderPath(Environment.SpecialFolder.System) +
   8:                                  @"\..\Fonts\simhei.ttf");
   9:             FontFactory.Register(Environment.GetFolderPath(Environment.SpecialFolder.System) +
  10:                                  @"\..\Fonts\simsun.ttc");
  11:         }
  12:  
  13:         static void Main(string[] args)
  14:         {
  15:             RegisterFont();
  16:             Document document = new Document();
  17:             PdfWriter.GetInstance(document, new FileStream(string.Format("{0}helloworld.pdf",
  18:                 AppDomain.CurrentDomain.BaseDirectory), FileMode.OpenOrCreate))
  19:               .InitialLeading = 16;
  20:             document.Open();
  21:           
  22:             string[] contries = new string[]{"美国","英甲","中国","朝鲜","日本"};
  23:             for (int index = 1; index <= contries.Length;index++ )
  24:             {
  25:                 var contry = contries[index-1];
  26:                 document.Add(new Chunk(contry,FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 16)));
  27:                 document.Add(new Chunk(" "));
  28:                 Font font = new Font(
  29:                   Font.FontFamily.HELVETICA, 6, Font.BOLD, BaseColor.WHITE);
  30:                 Chunk id = new Chunk(index.ToString(), font);
  31:                 id.SetBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f);
  32:                 id.SetTextRise(6);
  33:                 document.Add(id);
  34:                 document.Add(Chunk.NEWLINE);
  35:             }
  36:            
  37:             document.Close();
  38:         }

执行结果如下:

image

在上面的代码中,使用设置行距和使用一个特殊的块:Chunk.NEWLINE

作为示例,可以不设置行距或设置为0,当为零时,多行就会显示到一行上面(重叠)

image

当设置为0 时,根本就看不清楚。

在创建对象时,如果没有指定字体及其大小,默认情况下是Helvetica,12pt,并且这个设置是没有办法修改的。只有在创建对象时显示指定字体。

SetBackground用于设置块的背景色,SetTextRise是设置上标,其中参数表示,离开基线的距离,如果设置负数就表示设置下标。

二、语句(Phrase)

短句(Phrase)是一系列以特定间距(两行之间的距离)作为参数的块,一个短句有一个主字体,但短句中的一些块具有不同于主字体的字体,你有更多的选择去创建短句。

简单来说,就是由多个同一行间距块组成。

演示代码,如下:

   1: static void Main(string[] args)
   2:         {
   3:             RegisterFont();
   4:             BOLD_UNDERLINED = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12, Font.BOLD | Font.UNDERLINE);
   5:             NORMAL = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12);
   6:             Document document = new Document();
   7:             PdfWriter.GetInstance(document, new FileStream(string.Format("{0}helloworld.pdf",
   8:                 AppDomain.CurrentDomain.BaseDirectory), FileMode.OpenOrCreate))
   9:               .InitialLeading = 30;
  10:             document.Open();
  11:  
  12:             string[] contries = new string[] { "美国", "英甲", "中国", "朝鲜", "日本" };
  13:             for (int index = 1; index <= contries.Length; index++)
  14:             {
  15:                 var contry = contries[index - 1];
  16:                 document.Add(CreateDirectorPhrase(contry));
  17:                 document.Add(Chunk.NEWLINE);
  18:             }
  19:  
  20:             document.Close();
  21:         }
  22:  
  23:         public static Font BOLD_UNDERLINED = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12, Font.BOLD | Font.UNDERLINE);
  24:         public static Font NORMAL = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12);
  25:         public static Phrase CreateDirectorPhrase(string str)
  26:         {
  27:             Phrase director = new Phrase();
  28:             director.Add(new Chunk(str, BOLD_UNDERLINED));
  29:             director.Add(new Chunk(",", BOLD_UNDERLINED));
  30:             director.Add(new Chunk(" ", NORMAL));
  31:             director.Add(new Chunk(str, NORMAL));
  32:             return director;
  33:         }

执行结果:

image

默认情况下,行间距是1.5倍字体大小,可以不用设置行间距,就比较好的显示文档。

三、段落(Paragraph)

段落是一系列块和(或)短句。同短句一样,段落有确定的间距。用户还可以指定缩排;在边和(或)右边保留一定空白,段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段落将自动另起一行。

说明:一个段落有一个且仅有一个间距,如果你添加了一个不同字体的短句或块,原来的间距仍然有效,你可以通过SetLeading来改变间距,但是段落中所有内容将使用新的中的间距。

更改分割符

通常,当文本不能放在一行时,文本将被分割成不同的部分,iText首先会查找分割符,如果没有找到,文本将在行尾被截断。有一些预定的分割符如“ ”空格和“-”连字符,但是你可以使用setSplitCharacter方法来覆盖这些默认值。

以使用IndentationLeft和IndentationRight,FirstLineIndent属性设置缩排;

演示代码如下:

   1: public static Font BOLD_UNDERLINED = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12, Font.BOLD | Font.UNDERLINE);
   2:         public static Font NORMAL = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12);
   3:         static Font BOLDITALIC = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12, Font.BOLD | Font.ITALIC);
   4:         public static Phrase CreateDirectorPhrase(string str)
   5:         {
   6:             Phrase director = new Phrase();
   7:             //director.Add(new Chunk(str, BOLD_UNDERLINED));
   8:             //director.Add(new Chunk(",", BOLD_UNDERLINED));
   9:             //director.Add(new Chunk(" ", NORMAL));
  10:             director.Add(new Chunk(str, NORMAL));
  11:             return director;
  12:         }
  13:  
  14:         static void Main(string[] args)
  15:         {
  16:             RegisterFont();
  17:             BOLD_UNDERLINED = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12, Font.BOLD | Font.UNDERLINE);
  18:             NORMAL = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12);
  19:             BOLDITALIC = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12, Font.BOLD | Font.ITALIC);
  20:             Document document = new Document();
  21:             PdfWriter.GetInstance(document, new FileStream(string.Format("{0}helloworld.pdf",
  22:                 AppDomain.CurrentDomain.BaseDirectory), FileMode.OpenOrCreate))
  23:               .InitialLeading = 30;
  24:             document.Open();
  25:  
  26:             string[] contries = new string[] { "美国", "英甲", "中国", "朝鲜", "日本" };
  27:             List<Movie> list = new List<Movie>() { new Movie() { Countries = new List<string>() { "中国", "美国" }, Directors = new List<string>() { "张三", "李四" }, Duration = "120", OriginalTitle = "电影一", Year = "2010" }, new Movie() { Countries = new List<string>() { "英国", "美国" }, Directors = new List<string>() { "张三", "王五" }, Duration = "80", OriginalTitle = "电影二", Year = "2011" }, new Movie() { Countries = new List<string>() { "英国", "中国" }, Directors = new List<string>() { "王五", "张三" }, Duration = "200", OriginalTitle = "2012", Year = "2009" }, new Movie() { Countries = new List<string>() { "日本", "中国" }, Directors = new List<string>() { "王五", "李四" }, Duration = "180", OriginalTitle = "电影四", Year = "2009" } };
  28:             for (int index = 1; index <= list.Count; index++)
  29:             {
  30:                 var contry = list[index - 1];
  31:                 document.Add(CreateMovieInformation(contry));
  32:                 document.Add(Chunk.NEWLINE);
  33:             }
  34:  
  35:             document.Close();
  36:         }
  37:  
  38:         public static Paragraph CreateYearAndDuration(Movie movie)
  39:         {
  40:             Paragraph info = new Paragraph();
  41:             info.Font = (NORMAL);
  42:             info.Add(new Chunk("年代: ", BOLDITALIC));
  43:             info.Add(new Chunk(movie.Year,
  44:               NORMAL));
  45:             info.Add(new Chunk("持续时间: ", BOLDITALIC));
  46:             info.Add(new Chunk(movie.Duration,
  47:               NORMAL));
  48:             info.Add(new Chunk(" 分钟", NORMAL));
  49:             return info;
  50:         }
  51:         public static Paragraph CreateMovieInformation(Movie movie)
  52:         {
  53:             Paragraph p = new Paragraph();
  54:             p.Font = (NORMAL);
  55:             p.Add(new Phrase("标题: ", BOLDITALIC));
  56:             p.Add(
  57:               movie.OriginalTitle);
  58:             p.Add(" ");
  59:             if (movie.OriginalTitle != null)
  60:             {
  61:                 p.Add(new Phrase(
  62:                   "正式标题: ", BOLDITALIC));
  63:                 p.Add(movie.OriginalTitle);
  64:                 p.Add(" ");
  65:             }
  66:             p.Add(new Phrase("国家: ", BOLDITALIC));
  67:             foreach (var country in movie.Countries)
  68:             {
  69:                 p.Add(
  70:                   CreateDirectorPhrase(country));
  71:                 p.Add(" ");
  72:             }
  73:             p.Add(new Phrase("导演: ", BOLDITALIC));
  74:             foreach (var director in movie.Directors)
  75:             {
  76:                 p.Add(
  77:                      CreateDirectorPhrase(director));
  78:                 p.Add(" ");
  79:             }
  80:             p.Add(CreateYearAndDuration(movie));
  81:             return p;
  82:         }

执行结果:

image

默认情况下,文本的对齐方式为左对齐,可以通过属性“Alignment”进行设置,

image

RIGHT. Element.ALIGN_JUSTIFIED_ALL 和Element.ALIGN_JUSTIFIED是很相似的,唯一的区别是前一种是占满整行,如下图

image

首行缩进(FirstLineIndent),左边缩进(tIndentationLeft),右边缩进(IndentationRight):

image

演示关键代码如下:

   1: var p = new Paragraph("这是一个缩进演示:段落是一系列块和(或)短句。同短句一样,段落有确定的间距。用户还可以指定缩排;在边和(或)右边保留一定空白,段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段落将自动另起一行。说明:一个段落有一个且仅有一个间距,如果你添加了一个不同字体的短句或块,原来的间距仍然有效,你可以通过SetLeading来改变间距,但是段落中所有内容将使用新的中的间距。更改分割符 通常,当文本不能放在一行时,文本将被分割成不同的部分,iText首先会查找分割符,如果没有找到,文本将在行尾被截断。有一些预定的分割符如“ ”空格和“-”连字符,但是你可以使用setSplitCharacter方法来覆盖这些默认值。",NORMAL);
   2:             p.Alignment = Element.ALIGN_JUSTIFIED;
   3:             p.IndentationLeft = 12;
   4:             p.IndentationRight = 24;
   5:             p.FirstLineIndent = 24;
   6:             document.Add(p);
   7:  
   8:             p = new Paragraph("段落是一系列块和(或)短句。同短句一样,段落有确定的间距。用户还可以指定缩排;在边和(或)右边保留一定空白,段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段落将自动另起一行。说明:一个段落有一个且仅有一个间距,如果你添加了一个不同字体的短句或块,原来的间距仍然有效,你可以通过SetLeading来改变间距,但是段落中所有内容将使用新的中的间距。更改分割符 通常,当文本不能放在一行时,文本将被分割成不同的部分,iText首先会查找分割符,如果没有找到,文本将在行尾被截断。有一些预定的分割符如“ ”空格和“-”连字符,但是你可以使用setSplitCharacter方法来覆盖这些默认值。", NORMAL);
   9:             p.Alignment = Element.ALIGN_JUSTIFIED;
  10:             document.Add(p);

段落间隔:

段落间隔使用如下两个属性:

SpacingAfter

SpacingBefore

进行设置。

文档在长度超过一行显示,使用分割符来进行断句换行,默认的分割符是空格和连字符,通过继承类“SplitCharacter”,来实现自定义的分割符。

四、列表(List)

列表就是一个有顺序的段落对象集合。

演示代码:

   1: static void Main(string[] args)
   2:         {
   3:             RegisterFont();
   4:             BOLD_UNDERLINED = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12, Font.BOLD | Font.UNDERLINE);
   5:             NORMAL = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12);
   6:             BOLDITALIC = FontFactory.GetFont("华文宋体", BaseFont.IDENTITY_H, 12, Font.BOLD | Font.ITALIC);
   7:             Document document = new Document();
   8:             PdfWriter.GetInstance(document, new FileStream(string.Format("{0}helloworld.pdf",
   9:                 AppDomain.CurrentDomain.BaseDirectory), FileMode.OpenOrCreate))
  10:               .InitialLeading = 30;
  11:             document.Open();
  12:  
  13:             string[] contries = new string[] { "美国", "英甲", "中国", "朝鲜", "日本" };
  14:             document.Add(new Chunk("默认列表演示1:", NORMAL));
  15:             document.Add(Chunk.NEWLINE);
  16:             List list = new List();
  17:             for (int index = 1; index <= contries.Length; index++)
  18:             {
  19:                 var contry = contries[index - 1];
  20:                 list.Add(new ListItem(contry, NORMAL));
  21:             }
  22:             document.Add(list);
  23:             document.Add(Chunk.NEWLINE);
  24:             document.Add(new Chunk("不显示数字演示2:", NORMAL));
  25:             document.Add(Chunk.NEWLINE);
  26:  
  27:             list = new List(false);
  28:             for (int index = 1; index <= contries.Length; index++)
  29:             {
  30:                 var contry = contries[index - 1];
  31:                 list.Add(new ListItem(contry, NORMAL));
  32:             }
  33:             document.Add(list);
  34:             document.Add(Chunk.NEWLINE);
  35:  
  36:             document.Add(new Chunk("使用#作为列表符号3:", NORMAL));
  37:             document.Add(Chunk.NEWLINE);
  38:             list = new List();
  39:             list.SetListSymbol("#");
  40:             for (int index = 1; index <= contries.Length; index++)
  41:             {
  42:                 var contry = contries[index - 1];
  43:                 list.Add(new ListItem(contry, NORMAL));
  44:             }
  45:             document.Add(list);
  46:  
  47:             document.Add(Chunk.NEWLINE);
  48:             document.Add(new Chunk("显示数字演示4:", NORMAL));
  49:             document.Add(Chunk.NEWLINE);
  50:  
  51:             list = new List(true);
  52:             for (int index = 1; index <= contries.Length; index++)
  53:             {
  54:                 var contry = contries[index - 1];
  55:                 list.Add(new ListItem(contry, NORMAL));
  56:             }
  57:             document.Add(list);
  58:  
  59:             document.Add(Chunk.NEWLINE);
  60:             document.Add(new Chunk("RomanList演示5:", NORMAL));
  61:             document.Add(Chunk.NEWLINE);
  62:  
  63:             var list1 = new RomanList();
  64:             for (int index = 1; index <= contries.Length; index++)
  65:             {
  66:                 var contry = contries[index - 1];
  67:                 list1.Add(new ListItem(contry, NORMAL));
  68:             }
  69:             document.Add(list1);
  70:  
  71:             document.Add(Chunk.NEWLINE);
  72:             document.Add(new Chunk("GreekList演示6:", NORMAL));
  73:             document.Add(Chunk.NEWLINE);
  74:  
  75:             var list2 = new GreekList();
  76:             for (int index = 1; index <= contries.Length; index++)
  77:             {
  78:                 var contry = contries[index - 1];
  79:                 list2.Add(new ListItem(contry, NORMAL));
  80:             }
  81:             document.Add(list2);
  82:  
  83:             document.Add(Chunk.NEWLINE);
  84:             document.Add(new Chunk("ZapfDingbatsNumberList演示7:", NORMAL));
  85:             document.Add(Chunk.NEWLINE);
  86:  
  87:             var list3 = new ZapfDingbatsNumberList(10);
  88:             for (int index = 1; index <= contries.Length; index++)
  89:             {
  90:                 var contry = contries[index - 1];
  91:                 list3.Add(new ListItem(contry, NORMAL));
  92:             }
  93:             document.Add(list3);
  94:  
  95:             document.Add(Chunk.NEWLINE);
  96:             document.Add(new Chunk("ZapfDingbatsList演示8:", NORMAL));
  97:             document.Add(Chunk.NEWLINE);
  98:  
  99:             var list4 = new ZapfDingbatsList(10);
 100:             for (int index = 1; index <= contries.Length; index++)
 101:             {
 102:                 var contry = contries[index - 1];
 103:                 list4.Add(new ListItem(contry, NORMAL));
 104:             }
 105:             document.Add(list4);
 106:  
 107:             document.Close();
 108:         }

执行结果:

imageimageimageimage

这个列表,还有一些扩展列表,如上面演示的5-7。

posted @ 2011-03-30 16:41  cdboy  阅读(8505)  评论(0编辑  收藏  举报