• 使用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知识库文章就行了。

    效果如下:

  • 相关阅读:
    Java反射理解
    Object的wait和Thread的sleep
    Android媒体解码MediaCodec,MediaExtractor
    图片加载AsyncTask并发问题
    LruCache缓存机制
    Android高效加载大图
    Android Studio编写运行测试纯java代码可带main()函数
    APP支付宝登录第三方授权如何签约入口在哪里
    Xcode使用HTTP配置
    OC编码问题输出中文
  • 原文地址:https://www.cnblogs.com/think8848/p/2050032.html
Copyright © 2020-2023  润新知