使用ItextSharp产PDF完整操作

原文 使用ItextSharp产PDF完整操作

 记得上回有写到用C#操作Excel(.net 4.0)

很多朋友说推荐用NPOI,的确,用微软自带的操作execl会有很大的问题。客户的主机不愿意安装excel,

这时我才意识到用自带组件完全是不行的,我本来准备改用NPOI组件,但是这时客户提出为了安全(数据安全),改用后台产PDF。

这就有了本文中ITextSharp的用法

本文介绍了基本全套的用法,包括页眉,页首,表格的用法,但是还是有很多问题没有处理好,只是把我已经ok的地方拿出来给一些需要的朋友学习。

 

一:下载地址

下面这篇博文说明了ITextsharp的下载地址,本人就是按照这篇文章进行的下载

http://www.cnblogs.com/haogj/archive/2011/09/05/2167659.html

注意版本不同,一些函数的用法也不相同了

 

二:产出PDF

 

 /// <summary>
        /// 产生PDf
        /// </summary>
        /// <param name="strFileName">文件名称</param>
        /// <param name="dt">数据源</param>
        public void PDF(string strFileName, DataTable dt, string PrintName)
        {
            if (!Directory.Exists(AppConfigString.FilePath))
            {
                Directory.CreateDirectory(AppConfigString.FilePath);
            }
            string strPathTemp = AppConfigString.FilePath + DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf";
            //零時的pdf地址,用于水印读取文件
            string strPath = AppConfigString.FilePath + strFileName;//真正文件的位置
            Document document = new Document(PageSize.A4, 25, 25, 25, 25);
            FileStream stream = new FileStream(strPathTemp, FileMode.Create);
            PdfWriter writer = PdfWriter.GetInstance(document, stream);
            document.Footer = Foot();//页尾的函数,在open前定义
            document.Open();
            HeaderFooter head = new HeaderFooter(HeadTable(3, PrintName), true);
            //true为在页眉的右边生成一个页数,会影响到页眉的高度,在open后定义
            //headTable为页眉的函数
            head.Border = Rectangle.NO_BORDER;
            document.Header = head;
            //页眉第一页不会出现,第2页才会出现,所以此地直接在第一列加了一个表头
            //页尾在第一页就会出现
            document.Add(HeadTable(3, PrintName));//第一頁表頭不自動添加
            //主要数据的添加
            int IRowCount = dt.Rows.Count;
            int IColumnCount = dt.Columns.Count;
            PdfPTable pdfTb = new PdfPTable(IColumnCount);
            pdfTb.HeaderRows = 1;//自動加表頭
            for (int i = 0; i < IRowCount; i++)
            {
                for (int j = 0; j < IColumnCount; j++)
                {
                    string value = dt.Rows[i][j].ToString();
                    Phrase phs = new Phrase(value, PdfFont.Font(3));
                    //此时把数据转为Phrase只是为了使用字体,不然中文不能显示
                    pdfTb.AddCell(phs);
                }
            }
            document.Add(pdfTb);
            document.Close();
            writer.Close();
            PDFWatermark(strPathTemp, strPath, 10, 10, PrintName);//为生成好的文件添加水印

        }

 上面为一段完整的使用过程,注释是我刚加的,比较详细了,说下面几个问题

  1:页眉和页首

    》页眉与页首都使用相同的类HeaderFooter,只是页眉是给 document.Header,页尾是给document.Footer

    》页尾是在document.open前,页眉是在document.open后

    》页眉第一页不会出现,第2页才会出现,所以此地直接在第一列加了一个表头。页尾在第一页就会出现。

  2:页眉的制作方法

   由于页眉不好制作,所以我选择直接先拼成PdfPTable,再把PdfPTable放到Phrase,再把Phrase放到HeaderFooter给页眉,这样就好操作些

   这个是在百度知道上找到的思路,我就这样做了,呵呵...

  下面为我制作页眉的方法,一些信息安全问题已换为XXXXX

 

