c# itextsharp根据模板导出pdf报表

一、前言

  PDF文件在目前来说是比较流行的电子文档格式,在.Net framework 中身并不包含可以和pdf打交道的方法,也没有很好操作PDF的类库,所以我们需要对pdf进行编辑,加密,模板打印等操作不得不去找可用的第三方组件,这里就可以选择使用ITextSharp来实现,这个程序是JAVA工具IText的.Net版本。

准备:

    1、pdf编辑工具 中文帮助文档

    2、 itextsharp.dll  点击下载

简单的操作直接查看帮助文件,此处先省略 后续考虑补充

二、itextsharp 使用

 2.1 pdf模板

   本次讲的是根据pdf模板导出数据,首先创建模板,我这里使用的工具是Adobe Acrobat   视图——工具——准备表单,可以在需要赋值的地方放上一个文本框,把名字改成要用的名字。

这是编辑好后的效果

 2.2 新建项目

 添加引用

新建了一个导出数据测试窗体  load事件以及测试数据,

/// <summary>
        /// 模拟数据
        /// </summary>
        DataTable dt;
        private void frmDemo1_Load(object sender, EventArgs e)
        {
            #region 模拟数据

            dt = new DataTable();

            dt.Columns.Add("number", typeof(string));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("yw", typeof(string));
            dt.Columns.Add("sx", typeof(string));
            dt.Columns.Add("yy", typeof(string));
            dt.Columns.Add("pd", typeof(string));
            dt.Columns.Add("pe", typeof(string));
            dt.Columns.Add("remark", typeof(string));

            DataRow dr = dt.NewRow();
            dr["number"] = "1";
            dr["name"] = "小明";
            dr["yw"] = "95";
            dr["sx"] = "90";
            dr["yy"] = "75";
            dr["pd"] = "80";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["number"] = "2";
            dr["name"] = "小红";
            dr["yw"] = "100";
            dr["sx"] = "90";
            dr["yy"] = "85";
            dr["pd"] = "100";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["number"] = "3";
            dr["name"] = "小芳";
            dr["yw"] = "95";
            dr["sx"] = "95";
            dr["yy"] = "90";
            dr["pd"] = "90";
            dr["pe"] = "90";
            dt.Rows.Add(dr);

            dataGridView1.DataSource = dt;
            #endregion

        }
View Code

封装了一个 导出Pdf帮助类

using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace itextsharpDemo
{
    /// <summary>
    /// PDF导出类
    /// </summary>
    public class PdfLeadingHelper
    {
        /// <summary>
        /// 根据路径获取模板
        /// </summary>
        /// <param name="pdfTemplate"></param>
        /// <returns></returns>
        public static Dictionary<string, string> ReadForm(string pdfTemplate)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            PdfReader pdfReader = null;
            try
            {
                pdfReader = new PdfReader(pdfTemplate);
                AcroFields pdfFormFields = pdfReader.AcroFields;
                foreach (var de in pdfFormFields.Fields)
                {
                    dic.Add(de.Key, "");
                }
            }
            catch (Exception ex)
            {
                dic = null;
                //记录日志 注释
                // LogHelper.Logger(LogLevel.Error, "pdf导出类发生异常:根据路径获取模板时异常" + ex.ToString(), ex);
            }
            finally
            {
                if (pdfReader != null)
                {
                    pdfReader.Close();
                }
            }
            return dic;
        }

        ///   
        /// 向pdf模版填充内容,并生成新的文件  
        ///   
        /// 模版路径  
        /// 生成文件保存路径  
        /// 标签字典(即模版中需要填充的控件列表)  
        public static bool FillForm(string pdfTemplate, string newFile, Dictionary<string, string> dic)
        {
            bool rsBool = true;
            PdfReader pdfReader = null;
            PdfStamper pdfStamper = null;
            try
            {
                pdfReader = new PdfReader(pdfTemplate);
                pdfStamper = new PdfStamper(pdfReader, new FileStream(
                 newFile, FileMode.Create));
                AcroFields pdfFormFields = pdfStamper.AcroFields;
                //设置支持中文字体  
                BaseFont baseFont = BaseFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 
                pdfFormFields.AddSubstitutionFont(baseFont);

                foreach (var de in dic)
                {
                    pdfFormFields.SetField(de.Key, de.Value + "");
                }
                pdfStamper.FormFlattening = true;
            }
            catch (Exception ex)
            {
                //记录日志 注释
               // LogHelper.Logger(LogLevel.Error, "pdf导出类发生异常:向pdf模版填充内容,并生成新的文件时异常"+ex.ToString(), ex);
                rsBool = false;
            }
            finally
            {
                if (pdfStamper != null)
                {
                    pdfStamper.Close();
                }
                if (pdfReader != null)
                {
                    pdfReader.Close();
                }
            }
            return rsBool;
        }

    }
}

导出按钮事件

private void button1_Click(object sender, EventArgs e)
        {
            //dic 获取学生成绩表 Pdf导出模板
            string templetPath = System.Environment.CurrentDirectory + @"\学生成绩表.pdf";
            Dictionary<string, string> dic = PdfLeadingHelper.ReadForm(templetPath); 
            
            #region 赋值 dic

            dic["className"] = textBox1.Text;
            
            for (int i = 1; i <= dt.Rows.Count; i++)
            {
                if (dic.ContainsKey("number_" + i))
                {
                    dic["number_" + i] = dt.Rows[i-1]["number"] +"";
                    dic["name_" + i] = dt.Rows[i-1]["name"] + "";
                    dic["yw_" + i] = dt.Rows[i-1]["yw"] + "";
                    dic["sx_" + i] = dt.Rows[i-1]["sx"] + "";
                    dic["yy_" + i] = dt.Rows[i-1]["yy"] + "";
                    dic["pd_" + i] = dt.Rows[i-1]["pd"] + "";
                    dic["pe_" + i] = dt.Rows[i-1]["pe"] + "";
                    dic["remark_" + i] = dt.Rows[i-1]["remark"] + "";
                }
            }



            #endregion

            //保存
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.FileName = "成绩单";
            dlg.DefaultExt = ".pdf";
            dlg.Filter = "Text documents (.pdf)|*.pdf";
            if (dlg.ShowDialog() == DialogResult.OK)
            {


                bool rsBool = PdfLeadingHelper.FillForm(templetPath, dlg.FileName, dic);

                if (rsBool)
                {
                    MessageBox.Show("导出成功!!");
                }
            }
        }

先获取pdf模板变量,Dictionary<string, string> dic 键值对类型

赋值对应dic

保存成新pdf

这样一个小案例就完成了。

 

猜你喜欢

转载自www.cnblogs.com/sbgh/p/9229774.html