利用iTextSharp填寫中文(中日韓)PDF表單(完整解決方案)
越來越多的人來信或者留言(甚至msn上找我),詢問關於PDF Form填寫的問題,尤其是中文(或者說中日韓文)表單填寫的問題,本不想回答這類問題,因爲相關的注意事項都已經在我的博客裏說了,但現在看來還是有必要再囉唆下了,如果再有問題的話,希望帶着Money來問,拜託了。
下面這段代碼根據iText的java教程修改而成,主要有一下用途:
1.填寫表單;
2.利用CID字體填寫中文(CJK:中日韓)表單;
3.利用TrueType字體填寫中日韓表單(因爲字體嵌入,生成的PDF會非常大);
4.支持服務端PDF的填寫;
2 BaseFont.AddToResourceSearch("iTextAsian-1.0.dll");
3 BaseFont.AddToResourceSearch("iTextAsianCmaps-1.0.dll");
4 BaseFont font = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
5
6 PdfReader reader = new PdfReader("SimpleRegistrationForm.pdf");
7
8 PdfStamper stamp1 = new PdfStamper(reader, new FileStream("registered.pdf",FileMode.Create));
9
10 //如果你想在asp.net中進行表單填寫,下面這句非常重要,當然上面的FileStream也最好換成MemStream或者別的Stream實例
11 //stamp1.Writer.CloseStream=false;
12
13
14 //使用TrueType字體
15 //BaseFont font = BaseFont.CreateFont("c://windows//fonts//STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
16
17 AcroFields form1 = stamp1.AcroFields;
18
19 //當你需要修改某個Field的字體屬性時
20 form1.SetFieldProperty("name","textfont",font,null);
21
22 //以下爲填寫表單部分
23 form1.SetField("name", "利用iText#填寫中文表單");
24 form1.SetField("address", "http://hardrock.cnblogs.com");
25 form1.SetField("postal_code", "200051");
26 form1.SetField("email", "[email protected]");
27 stamp1.Close();
P.S.
關於Java下的解決方案可以參照上面的C#代碼和下面的Register.java代碼稍加修改即可。
參考資料
SimpleRegistrationForm.pdf
Register.java
如果你想利用FDF來填寫表單,那麼改寫下面的代碼吧
using System;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
public class field_merge
{
private static void usage()
{
System.Console.Out.WriteLine("Field merging and flattening");
System.Console.Out.WriteLine("usage: field_merge [-f] infile_pdf outfile_pdf [[name1=value1][namex=valuex]]");
System.Console.Out.WriteLine(" -f - flatten the fields");
}
[STAThread]
public static void Main(string[] args)
{
if (args.Length < 2)
{
usage();
return ;
}
int idx = 0;
if (args[0].Equals("-f"))
++idx;
if (args.Length - idx < 2)
{
usage();
return ;
}
string in_pdf = args[idx];
string out_pdf = args[idx + 1];
try
{
PdfReader reader = new PdfReader(in_pdf);
PdfStamper stamp = new PdfStamper(reader, new FileStream(out_pdf, FileMode.Create));
AcroFields form = stamp.AcroFields;
for (int k = idx + 2; k < args.Length; ++k)
{
string t = args[k];
int x = t.IndexOf((System.Char) '=');
if (x > 0)
{
string field = t.Substring(0, (x) - (0));
string value_Renamed = t.Substring(x + 1);
form.SetField(field, value_Renamed);
}
}
if (idx > 0)
stamp.FormFlattening=(true);
stamp.Close();
System.Console.Out.WriteLine("Done.");
}
catch (System.Exception e)
{
System.Console.Error.WriteLine(e.Message);
}
}
}