.NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇)

来源:互联网 发布:欧洲经济知乎 编辑:程序博客网 时间:2024/04/28 03:03

该文主要介绍如何借助iTextSharp在C# 2.0中制作PDF文件,本文的架构大致按照iTextSharp的操作文档进行翻译,如果需要查看原文,请点击一下链接:http://itextsharp.sourceforge.net/tutorial/

一、 iTextSharp的介绍和下载

(1)用户可以浏览官网进行查看:http://itextsharp.sourceforge.net/index.html

iText# (iTextSharp) is a port of the iText open source java library written entirely in C# for the .NET platform. iText# is a library that allows you to generate PDF files on the fly. It is implemented as an assembly.

(2)以下链接用于下载:http://sourceforge.net/project/platformdownload.php?group_id=72954

下载后为一个解压缩文件,用户直接解压后得到一个dll动态链接库,在创建的项目中直接引入即可使用(本文的所有代码均在VS 2005环境下测试通过

二、创建一个PDF文档(原文:http://itextsharp.sourceforge.net/tutorial/ch01.html

2.1 示例代码分析

创建一个PDF文档大致包括五个步骤,代码如下:

该段代码的效果是可以在当前工作目录下,生成一个名字叫做Chap0101.pdf的PDF文档

2.2 第一步:创建Document对象

(1) Document对象

iTextSharp.text.Document有三个构造函数,分别为:

第一个构造函数调用第二个构造函数,参数为PageSize.A4

第二个构造函数调用第三个构造函数,其中每个边距默认值为36

(2) Page Size

你可以创建自己的用于特定颜色的Rectangle对象,并将其作为pageSize。我们对前面的代码进行修改,即创建一个长的、窄的、背景颜色为淡黄色的PDF文档。代码如下:

大多pageSizes都是采用了PORTRAIT格式,如果你想在LANDSCAPE应用它们,你必须使用rotate(),代码如下:

(3) Margins

在创建document的过程中,你也可以定义左、右、上、下边距,代码如下所示:

注意:如果你修改pageSize,会在下一个页面创建时产生影响;如果你修改margins,则会在当前页面立即产生影响。

2.3 创建Write对象

一旦成功创建了document,我们必须创建一个或者多个实例用于监听document,所有的writers继承于iTextSharp.text.DocWriter类。即你可以iTextSharp.text.pdf.PdfWriter 使用来生成PDF文档,而如果需要生成Tex文档你必须使用iTextSharp.text.TeX.TeXWriter。

你可以使用以下的方式创建实例:

在使用过程中,你几乎不会使用到writer对象(除了你想创建高级的PDF文件或者你想使用一些特定的函数,比如ViewerPreferences或者Encryption),所以获取这类实例就足够了。

该函数的第一个参数即第一步所创建的document对象;

第二个参数为不同类型的Stream对象,目前我们都只使用System.IO.FileStream,后来我们会使用到System.IO.MemoryStream. 

2.4 元数据以及打开document

在你添加实际数据(即内容)是,你可能想加入某些关系到document的元数据,其方法如下:

你可以选择自己的Title,Subject,Keywords,Author以及Creator,但是添加制作者的函数必须一直使用,以及添加创建时间的方法添加的当前系统的时间(事实上,这两个方法是被自动调用的),你可以用客户的姓名作为Header,但是这对于PdfWrite没有任何影响。

2.5 添加内容

1、在前面的三个步骤中,你遇到了诸如:Phrase,Paragraph…的对象,在以后的章节会详细的给予介绍。有些时候,你可能希望writer可以忽略document中的行为,相关的代码可以查看

2、如果你想创建两个writer:writerA和writerB(这个代码在第二步会丢出异常)

实际上,我们需要对其进行简单的修改,修改后的代码如下:

2.6 关闭document

关闭document相当重要,因为它会影响和关闭writer写的输出流,close方法为finalize方法,但是你不能依靠它,你必须手工对其进行关闭。

三、Chunks, Phrases 和Paragraphs(原文http://itextsharp.sourceforge.net/tutorial/ch02.html)

3.1 Chunk

Chunk是能够添加到document文本中最小的重要部分。Chunk能够为其他的元素诸如Phrase以及Paragrph等构建块,一个Chunk就是一个附有指定字体的字符串,在添加chunk的文本的对象中,所有其他的版面设计参数都应该定义。

下面的代码表示我们创建内容为"Hello world"格式为(red, italic COURIER font of size 20)的Chunk:

 

 

 

3.2 Phrases

Phrases是一系列拥有特定的作为额外参数的leading(=两行之间的空间)的Chunk

Phrases拥有一个主字体,但是其他的chunks可以拥有不同于这个主字体的其余字体,你可以从多种构造函数中创建Phrases对象。代码如下:

 

3.3 Phragraph

 

Phragraph是一系列的chunk或者phrase.跟phrase类似,Phragraph也有特定的leading,用户也可以定义特定的缩排。每个加到document的Phragraph都会自动生成新的一行。Phragraph的构造函数包括如下几种:

所有的paragraph对象还可以利用add()添加paragraph对象。代码如下:

注意:每一个paragraph只能且需有一个leading,如果你想添加其他字体的phrase或者chunk,原先的leading依旧有效,你可以利用方法setLeading修改leading,但是这样会造成所有paragraph的内容都会拥有新的leading.测试代码如下:

以下的代码我们应用方法setKeepTogether(true)来保证paragraph在一个page上,这个并不经常发生。

四、Anchor(锚)、List(列表)和Annotation(注释)

(原文:http://itextsharp.sourceforge.net/tutorial/ch03.html)

 

4.1 Anchor

 

我们都知道HTML中的超文本链接,只要你点击指定的文字,你就可以跳转到网络中的其他页面,这种功能在PDF中同样存在,在后面的章节会详细的介绍PDF中的链接Chapter 11,。但是这是iText的另外一种高级编程,我们这里只是介绍简单的iText.

如果你想添加外部的link到document中(比如用URL链接到网页中的另外一个document),你可以简单的使用Anchor对象,该对象继承于Phrase对象,它们具有相同的使用方法,但是它还有两个额外的方法:setName和setReference,具体的使用代码如下:

如果你想添加内部的链接,你需要为链接选择独特的名字,这就像在HTML中为锚所使用的名字,当你为这个目标设定索引时,你需要在前面添加一个#符号,具体代码如下:

 

4.2 List

利用List和ListItem类,你就可以为PDF文件添加列表了,如果你想拥有有序(ordered)列表或者无序列表(unordered)你都可以使用这两个类。

 

(1) ordered列表

 

结果为:

 

1

(2) 无序列表

结果为:

2

你可以用setListSymbol方法改变列表标识符,代码如下所示:

还有一些方法用于改变列表的缩排:setIndentationLeft 和 setIndentationRight.

而列表符的缩排可以在构造函数中给予设定,参考代码如下:

 

4.3 Annotation

在iText中支持不同类型的注释:

(1) Text:你可以向document添加一些小块的文本,但是这些文本并不属于内容的一部分,Annotation有一个标题和一些内容,具体代码如下:

  

(2) External links(外部链接):你可以指定一个可被点击的矩形或者字符串(称为URL)或者URL对象,具体代码如下:

(3) External PDF file(外部PDF文件):你可以设定一个可点击的矩形和字符串(文件名称)和目的文件或者页码:

(4) Named action(指定的行为):你必须制定一个可点击的矩形和一个指定的行为:

(5) Application(应用):你必须制定一个可点击的矩形和一个应用程序

5、HeaderFooters,Chapters,Sections和Graphic对象(原文:http://itextsharp.sourceforge.net/tutorial/ch04.html)

5.1 HeaderFooter

HeaderFooter对象是一个能够为document的每个页面添加footer和header的对象,这些页眉和页脚都包含着标准的短语和当前的页码(如果有需要)。如果你需要更加复杂的页眉和页脚(有表格或者有page X of Y),您需要阅读12章节Chapter 12

下面的核心代码表示我们第一个添加一个包含页码但是么有任何边界的页眉。

具体代码如下:

 

我们也可以用一下的构造函数:

如果你设置HeadFooter对象没有改变边界,页眉或者页脚会在文本的上下有一条线。

5.2 Chapters和Section

十一章(Chapter 11 本文的12节)描述了如何创建大纲树,如果你只是需要附有一些章节或者子段的简单的树,你可以利用Chapter和Section类来自动创建,核心代码如下:

下面的代码,我们添加一系列的章节和子章节,运行程序后,你可以查看到PDF文件拥有完整的大纲树,这个大纲树被默认打开,如果你想使得有一部大纲关闭,你可以把BookmarkOpen属性设置为false.

5.3 Graphic

如果你想添加诸如线段、圆、几何图形等,你可以查看本文的第11章或者查看原文(Chapter 10),但如果你只是需要有限的功能,你可以直接使用Graphic对象。核心代码如下:

详细代码如下(在目前测试过程中,Ghaphic类不能使用,目前还不知道什么原因)

六、表格Table(原文:http://itextsharp.sourceforge.net/tutorial/ch05.html)

提示:如果你仅仅只生成PDF(并非XML,HTML,RTF)文件,你最好可以用PdfPTable类取代Table类

6.1 一些简单的表格

Table(表格)就是一个包含Cells(单元格)的Rectangle(矩阵).并按照一些特定的矩阵进行排序。表格中的矩阵并一定要M*N,它还可以只包含比unit大的单元格或者hole,其核心代码如下:

下面的代码我们创建一个非常简单的表格:

以上代码创建了一个含有2行2列的表格,单元格自动添加,开始于第一行的第一列,然后第二列,当一个行满了以后,下一个单元格就在下一行的第一列添加。如下图所示:

3

以下代码为在表格指定的位置进行添加单元格,在测试本代码,您必须添加引用System.Drawing.dll库文件来访问Point对象,我们在该代码创建一个4X4的表格,然后在随机的位置添加单元格。

核心代码如下:

详细代码如下:

从以上代码可以看出,我们必须设置属性AutoFillEmptyCells属性为true,如果你忘记设置该属性(就像本代码生成的第二个表格),这样就不会有额外的单元格添加当然不包括任何单元格的行也会被忽略。在本例中,第一行没有显示,就是因为它是空的。

通常情况下,我们会用数据库查询结果来填满表格,在许多例子中,我们并不知道我们究竟需要多少行,这里有个构造函数可以解决这个问题,如下:

如果有需要,iText会自动添加行,在下面的例子,我们初始化了一个4X4的表格,当我们在6行和7行添加单元格的时候,iText自动将行数升至为7.具体代码如下所示:

同样,添加列数也是可能的,但是有一定的难度,它不会进行自动的添加,你需要使用addColumns方法以及为列的宽度进行设置,在下面的代码可以看出。

6.2  一些表格参数

以上创建的一些表格看起来效果都不怎么好,我们可以通过设置一些表格参数来改变表格的外观。Table类和Cell类都是继承于Rectangle类,所以我们可以利用一些rectangle的典型的方法,如下面代码:

原创粉丝点击