/// <summary>
        /// 產生表頭的數據
        /// </summary>
        /// <param name="IType">1:ID 2:Name 3:detali</param>
        /// <returns></returns>
        public Phrase HeadTable(int IType, string PrintName)
        {
            string strhead = "";
            switch (IType)
            {
                case 1: strhead = "XXXXXXXXXXXXXXXXXXXX"; break;
                case 2: strhead = "XXXXXXXXXXXXXXXXXXXX"; break;
                case 3: strhead = "XXXXXXXXXXXXXXXXXXXX"; break;
            }
            Phrase phshead = new Phrase(strhead, PdfFont.Font(1));
            Phrase phsjimi = new Phrase("XXXXXXXXXXXXXXXXXXXX ", PdfFont.Font(3));

            Phrase phsPeople = new Phrase("XXXXXXXXXXXXXXXXXXXX" + PrintName + "XXXXXXXXXXXXXXXXXXXX" + PrintName, PdfFont.Font(3));
            Phrase phsPage = new Phrase(" ", PdfFont.Font(3));
            Phrase phsPrintDate = new Phrase("列印時間:" + DateTime.Now.ToString("yyyy/MM/dd hh:mm") + "\r\n Print Date:" + DateTime.Now.ToString("yyyy/MM/dd hh:mm"), PdfFont.Font(3));
            PdfPCell pchead = new PdfPCell(phshead);
            pchead.VerticalAlignment = 1;
            pchead.HorizontalAlignment = 1;
            PdfPCell pcjimi = new PdfPCell(phsjimi);
            PdfPCell pcPeople = new PdfPCell(phsPeople);
            PdfPCell pcPage = new PdfPCell(phsPage);
            PdfPCell pcPrintDate = new PdfPCell(phsPrintDate);
            PdfPCell pcnull = new PdfPCell();
            pchead.Border = 0;
            pcjimi.Border = 0;
            pcPeople.Border = 0;
            pcPage.Border = 0;
            pcPrintDate.Border = 0;
            pcnull.Border = 0;
            pcPeople.PaddingBottom = 10;
            pcPrintDate.PaddingBottom = 10;
            Phrase phead = new Phrase();
            PdfPTable thead = new PdfPTable(2);
            thead.AddCell(pchead);
            thead.AddCell(pcjimi);
            thead.AddCell(pcnull);
            thead.AddCell(pcPage);
            thead.AddCell(pcPeople);
            thead.AddCell(pcPrintDate);
            thead.SetWidths(new float[] { PageSize.A4.Width, 200 });
            phead.Add(thead);
            return phead;

        }

 

 

 页尾的方法

        /// <summary>
        /// 页尾
        /// </summary>
        /// <returns></returns>
        public HeaderFooter Foot()
        {
            string strFoot = @"XXXXXXXXXXXXXXXXXX";
            Phrase pfoot = new Phrase(strFoot, PdfFont.Font(2));
            HeaderFooter foot = new HeaderFooter(pfoot, false);
            foot.Border = Rectangle.NO_BORDER;
            return foot;
        }

 

3:字体的问题

  如果没有定义字体,汉字是不会出现的,下面是我定义的字体,使用的ITextSharp控件字体,当然也可以使用字体文件

详情可查看http://winsystem.ctocio.com.cn/334/12194834.shtml

 

        /// <summary>
        /// 文字类型定义
        /// </summary>
        /// <param name="IType">返回文字类别</param>
        /// <returns></returns>
        public static Font Font(int IType)
        {
            BaseFont.AddToResourceSearch("iTextAsian.dll");
            BaseFont.AddToResourceSearch("iTextAsianCmaps.dll");
            BaseFont bf = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
            //简体?繁体不能使用
            //
            Font font = new Font(bf);//普通文章
            font.Size = 10;
            Font fontFoot = new Font(bf);//頁脚文字
            fontFoot.Size = 7;
            fontFoot.Color = Color.RED;
            Font fontNormal = new Font(bf);//正常文字
            fontNormal.Size = 7;
            switch (IType)
            {
                case 1: return font;
                case 2: return fontFoot;
                case 3: return fontNormal;
                default: return fontNormal;
            }
        }

 

4:主要内容的制作

 根据数据源,利用PdfPTable和Phase等制作,块等我还没用会,主要是样式和定位没搞会

下面的博客有在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本的方法

http://www.cnblogs.com/CareySon/archive/2011/11/03/2234625.html

5:水印的添加

        /// <summary>
        /// 為生成的pdf添加水印
        /// </summary>
        /// <param name="inputfilepath"></param>
        /// <param name="outputfilepath"></param>
        /// <param name="top"></param>
        /// <param name="left"></param>
        /// <returns></returns>
        public bool PDFWatermark(string inputfilepath, string outputfilepath, float top, float left, string strName)
        {
            PdfReader pdfReader = null;
            PdfStamper pdfStamper = null;
            try
            {
                pdfReader = new PdfReader(inputfilepath);

                int numberOfPages = pdfReader.NumberOfPages;

                iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);

                float width = psize.Width;

                float height = psize.Height;

                pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));

                PdfContentByte waterMarkContent;

                WatermarkCreater wmc = new WatermarkCreater();
                Draw.Image image = wmc.GetImageByte(strName, AppConfigString.WaterMarkPath);
                var img = Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Png);
                if (left < 0)
                {
                    left = width - image.Width + left;
                }
                img.SetAbsolutePosition(left, (height - image.Height) - top);
                //每一页加水印,也可以设置某一页加水印
                for (int i = 1; i <= numberOfPages; i++)
                {
                    waterMarkContent = pdfStamper.GetUnderContent(i);

                    waterMarkContent.AddImage(img);
                }
                return true;
            }
            catch (Exception ex)
            {
                ex.Message.Trim();
                return false;
            }
            finally
            {

                if (pdfStamper != null)
                    pdfStamper.Close();

                if (pdfReader != null)
                    pdfReader.Close();
                //把添加水印前的pdf文件刪除,保存最新的文件
                if (File.Exists(inputfilepath))
                {
                    File.Delete(inputfilepath);
                }
            }

        }

这就是我们为什么要用一个零时路径了,先把产出的pdf放到零时路径,用来产生水印的时候读取,生成水印文件后,再把零时文件删除即可

