使用iTextSharp来填充PDF模板文件
需求简介:
遇到了这样一个需求:某公司需要为所有用户的培训生成一个培训记录,过程如下:
(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: }
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模板文件的更多相关文章
- java之数据填充PDF模板
声明:由于业务场景需要,所以根据一个网友的完成的. 1.既然要使用PDF模板填充,那么就需要制作PDF模板,可以使用Adobe Acrobat DC,下载地址:https://carrot.ctfil ...
- Itext读取PDF模板文件渲染数据后创建新文件
Maven导入依赖 <properties> <itextpdf.version>5.5.0</itextpdf.version> <itext-asian. ...
- 在.net Core 使用PDF模板文件生成PDF文件,代替WEB打印控件!
这几天找WEB打印控件,要么收费的,要么免费的只能在IE里用! 我只想简单的打个标签纸!百度2天,看到一老兄说可以用PDF,然后又开始百度..找到了一篇文章 http://www.jianshu.co ...
- 不会吧不会吧,还有开发不会Java填充PDF模板数据的,赶紧看看吧
思路 根据业务需求,获取实际业务数据,借助itext库功能,将业务数据填充入提前制作好的PDF模板中 操作步骤 制作PDF模板:提前下载好Adobe Acrobat Pro DC 效果展示 准备PDF ...
- 根据PDF模板生成PDF文件(基于iTextSharp)
根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...
- 根据现有PDF模板填充信息(SpringBoot)
根据现有PDF模板填充信息(SpringBoot+maven) 首先得有一个pdf模板,建立pdf模板需要下载工具 红色框为文本框,filename为域名.java需要根据域名赋值 pom 文件配置 ...
- java根据模板文件导出pdf
原文:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模 ...
- winform利用itextsharp.dll实现图片文件转换PDF格式文件
1.利用itextsharp.dll实现单个图片文件转换为PDF格式文件, 可以使用以下类: void ConvertJPG2PDF(string jpgfile, string pdf) { var ...
- Android根据pdf模板生成pdf文件
我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar iTextAsian.jar ,怎样jar包导入工程 ...
随机推荐
- MFC通过对话框窗口句柄获得对话框对象指针
C***Dialog* pWnd= (C***Dialog*)FromHandle(hWnd); //由句柄得到对话框的对象指针 pWnd->xxx( ); ...
- java线程中的wait和notify以及notifyall
一.区别与联系 1.1.wait(),notify()和notifyAll()都是java.lang.Object的方法,而确实sleep方法是Thread类中的方法,这是为什么呢? 因为wait和 ...
- 应用XML作为数据库的快速开发框架
背景 我经常应用C#开发一些小的桌面程序,这些桌面程序往往有以下几个特点: 程序比较小,开发周期很短. 程序的数据量不大,多数情况下不超过1万行记录. 对程序的性能要求不高. 程序并发很少或者基本没有 ...
- 在Linux下怎么确定哪个网卡对应哪个接口?
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- 从零开始学android开发-View的setOnClickListener的添加方法
1)第一种,也是最长见的添加方法(一下都以Button为例) Button btn = (Button) findViewById(R.id.myButton); btn .setOnClickLis ...
- 在.NET中实现彩色光标/动画光标和自定义光标[转]
下面是完整的例子,可以通过命令行编译即可看到效果. Test.cs using System; using System.Drawing; using System.Windows.Forms; us ...
- utf-8 和gbk编码的差别
UTF- 8: 是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码. GBK 是国家标准GB2312基础上扩容后兼容GB2312的标准. GBK的文 ...
- 第十七章,txt文件的写入和读取数据结合练习(C++)
#include <iostream> #include <fstream> int main(int argc, char** argv) { std::string str ...
- SkinSharp用法
SkinSharp又称Skin#,是很好用的一款轻量化的VC程序美化工具 官网地址是http://www.skinsharp.com/ 尽管SkinSharp是收费软件,但提供试用版,并且比較厚道,试 ...
- Android - 软件自动更新的实现
转自:http://blog.csdn.net/wwj_748/article/details/8195565 接触到一个很实用的技术,那就是软件自动更新.一般开发者是通过自行在应用平台添加更新版本的 ...