zoukankan      html  css  js  c++  java
  • 利用ItextSharp 生成PDF文档改进版

    导入的ItextSharp.dll一定要是较高的版本

    数据库表结构

    生成的PDF样式

    代码:

    namespace WebPDF
    {
        public partial class _Default : System.Web.UI.Page
        {
           /// <summary>
           /// 初始化加载数据
           /// </summary>
           /// <param name="sender"></param>
           /// <param name="e"></param>
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    ImportPdf();
                }
            }
            #region 绑定数据
            /// <summary>
            /// 绑定数据
            /// </summary>
            /// <returns></returns>
         public DataTable BindData()
         {
             string connection = "Data Source = orcl;Persist Security Info=True;User ID=scott;Password=123;Unicode=True";
            
             string oracleSql = "select * from EMP";
             using (OracleConnection con = new OracleConnection(connection))  //建立数据库链接   
            {
                 con.Open();
                 using (OracleCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = oracleSql;
                    DataSet ds = new DataSet();
                    OracleDataAdapter da = new OracleDataAdapter(cmd);
                     da.Fill(ds);
                    if (ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0)
                    {
                        return new DataTable();
                     }
                     return ds.Tables[0];
                }
            }
        }
         #endregion
     
         #region 数据格式化
            /// <summary>
            /// 导出PDF格式
            /// </summary>
         public void ImportPdf()
         {
             DataTable dt = BindData();
             GridView1.DataSource = dt;
             GridView1.DataBind();
             DataTable newdt = new DataTable();
            newdt.Columns.Add("编号", typeof(string));
             newdt.Columns.Add("名称", typeof(string));
             newdt.Columns.Add("职业", typeof(string));
              newdt.Columns.Add("薪资", typeof(string));
             newdt.Columns.Add("日期", typeof(string));
            newdt.Columns.Add("单价", typeof(string));
              newdt.Columns.Add("金额", typeof(string));
             newdt.Columns.Add("部门号", typeof(string));
             decimal deci = 0.00M;
             for (int i = 0; i < dt.Rows.Count; i++)
             {
                 DataRow dr = newdt.NewRow();
                 dr["编号"] = dt.Rows[i]["EMPNO"].ToString();
                 dr["名称"] = dt.Rows[i]["ENAME"].ToString();
                 dr["职业"] = dt.Rows[i]["JOB"].ToString();
                 dr["薪资"] = dt.Rows[i]["MGR"].ToString();
                 dr["日期"] = dt.Rows[i]["HIREDATE"].ToString();
                 dr["单价"] = dt.Rows[i]["SAL"].ToString();
                 dr["金额"] = dt.Rows[i]["COMM"].ToString();
                 dr["部门号"] = dt.Rows[i]["DEPTNO"].ToString();
                 deci = deci + Decimal.Parse(dt.Rows[i]["COMM"].ToString());
                 newdt.Rows.Add(dr);
              }
             CreatePdf(newdt, deci, "国土资源局");
         }
        #endregion
     
            /// <summary>
            /// 创建PDF文档
            /// </summary>
            /// <param name="dt">table</param>
         /// <param name="COMM">合计金额</param>
            /// <param name="departmentName">组部名称副标题</param>
         public void CreatePdf(DataTable dt, decimal COMM, string departmentName)
        { 
            //初始化一个目标文档类
            Document document = new Document(PageSize.A4, 5, 5, 20, 20);
            //调用PDF的写入方法流
            //注意FileMode-Create表示如果目标文件不存在,则创建,如果已存在,则覆盖。
             PdfWriter writer = PdfWriter.GetInstance(document, new System.IO.FileStream(HttpContext.Current.Server.MapPath("pdfsample.pdf"), System.IO.FileMode.Create));
             //表格列字体
           BaseFont bfChinese = BaseFont.CreateFont(@"C:WINDOWSFontssimsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
             Font fontChinese1 = new Font(bfChinese, 10);
             Font ftitle = new Font(bfChinese, 16, Font.NORMAL, BaseColor.BLACK);
             Font fontRukuHeader = new Font(bfChinese, 14, Font.NORMAL, BaseColor.BLACK);
             Font footerChinese = new Font(bfChinese, 12, Font.NORMAL, BaseColor.BLACK);
            //打开文档
             document.Open();
             PdfPTable table = new PdfPTable(dt.Columns.Count + 1);
           //设置标题
             Paragraph title = new Paragraph("中国信息部", ftitle);
             title.Alignment = Element.ALIGN_CENTER;//居中
             document.Add(title);
             //组部标题
             PdfPCell middleCell = new PdfPCell(new Phrase(departmentName + "信息库", fontRukuHeader));
             middleCell.Colspan = 6;
             middleCell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT;
             middleCell.PaddingRight = 6;
             middleCell.PaddingTop = 6;
             middleCell.PaddingBottom = 4;
             middleCell.BorderWidthBottom = 0;
             middleCell.BorderWidthLeft = 0;
             middleCell.BorderWidthRight = 0;
             middleCell.BorderWidthTop = 0;
             table.AddCell(middleCell);
            //序号
             PdfPCell cellNumber = new PdfPCell(new Phrase("" + DateTime.Now.ToString("yyyyMMddhhmmss") + "", footerChinese));
             cellNumber.Colspan = 3;
             cellNumber.PaddingRight = 6;
              cellNumber.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
             cellNumber.BorderWidthTop = 0;
              cellNumber.BorderWidthRight = 0;
              cellNumber.BorderWidthBottom = 0;
            cellNumber.BorderWidthLeft = 0;
             table.AddCell(cellNumber);
            //类别
             PdfPCell headerleftCell = new PdfPCell(new Phrase("类别", footerChinese));
            headerleftCell.Colspan = 4;
             headerleftCell.BorderWidthLeft = 0;
             headerleftCell.BorderWidthRight = 0;
             headerleftCell.BorderWidthTop = 0;
            headerleftCell.PaddingBottom = 4;
             headerleftCell.HorizontalAlignment = 0;
            headerleftCell.BorderWidth = 0;
             table.AddCell(headerleftCell);
     
             PdfPCell headerMiddleCell = new PdfPCell(new Phrase(DateTime.Now.ToString("yyyy年MM月dd日"), footerChinese));
            headerMiddleCell.Colspan = 5;
             headerMiddleCell.HorizontalAlignment = 0;
            headerMiddleCell.BorderWidthTop = 0;
             headerMiddleCell.BorderWidthRight = 0;
             headerMiddleCell.BorderWidthLeft = 0;
            headerMiddleCell.PaddingBottom = 4;
             headerMiddleCell.BorderWidth = 0;
             table.AddCell(headerMiddleCell);
    
             table.DefaultCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
             table.DefaultCell.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
             table.DefaultCell.VerticalAlignment = PdfPCell.ALIGN_MIDDLE;
            table.WidthPercentage = 100;
             for (int i = 0; i < dt.Columns.Count; i++)
             {
                 table.AddCell(new Phrase(dt.Columns[i].ColumnName, footerChinese));
             }
             PdfPCell cell = new PdfPCell(new Phrase("此
    联
    交
    资
    源
    部", fontChinese1));
             cell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
             cell.VerticalAlignment = PdfPCell.ANNOTATION;
             cell.BorderWidth = 0;
             cell.Colspan = 1;//合并一列
             cell.Rowspan = 3 + dt.Rows.Count; //合并行
             table.AddCell(cell);
            table.DefaultCell.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
             for (int i = 0; i < dt.Rows.Count; i++)
             {
                 for (int j = 0; j < dt.Columns.Count; j++)
                 {
                     table.AddCell(new Phrase(dt.Rows[i][j].ToString(), footerChinese));
                 }
             }
            //合计一列单元格
             PdfPCell lastcell = new PdfPCell(new Phrase("   合   计   ", footerChinese));
             lastcell.Colspan = 2;//合并两列
             lastcell.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
            table.AddCell(lastcell);
           //第二单元格
             lastcell = new PdfPCell(new Phrase("", footerChinese));
             table.AddCell(lastcell);
             //第三单元格
             lastcell = new PdfPCell(new Phrase("", footerChinese));
            table.AddCell(lastcell);
            //第四单元格
             lastcell = new PdfPCell(new Phrase("", footerChinese));
             table.AddCell(lastcell);
             //第五单元格
            lastcell = new PdfPCell(new Phrase("", footerChinese));
             table.AddCell(lastcell);
             //第六单元格一列属于 合计值信息
             lastcell = new PdfPCell(new Phrase(COMM.ToString(), footerChinese));
            lastcell.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
            table.AddCell(lastcell);
            //第七单元格
             lastcell = new PdfPCell(new Phrase("", footerChinese));
            table.AddCell(lastcell);
            //底部单元格信息 部门
            PdfPCell footerCell = new PdfPCell(new Phrase("部门负责人", footerChinese));
            footerCell.Colspan = 2;//合并两列
            footerCell.PaddingLeft = 4;
             footerCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
             table.AddCell(footerCell);
             //底部单元格信息 记账
            footerCell = new PdfPCell(new Phrase("记账", footerChinese));
            footerCell.Colspan = 2;
             footerCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
             table.AddCell(footerCell);
             //底部单元格信息 信管人员
             footerCell = new PdfPCell(new Phrase("信管人员", footerChinese));
             footerCell.Colspan = 4;//合并四列
             footerCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
             table.AddCell(footerCell);
             document.Add(table);//文档填充表格信息
             document.Close();//关闭文档
             //定义一个存储路径的文档名
             string fullFileName = System.Web.HttpContext.Current.Server.MapPath("pdfsample.pdf");
             Byte[] btArray = WriteToPdf(fullFileName, DateTime.Now.ToString("yyyyMMddhhmmss"), bfChinese);
             fullFileName = Server.MapPath("pdfsample.pdf");
             FileStream fs = new FileStream(fullFileName, FileMode.Create, FileAccess.Write);
             fs.Write(btArray, 0, btArray.Length);
             fs.Flush();
             fs.Close();
             fullFileName = Server.MapPath("pdfsample.pdf");
             FileInfo downloadFile = new FileInfo(fullFileName);
             Response.Clear();
             Response.ClearHeaders();
             Response.Buffer = false;
             Response.ContentType = "application/octet-stream";
            Response.AppendHeader("Content-Disposition", "attachment;filename=pdfsample.pdf");
             Response.AppendHeader("Content-Length", downloadFile.Length.ToString()); System.Web.HttpContext.Current.Response.WriteFile(downloadFile.FullName);
             Response.WriteFile(downloadFile.FullName);
             Response.Flush();
             Response.End();
         }
         /// <summary>
         /// 写入pdf文档
         /// </summary>
         /// <param name="sourceFile"></param>
         /// <param name="stringToWriteToPdf"></param>
         /// <param name="bfChinese"></param>
         /// <returns></returns>
         public static byte[] WriteToPdf(string sourceFile, string stringToWriteToPdf, BaseFont bfChinese)
         {
             PdfReader reader = new PdfReader(sourceFile);
             using (MemoryStream stream = new MemoryStream())
             {
                 PdfStamper pdfstamper = new PdfStamper(reader, stream);
                 for (int i = 1; i <= reader.NumberOfPages; i++)
                 {
                     Rectangle pageSize = reader.GetPageSizeWithRotation(i);
                     PdfContentByte pdfpageContents = pdfstamper.GetUnderContent(i);
                     pdfpageContents.BeginText();
                     pdfpageContents.SetFontAndSize(bfChinese, 40);
                     pdfpageContents.SetRGBColorFill(192, 192, 192);
                    float textAngle = 45.0f;
                     pdfpageContents.ShowTextAligned(PdfContentByte.ALIGN_CENTER, stringToWriteToPdf, pageSize.Width / 2, pageSize.Height / 2, textAngle);
                     pdfpageContents.EndText();
                 }
                pdfstamper.FormFlattening = true;
                pdfstamper.Close();
                 reader.Close();
                 return stream.ToArray();
             }
        }
        }
    }
    View Code
  • 相关阅读:
    Python爬取+BI分析后,微博求助患者的眼泪,全被数据看见了
    BZOJ4321 queue2
    BZOJ4321 queue2
    BZOJ4321 queue2
    Oracle字段根据逗号分割查询数据
    Oracle字段根据逗号分割查询数据
    Oracle字段根据逗号分割查询数据
    Oracle字段根据逗号分割查询数据
    基于Web实现在线绘画拓扑图[GraphEditor]
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/Warmsunshine/p/3520480.html
Copyright © 2011-2022 走看看