c#生成PDF准考证
项目中需要做一个生成PDF准考证的功能,在这里跟大家分享一下思路。。
1.首先是下载Adobe Acrobat 9 Pro,安装破解(高版本的貌似破解,不了,自带正版意识的略过。。随意下载)
2.新建模板。。下图是个演示版本,客户要求在一页显示四个准考证, 我实际上是做了4个模板,分别有1,2,3,4个准考证模板在上面
注意的是:一定不要设置错域属性,开发的时候,不小心把座位号 设置成了 图片域,死活填充不上数据其余都可以,。。。应该设置为文本域

3.查询数据库拿到考生信息,放到一个List集合中
4.以4为单位进行循环,分别找对应的准考证模板,进行数据填充,特别注意的是每次都要根据个数找到对应的模板进行填充
5.每次生成一个PDF文件,记录文件名
6.最后进行文件的合并。。
7.用到的插件 itextsharp,大家抖动
8.核心代码。。
1.传递考生信息进去,返回需要填充的数据。。。(这个地方,我创建的模板上 命名规则都是统一的,第一个准考证序号是 name1,第二个是name2....以此类推)
public Dictionary<string, string> ReadForm(List<ExamInfoEntity> list)
{
string pdfTemplate = string.Empty;
string baseTemplatePath = @"D:\wangmj\fileserver\pdftemplate";
if (CheckUtil.CheckList(list))//根据传递集合元素个数,对应不同的PDF模板文件
{
pdfTemplate = Path.Combine(baseTemplatePath, "zkztemplate" + list.Count + ".pdf");
}
Dictionary<string, string> dic = new Dictionary<string, string>();
string basePath = ConfigurationManager.AppSettings["picpath"];// @"D:\Program Files (x86)\Apache Software Foundation\Tomcat 7.0\webapps\pichouse\pic\pfile";
PdfReader pdfReader = null;
try
{
pdfReader = new PdfReader(pdfTemplate);
AcroFields pdfFormFields = pdfReader.AcroFields;
string name = string.Empty;//姓名
string zkzh = string.Empty;//准考证号
string kaochang = string.Empty;//考场
string zhiyegongzhong = string.Empty;
string jinengdengji = string.Empty;
string zuoweihao = string.Empty;
string identify = string.Empty;
string workunit = string.Empty;
string kstime = string.Empty;
string ksaddress = string.Empty;
string Image = string.Empty;
string photopath = string.Empty;
for (int i = 0; i < list.Count; ++i)
{
//
name = string.Format("表单1[0].#subform[0].name{0}[0]", i + 1);
zkzh = string.Format("表单1[0].#subform[0].zkzh{0}[0]", i + 1);
kaochang = string.Format("表单1[0].#subform[0].kaochang{0}[0]", i + 1);
zhiyegongzhong = string.Format("表单1[0].#subform[0].zhiyegongzhong{0}[0]", i + 1);
jinengdengji = string.Format("表单1[0].#subform[0].jinengdengji{0}[0]", i + 1);
zuoweihao = string.Format("表单1[0].#subform[0].zuoweihao{0}[0]", i + 1);
identify = string.Format("表单1[0].#subform[0].identify{0}[0]", i + 1);
workunit = string.Format("表单1[0].#subform[0].workunit{0}[0]", i + 1);
kstime = string.Format("表单1[0].#subform[0].kstime{0}[0]", i + 1);
ksaddress = string.Format("表单1[0].#subform[0].ksaddress{0}[0]", i + 1);
Image = string.Format("表单1[0].#subform[0].Image{0}[0]", i + 1); dic.Add(name, list[i].name);
dic.Add(zkzh, list[i].zkzh);
dic.Add(kaochang, list[i].kaochang);
dic.Add(zhiyegongzhong, list[i].zhiyegongzhong);
dic.Add(jinengdengji, list[i].jinengdengji);
dic.Add(zuoweihao, list[i].seat);
dic.Add(identify, list[i].identify);
dic.Add(workunit, list[i].workunit);
dic.Add(kstime, list[i].kstime);
dic.Add(ksaddress, list[i].ksaddress);
photopath = Path.Combine(basePath, list[i].photo);
dic.Add(Image, photopath);
}
}
catch (Exception ex)
{
//LogHelper.Error(ex.Message);
}
finally
{
if (pdfReader != null)
{
pdfReader.Close();
}
}
return dic;
}
2.填充pdf模板。。
/// <summary>
/// 填充模板
/// </summary>
/// <param name="pdfTemplate">pdf模板的全路径</param>
/// <param name="newFile">生成的pdf路径</param>
/// <param name="dic"></param>
public static void FillForm(string pdfTemplate, string newFile, Dictionary<string, string> dic)
{
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.EMBEDDED);
pdfFormFields.AddSubstitutionFont(baseFont);
foreach (KeyValuePair<string, string> de in dic)
{
if (de.Key.Contains("Image"))
{
insertImage(pdfStamper, pdfFormFields, de.Key, de.Value);
}
else
{
pdfFormFields.SetField(de.Key, de.Value);
} }
pdfStamper.FormFlattening = true;
}
catch (Exception ex)
{
//LogHelper.Error(ex.Message);
}
finally
{
if (pdfStamper != null)
{
pdfStamper.Close();
}
if (pdfReader != null)
{
pdfReader.Close();
}
}
}
3.填充图片的方法
/// <summary>
/// 填充图片
/// </summary>
/// <param name="ps"></param>
/// <param name="s">域集合?</param>
/// <param name="filedname">图片域的名称</param>
public static void insertImage(PdfStamper ps, AcroFields s, string filedname, string imagefilename)
{
try
{
List<AcroFields.FieldPosition> list = (List<AcroFields.FieldPosition>)s.GetFieldPositions(filedname);
Rectangle signRect = list[0].position; Image image = Image.GetInstance(imagefilename);
PushbuttonField pushbuttonField = s.GetNewPushbuttonFromField(filedname);
pushbuttonField.Image = (image);
PdfFormField editFormField = pushbuttonField.Field;
s.ReplacePushbuttonField(filedname, editFormField); }
catch (Exception e)
{
// TODO Auto-generated catch block
}
}
合并PDF文件的方法
private string MergePDF(List<string> list)
{
string basePath = @"D:\fileserver\pdfzkz";
string save_path = Path.Combine(basePath, "准考证.pdf");
Document document = new Document();
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(save_path, FileMode.Create));
document.Open();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage newPage;
PdfReader readert = null;
List<PdfReader> readerList = new List<PdfReader>();
for (int k = 0; k < list.Count; k++)
{
readert = new PdfReader(list[k]);
document.NewPage();
int iPageNum = readert.NumberOfPages;
for (int j = 1; j <= iPageNum; j++)
{
document.NewPage();
newPage = writer.GetImportedPage(readert, j);
cb.AddTemplate(newPage, 0, 0);
}
readerList.Add(readert);
}
try
{
if (document.IsOpen())
{
document.Close();
}
foreach (var rd in readerList)//清理占用
{
rd.Dispose();
} }
catch(Exception ex)
{
}
return save_path;
}
c#生成PDF准考证的更多相关文章
- java生成pdf
		介绍 本篇博客主要是为了介绍如何使用:flying-saucer+itext+freemark实现导出复杂点的pdf文件. 思路 先把pdf的内容以html形式准备好 使用freemarker将htm ... 
