2013-11-23 35 views
4

在5.4.2版本iTextSharp的我能夠使用:(片段VB)iTextSharp的5.4.4 CopyAcroForm不再有

Dim pdfWriter As iTextSharp.text.pdf.PdfCopy 
pdfwriter = New iTextSharp.text.pdf.PdfCopy(outputPDFDocument, New FileStream(destfname, FileMode.Create)) 
pdfWriter.CopyAcroForm(reader) 

的形式從一個文檔複製到另一個。

5.4.4 CopyAcroForm不再存在於PdfCopy或其他任何地方 - 替代方案是什麼?

+0

根據這一線索(http://itextsharp.10939.n7.nabble.com/RE-iText-questions-PdfCopy-copyAcroForm-wrong-method-getReaderFile-tt18.html),'CopyAcroForm'是早在2005年就已經過時了。我認爲它已經過時的原因是它沒有做到每個人都期望它每次都做的事。相反,請閱讀Mark的帖子,解釋一些替代方案。 http://stackoverflow.com/a/6333751/231316 –

回答

14

請閱讀發行說明iText 5.4.4。現在可以使用PdfCopy通過使用addDocument()方法合併包含AcroForm表單的PDF。這種方法比copyAcroForm()方法好得多,因爲它也保留了結構樹根。如果您的表單可以訪問(參見第508節或PDF/UA標準),這一點很重要。

+0

+1;在第三方庫更新期間閱讀發行說明可能是一項非常有利的優勢... – mkl

0

看起來你還需要調用.SetMergeFields()或將無法正常工作:

reader = new PdfReader(path); 
using (var document = new Document(reader.GetPageSizeWithRotation(1))) { 
    using (var outputStream = new FileStream(...)) { 
     using (var writer = new PdfCopy(document, outputStream)) { 
      writer.SetMergeFields(); 
      document.Open(); 

      //all pages: 
      writer.AddDocument(reader); 
      //Particular Pages: 
      //writer.AddDocument(reader, new List<int> { pageNumber }); 
     } 
    } 
} 
1

AddDocument()方法是很酷。這裏是我的代碼,它從asp.net中的SQL服務器讀取和合並多個PDF。需要document.Close()將內容刷新到內存流。

enter code here 
    Document document = new Document(); 
    MemoryStream output = new MemoryStream(); 
    PdfCopy writer = new PdfCopy(document, output); // Initialize pdf writer  
    writer.SetMergeFields(); 
    document.Open(); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     PdfReader reader = new PdfReader((Byte[])dr["ImageFile"]); 
     writer.AddDocument(reader); 
    } 
    dr.Close(); 
    document.Close();