需求简介:

    遇到了这样一个需求:某公司需要为所有用户的培训生成一个培训记录,过程如下:

    (1)用户在培训完之后会进入到一个填写信息的界面。

    (2)用户填写信息。

    (3)生成PDF格式的培训记录。

    (4)用户下载并打印归档。

思路:

    因为每次培训后生成的PDF文件内容都不完全一样,但是格式却是完全相同的,所以很容易让人联想到使用模板文件。每次只需要提取用户输入的有效信息,然后复制模板、填充模板、弹出下载即可。

解决过程:

    (1)制作模板:我先使用Microsoft Office 2010编辑模板文件,在保存的时候将文件保存为pdf文件。然后用Adobe Acrobat X编辑刚刚生成的PDF文件,把Textbox、Checkbox等域拖动到指定的位置,然后通过预览功能调整各个域的位置和其中文字的字体、大小,完成后保存。模板完成!(我用Google搜索的时候也看到过用OpenOffice来完成模板的,不过没点开看)

    (2)编程填充PDF文件:本人使用的编程语言是C#,所以使用对应的免费开源类库iTextSharp来完成填充的功能。程序的执行过程是:先读取网页中的有效信息,然后打开模板文件填充到模板文件的域中间,最后另存为一个PDF文件。代码见下文。

    (3)服务器端推送文件给浏览器下载。

遇到的问题:

    (1)首先遇到的问题是Checkbox的传参问题。一开始本人是从一些英文网站查看的相关资料,里面在设置Checkbox使用的语句是:pdfFormFields.SetField(“male”, “Yes”); 试了很多遍,结果就是不行,Checkbox并没有被勾选上。后来无奈了点开Checkbox属性中的选项值一栏,发现它有一栏名为导出值,其中的值为“是”。我猜想我的模板由于使用中文版,其中参数的设置也发生了相应的变化,一试之下果然如此。pdfFormFields.SetField(“male”, “是”); 就是行得通。

    (2)显示中文的问题。如果直接把中文字符串设置到PDF模板中去的话中文字符一个都不会显示。Google了一下,应该是亚洲的文字都不能显示,为此还需要两个附加组件:iTextAsianCmaps.dll和iTextAsian.dll。这两个组件可以在sourceforge上面下载。大家不妨参考:http://www.cnblogs.com/haogj/archive/2011/09/05/2167659.html

    (3)以为这就好了?差远了!在输入第一句BaseFont.AddToResourceSearch("iTextAsian.dll");的时候有错误?对了!目前iTextSharp最新的版本是5.4.4,也就是我当时使用的版本。估计版本的变迁使得方法的调用也出了问题,于是果断换成了5.1.2的版本。

    (4)改完之后一路顺畅地写完了方法。试验一下,又出错!BaseFont bf = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);中的STSong-Light和UniGB-UCS2-H无法被识别!这个问题我直到最后都没能解决(看了好几篇帖子还是没能解决,大家如果有成功的通知小弟一声,谢谢啊!),退而求其次我只好使用TTF 字体。注:使用TTF 字体貌似是在PDF文件中嵌入字体文件,这使得PDF文件体积巨大,成了我的心病。

