zoukankan      html  css  js  c++  java
  • 使用iTextSharp创建PDF文件

    本以为创建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知识库文章就行了。

    效果如下:

  • 相关阅读:
    笔记-归并排序
    Repeated Substring Pattern
    Assign Cookies
    Number of Boomerangs
    Paint Fence
    Path Sum III
    Valid Word Square
    Sum of Two Integers
    Find All Numbers Disappeared in an Array
    First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/think8848/p/2050032.html
Copyright © 2011-2022 走看看