使用IText.Sharp创建PDF文件是比较简单,总体来说使用5步就可以生成一个简单的PDF文档。直接上代码:
1: static void Main(string[] args)
2: {
3: Document document = new Document();
4: PdfWriter.GetInstance(document, new FileStream(string.Format("{0}helloworld.pdf",
5: AppDomain.CurrentDomain.BaseDirectory),FileMode.OpenOrCreate));
6: document.Open();
7: document.Add(new Paragraph("Hello World!"));
8: document.Close();
9: }
从上面可以看出:
第一步:创建文档(Document)对象;
第二步:获取一个PdfWriter实例;
第三步:打开文档对象;
第四步:在文档中加入内容;
第五步:关闭文档。
一、文档对象
文档对象是一个容器,可以向里面加入Chunk、Phrase、Paragraph和其它高级对象。
它有三个构造函数:
页面大小是A4,边距设置均为36(上下左右)
自定义页面大小,边距默认为36(上下左右)
定义它的页面大小和边距,如下面的示例:
1: Rectangle pagesize = new Rectangle(216f, 720f);
2: Document document = new Document(pagesize, 36f, 72f, 108f, 180f);
当创建一个矩形或设置边距时,你可能希望知道该用什么度量单位:厘米、英寸或象素,事实上,默认的度量系统以排版单位磅为基础得出其他单位的近似值,如1英寸=72磅,如果你想在A4页面的PDF中创建一个矩形,你需要计算以下数据:
21 厘米 / 2.54 = 8.2677 英寸
8.2677英寸* 72 = 595 磅
29.7 厘米 / 2.54 = 11.6929 英寸
11.6929英寸* 72 = 842 磅
默认边距为36磅即半英寸。
如果你修改了页面尺寸和边距,仅仅影响到下一页。
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: Document document = new Document();
6: PdfWriter.GetInstance(document, new FileStream(string.Format("{0}helloworld.pdf",
7: AppDomain.CurrentDomain.BaseDirectory), FileMode.OpenOrCreate));
8: document.Open();
9: document.Add(new Paragraph("Hello World!"));
10: document.SetPageSize(PageSize.A5.Rotate());
11: document.SetMargins(72, 72, 72, 72);
12: document.NewPage();
13: document.Add((new Paragraph("Hello World 2!")));
14: document.Close();
15:
16: }
17: }
并且,默认情况下单位换算关系也是可以进行设置的,
如:默认情况下1个单位等于1点,如果执行如下代码后:
1: PdfWriter writer
2: = PdfWriter.GetInstance(document, new FileStream(string.Format("{0}helloworld.pdf",
3: AppDomain.CurrentDomain.BaseDirectory), FileMode.OpenOrCreate));
4: writer.Userunit = 75000f;
1个单位就等于75000点
注:系统已经在PageSize默认定义了一些页面设置,如:
并且,默认情况下,定义的页面大小的设置是横向排列,如要使用纵向,就要旋转了,
如下所示:
二、PdfWriter对象
PdfWriter的作用就是用来写PDF文件,你可以向里面直接添加内容。它添加的对象低级别和直接操作内容流,一般不使用它来进行内容添加。文档对象有一个作用就是把添加到其中的高级对象翻译成低级别对象,并写PdfWriter中。
DocumentException异常经常发生在第二步到第四步,在获得PdfWriter对象时,使用的文件流,也可以修改成内存流,如下所示:
1: static void Main(string[] args)
2: {
3: MemoryStream ms = new MemoryStream();
4: Document document = new Document();
5: PdfWriter.GetInstance(document, ms);
6: document.Open();
7: document.Add(new Paragraph("Hello World!"));
8: document.SetPageSize(PageSize.A5.Rotate());
9: document.SetMargins(72, 72, 72, 72);
10: document.NewPage();
11: document.Add((new Paragraph("Hello World 2!")));
12: document.Close();
13: using (var stream = new FileStream(string.Format("{0}helloworld.pdf",
14: AppDomain.CurrentDomain.BaseDirectory), FileMode.OpenOrCreate))
15: {
16: stream.Write(ms.ToArray(), 0, (int) ms.Length);
17: }
18: }
三、打开文档
打开文档的操作,执行了很多初始化操作,有很多设置只能在打开文档前完成,如:加密类型、强度、权限、文档元数据等等。
四、添加内容
在本例中,使用向文档中添加了一个高级对象Paragraph,也可以在这里直接使用低级操作函数进行内容添加,如下示例:
1: static void Main(string[] args)
2: {
3: MemoryStream ms = new MemoryStream();
4: Document document = new Document();
5: PdfWriter writer = PdfWriter.GetInstance(
6: document, new FileStream(string.Format("{0}helloworld.pdf",
7: AppDomain.CurrentDomain.BaseDirectory), FileMode.OpenOrCreate));
8: document.Open();
9:
10: PdfContentByte canvas = writer.DirectContentUnder;
11: writer.CompressionLevel = 0;
12: canvas.SaveState();
13: canvas.BeginText();
14: canvas.MoveText(36, 788);
15: canvas.SetFontAndSize(
16: BaseFont.CreateFont(), 12);
17: canvas.ShowText("Hello World");
18: canvas.EndText();
19: canvas.RestoreState();
20:
21: document.Close();
22: }
注:使用这种方式添加的内容,不受页边距的限制,应确定写入的内容在可视范围内。
五、关闭文档
如目录这些交差引用,就需要在关闭文档前进行写入到PDF文件中,这样才能有效的保证引用正确。
同时实例化PdfWriter的流对象,不用手动关闭,在关闭文档时会自动关闭。
如果要显示不关闭流对象,就要调用如下代码设置:
小结:
通过简单的五步就实现的PDF文件的生成,更复杂文档的生成就只需要,对第四步加入更多内容就可以实现,这只是一个简单的导,在后续中还更多内容展现。