代码:

    Anyway,代码还是最重要的,以下的静态类用来填充PDF模板:

   1: using System;

   2: using System.Collections.Generic;

   3: using System.Linq;

   4: using System.Web;

   5: using System.Diagnostics;

   6: using System.IO;

   7: using iTextSharp.text.pdf;

   8:  

   9: public class FillPdfTemplate

  10: {

  11:     public static void GetEnPdf(string templatePath, string newFilePath, Dictionary<string, string> parameters)

  12:     {

  13:         PdfReader pdfReader = new PdfReader(templatePath);

  14:         PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFilePath,

  15: FileMode.Create));

  16:         //获取域的集合;

  17:         AcroFields pdfFormFields = pdfStamper.AcroFields;

  18:         //为需要赋值的域设置值;

  19:         foreach (KeyValuePair<string, string> parameter in parameters)

  20:         {

  21:             pdfFormFields.SetField(parameter.Key, parameter.Value);

  22:         }

  23:         //这句很重要,如果为false那么生成的PDF文件还能编辑,一定要设为true;

  24:         pdfStamper.FormFlattening = true;

  25:         pdfStamper.Close();

  26:         pdfReader.Close();

  27:     }

  28:  

  29:     public static void GetChPdf(string templatePath, string newFilePath, string iTextAsianCmapsPath, Dictionary<string, string> parameters)

  30:     {

  31:         PdfReader pdfReader = new PdfReader(templatePath);

  32:         PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFilePath, FileMode.Create));

  33:         //获取域的集合;

  34:         AcroFields pdfFormFields = pdfStamper.AcroFields;

  35:  

  36:         BaseFont.AddToResourceSearch(iTextAsianCmapsPath);

  37:         //创建中文字体,第一个参数是中文字体的路径,第二个参数表示文字方向水平,第三个貌似是字体嵌入PDF文件;

  38:         BaseFont baseFT = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

  39:         foreach (KeyValuePair<string, string> parameter in parameters)

  40:         {

  41:             //要输入中文就要设置域的字体;

  42:             pdfFormFields.SetFieldProperty(parameter.Key, "textfont", baseFT, null);

  43:             //为需要赋值的域设置值;

  44:             pdfFormFields.SetField(parameter.Key, parameter.Value);

  45:         }

  46:         //这句很重要,如果为false那么生成的PDF文件还能编辑,一定要设为true;

  47:         pdfStamper.FormFlattening = true;

  48:         pdfStamper.Close();

  49:         pdfReader.Close();

  50:     }

  51: }

下面是参数的获取和调用的过程和推送PDF文件下载的方法:
   1: protected void btnDownLoad_Click(object sender, EventArgs e)

   2: {

   3:     string position = Text1.Value;

   4:     string venue = Text2.Value;

   5:     string method = Text3.Value;

   6:     string date = Text4.Value;

   7:     string teacher = Text5.Value;

   8:     string content = TextArea1.Value;

   9:     string examination = Checkbox1.Checked ? "是" : "否";

  10:     string selfassessment = Checkbox2.Checked ? "是" : "否";

  11:     string certificate = Checkbox3.Checked ? "是" : "否";

  12:     string etc = Checkbox4.Checked ? "是" : "否";

  13:     string trainee = Text6.Value;

  14:  

  15:     Dictionary<string, string> dict = new Dictionary<string, string>();

  16:     dict.Add("TextPosition", position);

  17:     dict.Add("TextVenue", venue);

  18:     dict.Add("TextMethod", method);

  19:     dict.Add("TextDate", date);

  20:     dict.Add("TextTeacher", teacher);

  21:     dict.Add("TextContent", content);

  22:     dict.Add("TextTrainee", trainee);

  23:     dict.Add("CheckBoxExamination", examination);

  24:     dict.Add("CheckBoxSelf-assessment", selfassessment);

  25:     dict.Add("CheckBoxCertificate", certificate);

  26:     dict.Add("CheckBoxEtc", etc);

  27:  

  28:     string template = Server.MapPath("~/PDFTemplate/ch.pdf");

  29:     string newFile = Server.MapPath("~/PDFTemplate") + "\\" + Session["UserID"].ToString() + ".pdf";

  30:     string iTextAsianCmaps = Server.MapPath("~/Libs/iTextAsianCmaps.dll");

  31:     TrainingRecordToPDF.GetChPdf(template, newFile, iTextAsianCmaps, dict);

  32:  

  33:     OutFile(newFile);

  34: }

  35:  

  36: public void OutFile(string  filename)

  37: {

  38:     System.IO.FileInfo file = new System.IO.FileInfo(filename);

  39:     Response.Clear();

  40:     Response.Charset = "GB2312";

  41:     Response.ContentEncoding = System.Text.Encoding.UTF8;

  42:     Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name));

  43:     Response.AddHeader("Content-Length", file.Length.ToString());

  44:     Response.ContentType = "application/x-bittorrent";

  45:     Response.WriteFile(file.FullName);

  46:     Response.End();  

  47:  

  48: }