其中的WatermarkCreater方法可以看我以前的博客,报表水印的产生http://www.cnblogs.com/xiaoshuai1992/p/waterMark.html,方法相同

 

至此可以达到客户的要求,但是一些样式的问题就需要大家仔细研究了,这就是我的实践过程,希望可以和大家一起学习了

 

 

 

 

时间: 2024-09-19 10:12:02

使用ItextSharp产PDF完整操作的相关文章

基于iTextSharp的PDF文档操作

公司是跨境电商,需要和各种物流打交道,需要把东西交给物流,让他们发到世界各地.其中需要物流公司提供一个运单号,来追踪货物到达哪里?! 最近在和DHL物流公司(应该是个大公司)对接,取运单号的方式是调用对方提供的API,简单说,就是我们传一些发货地址和客户信息,要发的货物等,对方返回一个运单号和物流面单(就是我们淘宝快递上的面单).过程呢,还是比较顺利的,经过一系列沟通,最终还是实现了功能 下面还是说说没有实现的功能,如果都实现了,也不用写这篇博客了.不足之处在于DHL提供的面单,没有提供要拣哪些

通过 iTextSharp 实现PDF 审核盖章

最近需要做一个PDF自动审核盖章的工作,其实就是读取PDF,然后再最后一页加入一个审核章印图 片上去.看起来很简单,不过在开发过程中,还是遇到了一些问题,在这里记录一下. 主要遇到的问题是页面的旋转 和 内容的旋转 的分开的,需要分别操作. 准备工作需要下载 iTextSharp.dll 然后加入引用 using iTextSharp.text; using iTextSharp.text.pdf; string path = @"D:\28727_LOG001_FOLIOLE COMPANY

C#使用itextsharp生成PDF文件的实现代码

以下是对在C#中使用itextsharp生成PDF文件的实现代码进行了详细分析介绍,需要的朋友可以过来参考下   项目需求需要生成一个PDF文档,使用的是VS2010,ASP.NET. 网络上多次搜索没有自己想要的,于是硬着头皮到itextpdf官网看英文文档,按时完成任务,以实用为主,共享一下:使用HTML文件创建PDF模板:使用自定义字体的一种方法: 复制代码 代码如下:                 FontFactory.Register(System.Web.HttpContext.

c#-itextsharp添加pdf水印时,怎么设置图片水印、表格水印的透明度?

问题描述 itextsharp添加pdf水印时,怎么设置图片水印.表格水印的透明度? 哪位itextsharp高手可以指点一下,通过itextsharp添加pdf水印时,怎么设置图片水印.表格水印的透明度? 小弟通过设置PdfContentByte的waterMarkContent.SetGState(gs);,以及gs的gs.FillOpacity = 0.2f; 只对文字的透明度有效.

itextsharp pdf 图片-itextsharp 导出pdf ,动态生成的图片问题

问题描述 itextsharp 导出pdf ,动态生成的图片问题 itextsharp 支持jquery吗 我采用下面的方法,去把当前的url转换为pdf. public void CreatPdf(string htmlurl, int lange) { Document doc = new Document(PageSize.A4, 9, 18, 36, 36);//左右上下 MemoryStream ms = new MemoryStream(); try { PdfWriter writ

用ITextSharp给pdf文档加水印在FireFox下水印消失并且不允许打印功能失效

问题描述 用ITextSharp给pdf文档加水印在FireFox下水印消失并且不允许打印功能失效有没有大神遇到过这种问题?或者C#有没有其它的方法给pdf加水印,10点上线回帖!谢谢这个是在googlechrome下面,禁用打印和水印都是成功的这是在火狐下面,水印消失,禁止打印也无效了! 解决方案

itextsharp读取pdf byte[]

问题描述 .Net,用itextsharp读取pdf文件后生成byte[],再Encoding.Getstring()得到字符串,如下:qBT0612TdETQq0.0375w2J0j10M[]0d36576m756576l75672.04l3672.04l36576lhWn0.80.80.8rg42576m750576l749.25575.25l42.75575.25lhf*42576m42.75575.25l42.75414.45l42413.7lhf*749.25414.45m42.754

iTextSharp生成PDF问题

问题描述 使用iTextSharp生成PDF时候,如果生成的像素尺寸大于14400就会出现以上异常Thepagesizemustbesmallerthan14400by14400不知是我的iTextSharp版本问题还是什么问题,请各位大神帮忙解答一下. 解决方案 解决方案二:iTextSharp生成时可以指定PageSize的,如PageSize.A4.解决方案三:我是指定大小的,不过一超过14400就会出现异常

itextsharp生成pdf后的直接打印问题

原文 itextsharp生成pdf后的直接打印问题 小弟这两天用itextsharp生成pdf文档,生成的pdf可以直接保存在指定路径的文件夹下,可是user不想保存,想要点一下button,就可以直接打印,我搞了半天也没找到合适的方法,还希望有做过这方面的,给些建议.多谢多谢啦 我的代码是这样的:  iTextSharp.text.Rectangle page = new Rectangle(683,850); iTextSharp.text.Document document = new