本以为创建PDF的组件一抓一大把,要用的时候才发现网上的资源很少,大家讨论比较多的是iTextSharp。于是就下载下来试试看。
先发几个有用的资源:
这里是一个很好的中文博客,里面有非常详细的iTextSharp资料。
这里是IBM知识库的一篇很有用的文章,不过是java实现的,当然,使用C#的兄弟看java的代码应该不大会有陌生的感觉。有这篇文章你就可以制作出精美报表了。
我使用的比较简单,只是使用iTextSharp制作一个报表,现在的项目是一个C/S项目,但是要修改扩展到B/S架构的(客户就是这么要求的),因此我不想把PDF文件直接生成在硬盘上,而是生成一个Stream,当然了,肯定是MemoryStream,这样以后也有机会直接输出到浏览器端。下面上代码:
private MemoryStream GeneratePdfStream() { BaseFont baseFont = BaseFont.CreateFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Document pdf = new Document(PageSize.A4, LEFT, RIGHT, TOP, BOTTOM); MemoryStream stream = new MemoryStream(); PdfWriter writer = PdfWriter.GetInstance(pdf, stream); pdf.Open(); pdf.Add(new Paragraph(string.Format("项目: {0}", Cover.ProjectName ?? ""), new PdfFont(baseFont, FONT_SIZE_1))); pdf.Close(); return stream; }
这里需要说明下,报说生成中文的PDF时比较麻烦,因为我是直接上手就生成中文的,所以也不知道是怎么个麻烦法。
在生成的时候,需要创建一个BaseFont对象,其中CreateFont方法的第一个参数为fontName,但是可能和第一感觉不同,它并不是我们平时说的“宋体”,“黑体”之类的,而是一个字体文件的文件名,传统意义上的字体文件的路径,在我的代码中定义如下:
private const string FONT_PATH = @"Fonts\SIMSUN.ttc,1";
Fonts是Debug目录下的子文件夹,SIMSUN.ttc是“宋体”所在的文件,",1"依我现在的猜测可能是这个文件中有两个字体?取第2个?仅仅是猜测而已,我并不想去深究,现在太懒了,大多数时候都是够用就好。
其他的都没有什么技术含量了,一眼就能看明白,值得一提的是,Document的实例,即pdf一定需要Close一次,这样才可以把数据刷进MemoryStream中,否则MemoryStream中不包含任何数据。其他的页眉页脚,段落,表格,图片之类的和输出一段文件相比也没有什么难度,参照着IBM知识库文章就行了。
效果如下: