一、前言

  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(objectsender, EventArgs e){#region 模拟数据dt= newDataTable();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帮助类

usingiTextSharp.text.pdf;usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Text;namespaceitextsharpDemo
{/// <summary>///PDF导出类/// </summary>public classPdfLeadingHelper{/// <summary>///根据路径获取模板/// </summary>/// <param name="pdfTemplate"></param>/// <returns></returns>public static Dictionary<string, string> ReadForm(stringpdfTemplate){Dictionary<string, string> dic = new Dictionary<string, string>();PdfReader pdfReader= null;try{pdfReader= newPdfReader(pdfTemplate);AcroFields pdfFormFields=pdfReader.AcroFields;foreach (var de inpdfFormFields.Fields){dic.Add(de.Key,"");}}catch(Exception ex){dic= null;//记录日志 注释//LogHelper.Logger(LogLevel.Error, "pdf导出类发生异常:根据路径获取模板时异常" + ex.ToString(), ex);
}finally{if (pdfReader != null){pdfReader.Close();}}returndic;}///   ///向pdf模版填充内容,并生成新的文件///   ///模版路径///生成文件保存路径///标签字典(即模版中需要填充的控件列表)public static bool FillForm(string pdfTemplate, string newFile, Dictionary<string, string>dic){bool rsBool = true;PdfReader pdfReader= null;PdfStamper pdfStamper= null;try{pdfReader= newPdfReader(pdfTemplate);pdfStamper= new PdfStamper(pdfReader, newFileStream(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 indic){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();}}returnrsBool;}}
}

导出按钮事件