- 利用Java动态生成 PDF 文档
		利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ... 
- html 生成pdf
		HTML生成PDF(c#) 最近因为工作需要,小小的研究了一下HTML生成PDF的方法,这方面的内容很多,但要么是不尽如人意的方法,要么就是那种收费的类库!为了广大.neter的福利,把自己的一点小小 ... 
- iTextSharp生成pdf的一个简单例子
		效果图: 参考:http://www.cnblogs.com/CareySon/archive/2011/11/09/2243496.html http://www.cnblogs.com/julyl ... 
- 生成 PDF 全攻略【2】在已有PDF上添加内容
		项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ... 
- PHP 生成PDF
		一个项目中需要用到网页生成PDF,就是将整个网页生成一个PDF文件, 以前也用过HTML2PDF,只能生成一些简单的HTML代码,复杂的HTML + css 生成的效果惨不忍睹, 百度了一下,发现有个 ... 
- 用js生成PDF的方案
		在java里,我们常用Itext来生成pdf,在pdf文件里组合图片,文字,画表格,画线等操作,还会遇到中文支持的问题. 那好,现在想直接在web前端就生成pdf怎么办,目前有以下几个解决方案 1:J ... 
- 使用TCPDF插件生成pdf以及pdf的中文处理
		目录(?)[+] 多种多样的pdf开发库 WKHTMLTOPDF 2FPDF 3TCPDF 中文问题 做了这么多年项目,以前只是在别人的项目中了解过PHP生成pdf文件,知道并不难,但是涉及到了p ... 
- linux下编译bib、tex生成pdf文件
		实验: 在linux环境下,编译(英文)*.bib和*.tex文件,生成pdf文件. 环境: fedora 20(uname -a : Linux localhost.localdomain 3.19 ... 
随机推荐
- Helvetic Coding Contest 2017 online mirror (teams allowed, unrated)
			G. Fake News (easy) time limit per test 1 second memory limit per test 256 megabytes input standard ... 
- 九度oj 题目1172:哈夫曼树
			题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和. 输入: 输入有 ... 
- Oracle spool 用法小结
			关于SPOOL(SPOOL是SQLPLUS的命令,不是SQL语法里面的东西.) 对于SPOOL数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句如: select taskindex|| ... 
- Codeforces Round #360 (Div. 2)——C. NP-Hard Problem(BFS染色判二分图)
			C. NP-Hard Problem time limit per test 2 seconds memory limit per test 256 megabytes input standard ... 
- POJ——3126Prime Path(双向BFS+素数筛打表)
			Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16272 Accepted: 9195 Descr ... 
- EC++学习笔记(六)  继承和面向对象设计
			条款32:确定你的 public 继承塑模出 is-a 关系 public inheritance 意味着 is-a 关系class Derived 以 public 形式继承 class Base, ... 
- iOS7坐标上移44pt的解决
			在iOS7中,引入一个新的属性,叫[UIViewController setEdgesForExtendedLayout:],它的默认值是UIRectEdgeAll.当容器为UINavigationC ... 
- Hihocoder 1561 观光旅行(启发式合并+贪心)
			题目链接 Hihocoder 1561 首先对原图求$MST$ 我们发现某条边成为某两个点的关键路径的必要条件是这条边是最小生成树的树边. 所以我们求$MST$的同时进行启发式合并. 把$size$小 ... 
- eslint 在webstorm配置
			1.安装nodejs和eslint 2.在 webstorm 的 file - setting搜索eslint,配置eslint路径 3.在项目目录下新建.eslintrc文件 4.配置eslint ... 
- Leetcode 数组问题:删除排序数组内的重复项
			问题描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ... 
