zoukankan      html  css  js  c++  java
  • PDF生成类库

    from:https://blog.csdn.net/plean/article/details/8097015

    最近忙了两个星期的任务了     iTextSharp.dll是个开源的用于生成pdf的类库了  项目中我们只需要引用就可以了    说实话确实很好用   因为自己的英文水平实在有限    所以没去看API了   找资料上费了不少功夫    因为网上的资料大部分都只是介绍一些基础的应用   所以很多地方还得靠自己慢慢来摸索了    现在将自己生成的pdf代码奉献给大家   希望对有用到的朋友一些帮助   给的代码中有些属性和方法不明白的需要大家自己去找资料参考了    代码里面就不解释了   

      代码量有一些   可能还不是很完善  毕竟自己的能力还是很有限   所以代码部分还有一些需要优化    不过生成是没问题的   就当给大家参考吧   当然有高人提些意见还是很不错的  

       先看图片吧 我需要生成的pdf是什么样的:

    先看图片吧 我需要生成的pdf是什么样的:

     

     
    
    using iTextSharp.text;
    using iTextSharp.text.pdf;
    using System.IO;
    using System.Text;
    using System.Xml;
    
    private static float bankai;//页面宽度的一半
            private static float bangao;//页面高度的一半
            private static float[] left = { 75, 1100 };
            private static float[] rightwidth = { 500, 675 };
            private static float[] imageWidth = { 600, 0 };
            private static float[] imgWidth = { 0, 600 };
            private static bool boo = true;//当目录数大于10则进行分栏
            private static int column = 0;//0为左边1为右边
    
    public void CreatePDF(DataTable dt,string imagePath,string pdfPath)//第一个参数是是生成pdf所需要的内容,第二个是生成pdf所需要的图片路径,第三个是生成pdf后存放的路径
            {
                int status = 1;
                //获取图片路径
                string lift = imagePath+ @"/lift.jpg";
                string right = imagePath+ @"/right.jpg";
                string top1 = imagePath + @"/top1.jpg";
                string top2 = imagePath + @"/top2.jpg";
                Document document = new Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);//定义pdf大小,设置上下左右边距
                Rectangle rect = new Rectangle(1190, 841);//设置整个版面的宽度和高度
                document.SetPageSize(rect);
                bankai = document.PageSize.Width / 2;
                bangao = document.PageSize.Height / 2;
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath + DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf", FileMode.Create));//生成pdf路径,创建文件流
                document.Open();
                PdfContentByte cb = writer.DirectContent;
                ColumnText ct = new ColumnText(cb);
                iTextSharp.text.Image img4 = iTextSharp.text.Image.GetInstance(top1);//定位背景图片1
                img4.ScalePercent(48);
                cb.AddImage(img4, bankai, 0, 0, img4.ScaledHeight, 0, 715);
                iTextSharp.text.Image img5 = iTextSharp.text.Image.GetInstance(top2);//定位背景图片2
                img5.ScalePercent(48);
                cb.AddImage(img5, img5.ScaledWidth, 0, 0, img5.ScaledHeight, 0, 683);
                Color c = new Color(int.Parse("6c423c", System.Globalization.NumberStyles.AllowHexSpecifier));//设置颜色
                BaseFont bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//设置字体
                cb.Stroke();
                cb.BeginText();
                cb.SetFontAndSize(bf, 20);
                cb.SetColorFill(c);
                cb.SetTextMatrix(140, 610);
                cb.ShowText("卷一");//定位卷一
                cb.EndText();
                int pagenum = 0;
                bool boo = true;//当目录数大于10则进行分栏
                bool bo = true;
                int newpage = 0;
                int newpageHeight = 1;
                int Count = 0;
                int PageIndex = 2;
                bool pageBool = false;
                //对标题数目进行判断  当目录大于左栏的时候  定位于右栏   当标题大于右栏时新建一个页面  依次循环
                for (int i = 0; i < dt.Rows.Count; i++)//当目录数目过大,对目录进行分页
                {
                    if (i != 0)
                    {
                        if (i % 10 == 0)//每一栏为10个目录
                        {
                            if (bo == false)//当目录大于一页的时候新建一个页面
                            {
                                boo = true;
                                cb.Stroke();
                                document.NewPage();
                                newpage = -i;
                                newpageHeight = 70;
                                iTextSharp.text.Image imglift = iTextSharp.text.Image.GetInstance(lift);//定位左边的图片
                                imglift.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
                                cb.AddImage(imglift, 21, 0, 0, 842, 30, -22);
                            }
                            else
                            {
                                boo = false;
                                newpage = -i;
                            }
                        }
                    }
                    bo = boo;
                    //因为不确定标题的长度为多少 所以不能固定死  而且因为pdf里面对字体的长度有限制比如-和字符在里面的显示长度是不同的   所以根据长度来显示肯定不行了 
                    //因此只能判断他们在pdf中的像素来确定他们的长度  我的办法是先获得-的像素 然后获得标题的像素  然后用总像素减去标题的像素和页码像素度再除以-的像素
                    //就得到-的个数 然后再添加到标题和页码中就可以了
                    string fuhao = "-";
                    float fuhaochangdu = bf.GetWidthPoint(fuhao, (float)12);//得到-的像素
                    float biaotichangdu;
                    if (dt.Rows[i]["Title"].ToString().Length > 26)//判断目录长度是否大于30
                    {
                        string jiequTitle = dt.Rows[i]["Title"].ToString().Substring(0, 26) + "……";//大于30加......
                        biaotichangdu = bf.GetWidthPoint(jiequTitle, (float)12);//获得标题的像素
                        cb.Stroke();
                        cb.BeginText();
                        cb.SetFontAndSize(bf, 12);
                        cb.SetColorFill(c);
                        if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//对标题进行定位,标题位于左栏
                        else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//当标题大于左栏的时候定位于右栏
                        cb.ShowText(jiequTitle);
                        cb.EndText();
                    }
                    else//如果标题长度大于30则添加......
                    {
                        biaotichangdu = bf.GetWidthPoint(dt.Rows[i]["Title"].ToString(), (float)12);
                        cb.Stroke();
                        cb.BeginText();
                        cb.SetFontAndSize(bf, 12);
                        cb.SetColorFill(c);
                        if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//对标题进行定位
                        else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }
                        cb.ShowText(dt.Rows[i]["Title"].ToString());//给目录添加标题
                        string abc = dt.Rows[i]["Title"].ToString();
                        cb.EndText();
                    }
                    int changdu = (int)((bankai - 210 - biaotichangdu) / fuhaochangdu);//获得-的个数
                    StringBuilder sb = new StringBuilder();
                    for (int j = 0; j < changdu; j++)//判断标题与索引之间所需要的-
                    {
    
                        sb.Append(fuhao);//依次添加-
                    }
                    cb.Stroke();
                    cb.BeginText();
                    cb.SetFontAndSize(bf, 12);
                    cb.SetColorFill(c);
                    if (!bo) { cb.SetTextMatrix(140 + biaotichangdu + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左栏定位-
                    else { cb.SetTextMatrix(140 + biaotichangdu, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右栏定位-
                    cb.ShowText(sb.ToString());//给目录中间添加-
                    cb.EndText();
                    int page = PDFPageNum(dt, i);//获得内容的页码
                    cb.Stroke();
                    cb.BeginText();
                    cb.SetFontAndSize(bf, 10);
                    cb.SetColorFill(c);
                    if (!bo) { cb.SetTextMatrix(bankai - 70 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左栏定位页码
                    else { cb.SetTextMatrix(bankai - 70, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右栏定位页码
                    cb.ShowText((PageIndex).ToString());//显示页码
                    cb.EndText();
                    if (page == 1) { pagenum = 0; PageIndex += 2; }//给目录添加页码
                    else if (page == 2) { pagenum = 1; PageIndex += 3; }
                    else { pagenum = 1; PageIndex += page + 1; }//目录的页数
                    Color color = new Color(int.Parse("9f9fa0", System.Globalization.NumberStyles.AllowHexSpecifier));
                    cb.Stroke();
                    cb.BeginText();
                    cb.SetFontAndSize(bf, 10);
                    cb.SetColorFill(color);
                    if (!bo) { cb.SetTextMatrix(140 + bankai, 510 + newpageHeight - ((i - 1 + newpage) * 50)); }
                    else { cb.SetTextMatrix(140, 505 + newpageHeight - ((i - 1 + newpage) * 50)); }
                    cb.ShowText(dt.Rows[i]["banmianming"].ToString());//给目录添加版面名称
                    cb.EndText();
                }
                //因为我的pdf要求是先版面然后文章了   如果目录在左边的话版面就在右边了  第二页左边就为文章  右边又为版面   一次类推了  如果目录占到了右边
                //那么第二页左边为版面右边为文章了  
                if (!boo)//判断目录是否生成新的页面
                {
                    column = 1;
                    pageBool = false;
                }
                else//没有生成页面则添加版面和页码
                {
                    iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, 0, 0);
                    cb.Stroke();
                    cb.BeginText();
                    cb.SetFontAndSize(bf, 11);
                    cb.SetTextMatrix(1147, 45);
                    cb.ShowText("1");
                    cb.EndText();
                }

        后面将对这个目录进行补充   关于其中的int page = PDFPageNum(dt, i);//获得内容的页码  方法所要做的是什么

  • 相关阅读:
    VPC/VM/VBOX安装GHOST版的无法启动系统
    在虚拟机中使用Ghost系统盘安装
    用vmware安装gho文件心得
    VC中Error spawning cl.exe错误的解决方法.
    C语言屏幕打印,再删除打印的内容
    bat根据星期启动程序
    ARP命令详解
    bat生成vbs通过注册表禁用或启用USB端口
    OracleDesigner学习笔记1――安装篇
    MarkMonitor 目前最安全的域名注册商,因此,世界500强网站中的22%域名托管于markmonitor公司
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/11003105.html
Copyright © 2011-2022 走看看