c#itextsharp根据模板导出pdf报表
⼀、前⾔
PDF⽂件在⽬前来说是⽐较流⾏的电⼦⽂档格式,在.Net framework 中⾝并不包含可以和pdf打交道的⽅法,也没有很好操作PDF的类库,所以我们需要对pdf进⾏编辑,加密,模板打印等操作不得不去找可⽤的第三⽅组件,这⾥就可以选择使⽤ITextSharp来实现,这个程序是JAVA⼯具IText的.Net版本。
准备:
1、
2、
简单的操作直接查看帮助⽂件,此处先省略后续考虑补充
⼆、itextsharp 使⽤
2.1 pdf模板
本次讲的是根据pdf模板导出数据,⾸先创建模板,我这⾥使⽤的⼯具是Adobe Acrobat 视图——⼯
具——准备表单,可以在需要赋值的地⽅放上⼀个⽂本框,把名字改成要⽤的名字。
这是编辑好后的效果
2.2 新建项⽬
添加引⽤
新建了⼀个导出数据测试窗体 load事件以及测试数据,
///<summary>
///模拟数据
///</summary>
DataTable dt;
private void frmDemo1_Load(object nder, 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帮助类
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.Clo();
}
}
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;
//设置⽀持中⽂字体
BaFont baFont = BaFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF", BaFont.ID
ENTITY_H, BaFont.NOT_EMBEDDED); pdfFormFields.AddSubstitutionFont(baFont);
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 = fal;
}
finally
{
if (pdfStamper != null)
{
pdfStamper.Clo();
}
if (pdfReader != null)
{
pdfReader.Clo();
}
}
return rsBool;
}
}
}
导出按钮事件
private void button1_Click(object nder, 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
这样⼀个⼩案例就完成了。
2.3 动态数据多页
实现步骤:
1、⾸先对数据动态导出在⼀个临时⽬录
2、然后将此⽬录⽂件合并成⼀个Pdf⽂件多页效果
3、清空临时⽬录数据
下⽅是测试数据
#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";