2010-05-19 125 views
5

我使用itextsharp來填充我的PDF。我對此沒有任何問題。基本上我正在做的是獲取PDF並填充內存中的字段,然後傳回MemoryStream以顯示在網頁上。所有這些都與單個文檔PDF一起工作。填充多個PDF

我想弄清楚,現在正在合併多個PDF到一個MemoryStream。我不能弄清楚的是,我填寫的文件是相同的。例如,我有一個List<Person>,其中包含5人。我想爲每個人填寫一份PDF,並將它們合併到一個記憶體中。考慮到我將爲每個人填寫相同類型的文件。

我得到的問題是,當我嘗試添加第二次迭代的同一PDF的第二個副本時,它只是覆蓋第一個填充的PDF,因爲它是相同的文檔,因此不會添加第二份副本爲Person

因此,基本上如果我有5個人,我最終會得到一個帶有第5個人的數據的頁面,而不是一個包含每個人的數據的5個頁面的PDF。

下面是一些代碼...

MemoryStream ms = ms = new MemoryStream(); 
PdfReader docReader = null; 
PdfStamper Stamper = null; 
List<Person> persons = new List<Person>() { 
    new Person("Larry", "David"), 
    new Person("Dustin", "Byfuglien"), 
    new Person("Patrick", "Kane"), 
    new Person("Johnathan", "Toews"), 
    new Person("Marian", "Hossa") 
}; 

try 
{ 
    // Iterate thru all persons and populate a PDF for each 
    foreach(var person in persons){ 
     PdfCopyFields Copier = new PdfCopyFields(ms); 
     Copier.AddDocument(GetReader("Person.pdf")); 
     Copier.Close(); 

     docReader = new PdfReader(ms.ToArray()); 
     Stamper = new PdfStamper(docReader, ms); 
     AcroFields Fields = Stamper.AcroFields; 
     Fields.SetField("FirstName", person.FirstName); 
    } 
}catch(Exception e){ 
    // handle error 
}finally{ 
    if (Stamper != null) 
    { 
     Stamper.Close(); 
    } 
    if (docReader != null) 
    { 
     docReader.Close(); 
    } 
} 
+1

+1芝加哥黑鷹! :) – 2010-05-19 21:18:11

+0

@Cameron彼得斯 - 是的,他們是一個團隊的地獄。 – Gabe 2010-05-19 21:23:01

回答

2

我已經創建了一個工作解決方案,我希望這可以幫助一路上的人。

創建PopulatePDF()方法,是以Person對象,並返回一個byte[]

private byte[] PopulatePersonPDF(Person obj) 
{ 
    MemoryStream ms = new MemoryStream(); 
    PdfStamper Stamper = null; 

    try 
    { 
     PdfCopyFields Copier = new PdfCopyFields(ms); 
     Copier.AddDocument(GetReader("Person.pdf")); 
     Copier.Close(); 

     PdfReader docReader = new PdfReader(ms.ToArray()); 
     ms = new MemoryStream(); 
     Stamper = new PdfStamper(docReader, ms); 
     AcroFields Fields = Stamper.AcroFields; 
     Fields.SetField("FirstName", obj.FirstName); 
    } 
    finally 
    { 
     if (Stamper != null) 
     { 
     Stamper.Close(); 
     } 
    } 
    return ms.ToArray(); 
} 

創建返回MemoryStream一個MergePDFs()方法:

private MemoryStream MergePDFs(List<byte[]> pdfs) 
{ 
    MemoryStream ms = new MemoryStream(); 
    PdfCopyFields Copier = new PdfCopyFields(ms); 

    foreach (var pdf in pdfs) 
     Copier.AddDocument(new PdfReader(pdf)); 
    Copier.Close(); 
    return ms; 
} 

示例實現:

List<Person> persons = new List<Person>() { 
    new Person("Larry", "David"), 
    new Person("Dustin", "Byfuglien"), 
    new Person("Patrick", "Kane"), 
    new Person("Johnathan", "Toews"), 
    new Person("Marian", "Hossa") 
}; 

List<byte[]> pdfs = new List<byte[]>(); 

foreach(var person in persons) 
    pdfs.Add(PopulatePersonPDF(person)); 

MemoryStream ms = MergePDFs(pdfs); 
+0

你怎麼做這個沒有加載模板10次? geting 10x的大小 – 2011-01-18 13:29:42

+0

'PdfCopyFields'似乎是錢鏡頭。如果你正在處理內存中的流,一些非常重要的事情:'PdfCopyFields Copier = new PdfCopyFields(ms); Copier.Writer.CloseStream = false' – 2013-09-09 20:04:59

0

檢查PdfStamper構造簽名存在,需要一個布爾值,告訴它附加到當前文檔的過載。