【问题标题】:How to Merge two Document objects using itextsharp如何使用 itextsharp 合并两个 Document 对象
【发布时间】:2013-10-28 21:17:54
【问题描述】:

我有两个 Document 对象

如何使用 itextsharp 合并这两个 Document 对象?

【问题讨论】:

  • 由于 itext 在最近几个月和几年中发生了很大的变化,指向 2010 年和 2011 年的答案不一定有帮助。
  • 我打算将此标记为重复,但问题与通常提出的问题略有不同。 OP 不是合并两个 PDF,而是询问如何合并两个 Document 对象。不幸的是,据我所知,没有办法合并两个 Document 对象。这些对象是帮助类,抽象出 PDF 文件格式的复杂性。这些抽象的“成本”之一是您仅限于单个文档。但是,正如其他人指出的那样,您可以创建单独的 PDF(甚至在内存中)然后合并它们。
  • @ChrisHaas 感谢您的帮助!我更新了答案。

标签: c# asp.net-mvc itextsharp


【解决方案1】:

按照 Haas 先生的说法(借助他在 SO 上的代码),

“不幸的是,据我所知,没有办法合并两个 Document 对象。这些对象是帮助类,可以抽象出 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");

仅供参考

new MemoryStream(realfinalStream.ToArray())

我这样做是因为 MemoryString 已关闭。

【讨论】:

  • 我这样做是因为 MemoryString 已关闭。 - PdfCopy 就像任何 PdfWriter 一样,可以被告知在自身关闭时不要关闭输出流。只需在copy.Close() 之前执行copy.SetCloseStream(false)
【解决方案2】:

口感更轻松:

您必须获取 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());

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多