private void button1_Click(objectsender, EventArgs e){//dic 获取学生成绩表 Pdf导出模板string templetPath = System.Environment.CurrentDirectory + @"\学生成绩表.pdf";Dictionary<string, string> dic =PdfLeadingHelper.ReadForm(templetPath);#region 赋值 dicdic["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 = newSaveFileDialog();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= newDataTable();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);for (int i = 1; i < 2000; i++){dr=dt.NewRow();dr["number"] = 3 +i;dr["name"] = "测试人员" + (3 +i);dr["yw"] = "95";dr["sx"] = "95";dr["yy"] = "90";dr["pd"] = "90";dr["pe"] = "90";dt.Rows.Add(dr);}dataGridView1.DataSource= dt;

View Code

下方是合拼PDF方法

/// <summary>合并PDF</summary>/// <param name="fileList">PDF文件集合</param>/// <param name="outMergeFile">合并文件名</param>public static bool MergePDFFiles(string[] fileList, stringoutMergeFile){bool rsBool = true;try{List<PdfReader> readerList = new List<PdfReader>();//记录合并PDF集合iTextSharp.text.Document document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4); /*PageSize.A4.Rotate()横向*/PdfWriter writer= PdfWriter.GetInstance(document, newFileStream(outMergeFile, FileMode.Create));document.Open();PdfContentByte cb=writer.DirectContent;PdfImportedPage newPage;for (int i = 0; i < fileList.Length; i++){if (!string.IsNullOrEmpty(fileList[i])){PdfReader reader= newPdfReader(fileList[i]);int iPageNum =reader.NumberOfPages;for (int j = 1; j <= iPageNum; j++){document.NewPage();newPage=writer.GetImportedPage(reader, j);cb.AddTemplate(newPage,0, 0);}readerList.Add(reader);}}document.Close();//释放集合资源foreach (var rd inreaderList){rd.Dispose();}}catch(Exception){rsBool= false;}returnrsBool;}

View Code

导出按钮下新方法

 //dic 获取学生成绩表 Pdf导出模板string templetPath = System.Environment.CurrentDirectory + @"\学生成绩表.pdf";//临时目录文件string temporaryDirectory = System.Environment.CurrentDirectory + @"\DB\TemporaryDirectory\学生成绩表";SaveFileDialog dlg= newSaveFileDialog();dlg.FileName= "成绩单";dlg.DefaultExt= ".pdf";dlg.Filter= "Text documents (.pdf)|*.pdf";if (dlg.ShowDialog() ==DialogResult.OK){try{if (Directory.Exists(temporaryDirectory))//判断是否存在文件
{DirectoryInfo dir= new DirectoryInfo(temporaryDirectory);//存在清空文件夹及文件dir.Delete(true);}Directory.CreateDirectory(temporaryDirectory);int pageValue = 13;//一页多少行数据int page = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(dt.Rows.Count) / Convert.ToDecimal(pageValue)));//多少页for (int i = 1; i <= page; i++){#region 赋值 dicDictionary<string, string> dic =PdfLeadingHelper.ReadForm(templetPath);dic["className"] = textBox1.Text +i;for (int j = 1; j <= pageValue; j++){if (dic.ContainsKey("number_" +j)){int index = j - 1 + pageValue * (i - 1);if (index + 1 > dt.Rows.Count)//当超过了值break;#regiondic["number_" + j] = dt.Rows[index]["number"] + "";dic["name_" + j] = dt.Rows[index]["name"] + "";dic["yw_" + j] = dt.Rows[index]["yw"] + "";dic["sx_" + j] = dt.Rows[index]["sx"] + "";dic["yy_" + j] = dt.Rows[index]["yy"] + "";dic["pd_" + j] = dt.Rows[index]["pd"] + "";dic["pe_" + j] = dt.Rows[index]["pe"] + "";dic["remark_" + j] = dt.Rows[index]["remark"] + "";#endregion}}#endregion#region 保存到临时目录bool rsBool = PdfLeadingHelper.FillForm(templetPath, temporaryDirectory + @"\成绩单" + i + ".pdf", dic);//if (rsBool)//MessageBox.Show("第 " + i + " 页导出成功!!");//else//MessageBox.Show("第 " + i + " 页导出异常!!");#endregion}string[] files = Directory.GetFiles(temporaryDirectory, "*.pdf");//IComparer fileNameComparer = new FilesNameComparerClass();//List<string> list = files.ToList();//files.Sort(fileNameComparer);if (files.Length == 0){return;}//文件名排序 不加此排序会导致页内容不对files = files.OrderBy(s => int.Parse(System.Text.RegularExpressions.Regex.Match(Path.GetFileNameWithoutExtension(s), @"\d+").Value)).ToArray();//合并pdfbool rsBools =PdfLeadingHelper.MergePDFFiles(files, dlg.FileName);if(rsBools){MessageBox.Show("导出完成!!");}//删除临时文件DirectoryInfo di = newDirectoryInfo(temporaryDirectory);di.Delete(true);}catch(Exception ex){throw;}}

View Code

实现完成效果图如下:

本文档很多方法都是网上找的,简单的案例供大家参考下。

 

转载于:https://www.cnblogs.com/sbgh/p/9229774.html

c# itextsharp根据模板导出pdf报表相关推荐

  1. java按照模板导出pdf或者word

    一.java按照模板导出pdf (一)制作模板 1.在word里制作模板 因为PDF常用的软件不支持编辑,所以先用Word工具,如WPS或者Office新建一个空白Word文档,里面制作出自己想要的样 ...

  2. Jasper(2)——简单使用导出PDF报表

    接着上一次所说的,没看过的可跳转 Jasper(1)--入门 第一阶段:初步导出PDF Jasper报表设计 点击 Static Text,并拖动到 title 位置 然后双击此框,根据需要修改,可看 ...

  3. Tableau自动导出pdf报表作为附件自动发送邮件-BI自动化。

    一.目的: 1.每天定时从tableau导出pdf报表 2.每天自动定时发送邮件 二.实现的过程: 1.首先利用windows自带的记事本写好bat批处理文件,更多tableau可以看tableau ...

  4. Java 根据模板导出PDF

    文章目录 前言 思路一:直接导出pdf 使用itext模板导出pdf 思路二:先导出word再转成pdf 1)导出word 2)word转pdf 最终方案 ~~docx4j~~ spire.doc.f ...

  5. java根据模板导出pdf,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  6. PdfSharp -- 根据PDF模板导出PDF

    PdfSharp:v1.50.5147,.NET Framework:v4.5.1 一.PDF模板 在开始前,我觉得有必要简单说一下PDF模板 制作PDF模板的工具有很多,随便找一款就行(我这里用迅捷 ...

  7. java根据模板导出pdf,并将多个pdf合成一个

    前言 项目中,遇到这么一个需求:根据单个模板批量导出pdf,批量导出的pdf要合并成一个pdf进行打印.两个问题点:1.根据模板生成pdf.2.pdf合并 一.前期准备工作(准备pdf模板) 这个问题 ...

  8. jasperreports导出pdf报表时粗体的显示问题

    最近一直在做报表,用的是iReport3.7.3和jasperReport3.7.3,在导出pdf形式的报表时,文字的粗体效果出不来, 弄了大半天,查阅了很多资料,试了很多种方法,效果都不理想.下面总 ...

  9. java根据模板导出PDF详细教程(无bug版)

    题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word成功了:但是导出pdf相对麻烦了一点.两天的研究测试java导出PDF,终于成功了,期间走了不少弯路,今分享出来,欢迎大家有 ...

  10. Java中导入/导出excel,导出pdf报表信息

    1.项目中经常需要用到报表生成,信息导入数据库的功能.主要有以下几种. 2.其中比较简单的是 外部数据无需处理直接 导入数据库中,这种比较简单.直接利用Navicat数据库工具 导入外部.示例如下 1 ...

最新文章

  1. WeApp-Workflow:基于Gulp 的“微信小程序”前端开发工作流
  2. CommuntyServer架构分析
  3. 两个音轨合并_webm格式视频文件合并+weba音频文件无损合并
  4. java 简单事件的使用,如何正确的使用Java事件通知(1)
  5. Android笔记 使用Json从数据库读取数据+demo
  6. redux相关学习资源
  7. GeoTools——JTS空间操作
  8. 初中毕业能学习软件测试吗,我只是初中毕业而且23岁了会不会太晚我想学 – 手机爱问...
  9. Servlet工作原理解析
  10. macos同时运行多个版本php程序(nginx+php56+php72)
  11. CCbot是什么梗?
  12. 乱记春秋-或跃在渊 (苏阳飘零记)
  13. 红帽:商业模式比技术更重要
  14. 解决can't find -lGL的问题
  15. 看骰子的六个面需要多少次
  16. Android学习网站(1)
  17. error C2065: ‘salary‘ : undeclared identifier
  18. 了解AMD处理器的OPN编号
  19. python黑科技自动p图_自动P图神器来了,这些逆天小程序!
  20. linux 存储结构与磁盘划分详解

热门文章

  1. SQL Server 2005 express下载地址
  2. ArcGIS Python工具箱集成第三方模块的解决办法
  3. 1 Arduino开发软件和下载程序
  4. 服务式GIS实践与发展——REST 服务
  5. java sync 实现原理_JAVA 同步实现原理
  6. 一个迷你Excel查看编辑器,仅3.4M大小
  7. Ubuntu20安装卸载MySQL8.0
  8. Java基础知识点汇总
  9. 数据结构保研面试题整理(自用)
  10. 银行开发专业术语解释和银行系统开发架构的设计思想