2011-07-19 55 views
1

我有一個頁面上有一個插件控件的PDF。我需要將它與另一個pdf合併,但是當我這樣做時,插件被重新組合爲一個空白的矩形。有沒有合併和保存插件控件的方法?如果重要,該插件是Dessault Systemes 3D Via Composer播放器控件,從http://www.3ds.com/products/3dvia/3dvia-composer/resource-center/安裝iTextSharp合併並保留插件

我使用的代碼是簡單的作家getinstance,contentbyte directcontent,getimportedpage,addtemplate。沒有什麼花哨。

FileStream docStream = new FileStream(@"C:\Temp\Merged.pdf", FileMode.Create); 
      Document newDocument = new Document(PageSize.A4.Rotate()); 
      PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, docStream); 
     try 
     { 
      newDocument.Open(); 
      PdfContentByte pdfContentByte = pdfWriter.DirectContent; 

      newDocument.NewPage(); 
      PdfReader mainPage = new PdfReader(@"C:\Temp\PageWithPlugin.pdf"); 
      PdfImportedPage importedPage1 = pdfWriter.GetImportedPage(mainPage, 1); 
      pdfContentByte.AddTemplate(importedPage1, 0, 0); 
      mainPage.Close(); 

      PdfReader smgPages = new PdfReader(@"C:\Temp\MorePages.pdf"); 
      for (int page = 1; page <= smgPage.NumberOfPages; page++) 
      { 
       newDocument.NewPage(); 
       PdfImportedPage importedPage = pdfWriter.GetImportedPage(smgPages, page); 
       pdfContentByte.AddTemplate(importedPage, 0, 0); 
      } 
      smgPages.Close(); 

      } 
     finally 
     { 
      docStream.Flush(); 
      if (newDocument != null) 
       newDocument.Close(); 
      docStream.Close(); 
     } 

回答

2

試試看。

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

using (FileStream fileSteam = File.OpenRead((@"C:\Temp\PageWithPlugin.pdf"))) 
{ 
    Byte[] byteArray = new byte[fileSteam.Length]; 
    fileSteam.Read(byteArray, 0, byteArray.Length); 

    fileList.Add(byteArray); 
} 

using (FileStream fileSteam = File.OpenRead((@"C:\Temp\MorePages.pdf"))) 
{ 
    Byte[] byteArray = new byte[fileSteam.Length]; 
    fileSteam.Read(byteArray, 0, byteArray.Length); 

    fileList.Add(byteArray); 
} 

using(MemoryStream msOutput = new MemoryStream()) 
{ 
    PdfReader pdfFile = new PdfReader(fileList[0]); 
    Document doc = new Document(); 
    PdfWriter pCopy = new PdfSmartCopy(doc, msOutput); 

    doc.Open(); 

    for (int k = 0; k < fileList.Count; k++) 
    { 
     for (int i = 1; i < pdfFile.NumberOfPages + 1; i++) 
     { 
      pdfFile = new PdfReader(fileList[k]); 
      ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i)); 
      pCopy.FreeReader(pdfFile); 
     } 
    } 

    pdfFile.Close(); 
    pCopy.Close(); 
    doc.Close(); 
    fileList.Clear(); 

    byte[] form = msOutput.ToArray(); 

    using (FileStream fileSteam = new FileStream(@"C:\Temp\Merged.pdf", FileMode.Create)) 
    { 
      fileStream.Write(form, 0, form.Length); 
    } 
} 
+0

「PdfCopy」或「PdfSmartCopy」都可以工作。 'PdfSmartCopy'比較導入到PDF中的所有流,以確保沒有重複。開銷,但在某些情況下可能會導致**很多較小的PDF。 –

+0

完美運作。及時回覆非常感謝。 – JeffLit

+0

不要看起來像馬的禮物,但...如果有人使用這個解決方案,k循環會有一個小問題。在第零個頁面之後,頁面的數量將被一個文檔關閉,並且pdfReader不斷被釋放並重新讀取每個頁面,這不是必需的。我認爲這是對代碼部分的改進: – JeffLit

0

不要看起來像個禮物馬在嘴裏,但...如果其他人使用的解決方案,有一個小問題與k循環。在第零個頁面之後,頁面的數量將被一個文檔關閉,並且pdfReader不斷被釋放並重新讀取每個頁面,這不是必需的。我認爲這是對該部分代碼的改進:

using (MemoryStream msOutput = new MemoryStream()) 
      { 
       Document doc = new Document(); 
       PdfWriter pCopy = new PdfCopy(doc, msOutput); 
       doc.Open(); 
       for (int k = 0; k < fileList.Count; k++) 
       { 
        PdfReader pdfFile = new PdfReader(fileList[k]);       
        for (int i = 1; i < pdfFile.NumberOfPages + 1; i++) 
        { 
         ((PdfCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i)); 
        } 
        pCopy.FreeReader(pdfFile); 
        pdfFile.Close(); 
       } 
       pCopy.Close(); 
       doc.Close(); 
       fileList.Clear();