利用iTextSharp填寫中文(中日韓)PDF表單(完整解決方案)

利用iTextSharp填寫中文(中日韓)PDF表單(完整解決方案)  

越來越多的人來信或者留言(甚至msn上找我),詢問關於PDF Form填寫的問題,尤其是中文(或者說中日韓文)表單填寫的問題,本不想回答這類問題,因爲相關的注意事項都已經在我的博客裏說了,但現在看來還是有必要再囉唆下了,如果再有問題的話,希望帶着Money來問,拜託了。  

下面這段代碼根據iText的java教程修改而成,主要有一下用途:
1.填寫表單;
2.利用CID字體填寫中文(CJK:中日韓)表單;
3.利用TrueType字體填寫中日韓表單(因爲字體嵌入,生成的PDF會非常大);
4.支持服務端PDF的填寫;

 1             //如果不使用CID字體,下面三行不需要
 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);
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章