使用iTextSharp来填充PDF模板文件的更多相关文章

  1. java之数据填充PDF模板

    声明:由于业务场景需要,所以根据一个网友的完成的. 1.既然要使用PDF模板填充,那么就需要制作PDF模板,可以使用Adobe Acrobat DC,下载地址:https://carrot.ctfil ...

  2. Itext读取PDF模板文件渲染数据后创建新文件

    Maven导入依赖 <properties> <itextpdf.version>5.5.0</itextpdf.version> <itext-asian. ...

  3. 在.net Core 使用PDF模板文件生成PDF文件,代替WEB打印控件!

    这几天找WEB打印控件,要么收费的,要么免费的只能在IE里用! 我只想简单的打个标签纸!百度2天,看到一老兄说可以用PDF,然后又开始百度..找到了一篇文章 http://www.jianshu.co ...

  4. 不会吧不会吧,还有开发不会Java填充PDF模板数据的,赶紧看看吧

    思路 根据业务需求,获取实际业务数据,借助itext库功能,将业务数据填充入提前制作好的PDF模板中 操作步骤 制作PDF模板:提前下载好Adobe Acrobat Pro DC 效果展示 准备PDF ...

  5. 根据PDF模板生成PDF文件(基于iTextSharp)

    根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...

  6. 根据现有PDF模板填充信息(SpringBoot)

    根据现有PDF模板填充信息(SpringBoot+maven) 首先得有一个pdf模板,建立pdf模板需要下载工具 红色框为文本框,filename为域名.java需要根据域名赋值 pom 文件配置 ...

  7. java根据模板文件导出pdf

    原文:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模 ...

  8. winform利用itextsharp.dll实现图片文件转换PDF格式文件

    1.利用itextsharp.dll实现单个图片文件转换为PDF格式文件, 可以使用以下类: void ConvertJPG2PDF(string jpgfile, string pdf) { var ...

  9. Android根据pdf模板生成pdf文件

    我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar    iTextAsian.jar ,怎样jar包导入工程 ...

随机推荐

  1. spring mvc 详细执行流程

    名词解释 DispatcherServlet:整个spring MVC的前端控制器,由它来接管来自客户端的请求. HandlerMapping:DispatcherServlet会通过它来处理客户端请 ...

  2. 关于 jquery cookie的用法

    东钿微信公众平台新版上线 需要一个引导用户操作步骤.设置一个cookie师傅偶第一次访问此页面 .如果是则跳出用户引导,如果不是,正常显示. 一开始在百度了一段jquery cookie插件,也没仔细 ...

  3. 通过lldb远程调试iOS App

    苹果从Xcode5开始弃用了gcc及gdb, 只能使用llvm用lldb. 在越狱机上虽然仍然可以使用gdb进行调试,但lldb是趋势.下面就介绍一种通过Wifi或者USB,在Mac上使用lldb对i ...

  4. 【M2】最好使用C++转型操作符

    1.C语言中的转型操作符有两个问题: a.是个通用的转换操作符,也就是说,可以从一个类型转换到其他类型.通用必定是低效率和冗余的,因为要考虑很多情况. b.在代码中,难以辨认出哪些是类型转换. 2.C ...

  5. OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中

    OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...

  6. Android Activity界面切换添加动画特效

    在Android 2.0之后有了overridePendingTransition() ,其中里面两个参数,一个是前一个activity的退出两一个activity的进入, @Override pub ...

  7. NDK环境配置

    1.下载安装插件:com.android.ide.eclipse.ndk_23.0.2.1259578.jar      copy到E:\eclipse\adt-bundle-windows-x86- ...

  8. CODE:BLOCK中的CreateProcess: No such file or directory

    现象: WINDOWS安装MINGW4.8.1,环境变量设置后,命令行窗体G++能够执行.但编译文件时提示: CreateProcess: No such file or directory. 安装C ...

  9. 类的this指针 总结

    类的this指针有以下特点: (1)this只能在成员函数中使用 全局函数,静态函数都不能使用this. 实际上,成员函数默认第一个参数为T* const this. 如: class A { pub ...

  10. php上传常见文件类型对应的$_FILES["file"]["type"](转)

    php上传常见文件类型对应的$_FILES["file"]["type"] from:http://hi.baidu.com/7book/item/374971 ...