在现代的软件开发中,经常需要将文本、表格和其他文档格式转换为PDF文件。本文将介绍如何使用C#编程语言创建PDF文件,并在其中添加文本和表格。将从下载库文件开始,然后逐步讲解如何生成PDF文档。
首先,需要下载PDF生成库,并将其添加到.NET项目中。这个库支持将简单的文本和HTML转换为PDF,或者从其他文档格式转换,前提是知道这些文档的格式。目前,该库支持添加表格,并创建包含任意页数的PDF文档。
创建PDF文档可以分为三个主要步骤:
在每一步中,都需要打开一个文件,指定输出文件名。在第一步中,文件是以创建模式打开的,在其他步骤中是以追加模式打开的。在PDF格式中,创建和写入的每个对象都是通过该对象在文件中的字节偏移量来引用的。
将通过一个代码示例来解释如何使用PDF库。
CatalogDict catalogDict = new CatalogDict();
PageTreeDict pageTreeDict = new PageTreeDict();
FontDict TimesRoman = new FontDict();
FontDict TimesItalic = new FontDict();
InfoDict infoDict = new InfoDict();
TimesRoman.CreateFontDict("T1", "Times-Roman");
TimesItalic.CreateFontDict("T2", "Times-Italic");
infoDict.SetInfo("title", "author", "company");
Utility pdfUtility = new Utility();
FileStream file = new FileStream(@"c:\text.pdf", FileMode.Create);
int size = 0;
file.Write(pdfUtility.GetHeader("1.5", out size), 0, size);
file.Close();
以上代码完成了第一步,即创建PDF文档的头部。
接下来,将创建文档的页面。这里只创建一个页面,但这个过程可以重复,以包含任意数量的页面。一个页面将包含其内容,内容是创建的文本和表格。这些内容是一个ContentDict
类型的对象。一个页面可以有任意数量的ContentDict
,但两个或更多的页面不能有相同的ContentDict
。
每个页面都必须添加到PageTreeDict
中。这是PDF文档结构中页面的根节点。在PDF文档中,将只有一个PageTree
(由这个库创建)。这是通过使用PageTreeDict.AddPage()
创建的。页面在文档中的顺序将按照它们被添加到PageTree
的顺序。
对于每个页面,必须添加资源。这些资源包括页面中必须使用的字体和ContentDict
的对象。这是通过调用PageDict.AddResource
完成的。在库中指定了要使用的字体类型。在这个库中,只有Times New Roman字体类型将被正确居中和右对齐。这是因为,为了对齐,必须有所有字符预览的宽度。只存储了Times New Roman的宽度。
在AddPage
中,指定要添加的页面的objNum
,在AddResource
中,添加ContentDict
的objNum
。
要添加文本和表格到页面,创建一个TextAndTables
类型的对象。要添加文本,调用addText
并指定X和Y坐标。要添加表格,首先使用TableParams
填充表格参数。在构造函数中,指定列数和它们的宽度。如果宽度相同,那么可以使用另一个构造函数,只指定列数并设置结构的numColumns
参数。在这个版本中,只需要设置表格的三个参数,它们是:行高、X坐标和Y坐标。
现在,可以指定每个单元格中文本的对齐方式。如果有两列,创建一个包含两个Align元素的数组。
在进行了这么多初始化之后,调用TextAndTable.AddRow()
成员。这个可以调用多次以添加新行。完成后,调用EndTable()
。这将返回一个字符串。这个字符串应该传递给content.SetStream()
。
现在,将这些内容添加到文件中。然后就完成了第二步。
PageDict page = new PageDict();
ContentDict content = new ContentDict();
PageSize pSize = new PageSize(612, 792);
pSize.SetMargins(10, 10, 10, 10);
page.CreatePage(pageTreeDict.objectNum, pSize);
pageTreeDict.AddPage(page.objectNum);
page.AddResource(TimesRoman, content.objectNum);
TextAndTables textAndtable = new TextAndTables(pSize);
textAndtable.AddText(20, 10, "Testing", 10, "T1", Align.CenterAlign);
Align[] align = new Align[2];
align[0] = Align.LeftAlign;
align[1] = Align.LeftAlign;
ColorSpec cellColor = new ColorSpec(100, 100, 100);
ColorSpec lineColor = new ColorSpec(98, 200, 200);
TableParams table = new TableParams(2, 200, 200);
table.yPos = 700;
table.xPos = 100;
table.rowHeight = 20;
textAndtable.SetParams(table, cellColor, Align.CenterAlign, 3);
textAndtable.AddRow(false, 10, "T1", align, "First Column", "Second Column");
textAndtable.AddRow(false, 10, "T1", align, "Second Row", "Second Row");
// Repeat till we require the number of rows.
content.SetStream(textAndtable.EndTable(lineColor));
content.SetStream(textAndtable.EndText());
size = 0;
file = new FileStream(@"c:\text.pdf", FileMode.Append);
file.Write(page.GetPageDict(file.Length, out size), 0, size);
file.Write(content.GetContentDict(file.Length, out size), 0, size);
file.Close();
现在已经完成了页面的创建,可以结束PDF文档的创建了。这是通过将所有信息写入文件来完成的。
file = new FileStream(@"c:\text.pdf", FileMode.Append);
file.Write(catalogDict.GetCatalogDict(pageTreeDict.objectNum, file.Length, out size), 0, size);
file.Write(pageTreeDict.GetPageTree(file.Length, out size), 0, size);
file.Write(TimesRoman.GetFontDict(file.Length, out size), 0, size);
file.Write(TimesItalic.GetFontDict(file.Length, out size), 0, size);
file.Write(infoDict.GetInfoDict(file.Length, out size), 0, size);
file.Write(pdfUtility.CreateXrefTable(file.Length, out size), 0, size);
file.Write(pdfUtility.GetTrailer(catalogDict.objectNum, infoDict.objectNum, out size), 0, size);
file.Close();
以上代码完成了第三步,即完成PDF文档的创建。