2013-10-28 31 views
0

我有两个Document对象如何使用iTextSharp的

如何使用一个合并iTextSharp的这两个Document对象合并两个文档对象?

+0

http://stackoverflow.com/questions/2233129/merging-pdfs-with-itextsharp –

+0

作为iText的已经在最近几个月和几年相当大的变化,对从2010年和2011年的答案指向不一定是有帮助的。 – mkl

+3

我打算把这个标记为重复,但问题与通常要求的稍有不同。 OP不是合并两个PDF,而是询问如何合并两个“Document”对象。不幸的是,据我所知,没有办法合并两个'Document'对象。这些对象是助手类,可以抽象出PDF文件格式的复杂性。这些抽象的“成本”之一是,你仅限于单个文档。但是,正如其他人指出的那样,您可以创建单独的PDF(甚至是内存),然后合并它们。 –

回答

0

上腭有一点更容易:

你必须采取PDF文档存储流,并将它们合并起来!

这是一个简单的功能,可以实现这个功能!

 public MemoryStream MemoryStreamMerger(List<MemoryStream> streams) 
     { 

      MemoryStream OurFinalReturnedMemoryStream; 
      using (OurFinalReturnedMemoryStream = new MemoryStream()) 
      { 
       //Create our copy object 
       PdfCopyFields copy = new PdfCopyFields(OurFinalReturnedMemoryStream); 

       //Loop through each MemoryStream 
       foreach (MemoryStream ms in streams) 
       { 
        //Reset the position back to zero 
        ms.Position = 0; 
        //Add it to the copy object 
        copy.AddDocument(new PdfReader(ms)); 
        //Clean up 
        ms.Dispose(); 
       } 
       //Close the copy object 
       copy.Close(); 

       //Get the raw bytes to save to disk 
       //bytes = finalStream.ToArray(); 
      } 
      return new MemoryStream(OurFinalReturnedMemoryStream.ToArray()); 

     } 
1

按照哈斯先生(与他的代码帮助某处SO),

“不幸的是,据我所知,没有办法合并两个文档对象。这些对象是辅助类它抽象出PDF文件格式的复杂性,这些抽象的“成本”之一是你仅限于单个文档,但正如其他人指出的那样,你可以创建单独的PDF(甚至在内存中)和然后合并它们。“

所以我就是这样做的:

我用PdfCopyFields对象。

MemoryStream realfinalStream = new MemoryStream(); 
MemoryStream[] realstreams = { stream,new MemoryStream(finalStream.ToArray()) }; 

using (realfinalStream) 
     { 
      //Create our copy object 
      PdfCopyFields copy = new PdfCopyFields(realfinalStream); 

      //Loop through each MemoryStream 
      foreach (MemoryStream ms in realstreams) 
      { 
       //Reset the position back to zero 
       ms.Position = 0; 
       //Add it to the copy object 
       copy.AddDocument(new PdfReader(ms)); 
       //Clean up 
       ms.Dispose(); 
      } 
      //Close the copy object 
      copy.Close(); 
     } 
return File(new MemoryStream(realfinalStream.ToArray()), "application/pdf","hello.pdf"); 

FYI

new MemoryStream(realfinalStream.ToArray()) 

我这样做,是因为MemoryString被关闭。

+0

*我这样做是因为MemoryString是关闭的。* - 像任何'PdfWriter'一样,可以告诉'PdfCopy'在关闭时不关闭输出流。只需在'copy.Close()'之前执行'copy.SetCloseStream(false)'。 – mkl