【问题标题】:Merge PDFs iTextSharp合并 PDF iTextSharp
【发布时间】:2012-10-22 18:18:09
【问题描述】:

我在网上查看了一些示例,并想出了使用 iTextSharp 合并 pdf 的代码。但我收到一个错误:.

{“文档没有页面。”}

它在 Page = writer.GetImportedPage(reader, X);

处失败

这是堆栈跟踪:

 at iTextSharp.text.pdf.PdfPages.WritePageTree()
 at iTextSharp.text.pdf.PdfWriter.Close()
 at iTextSharp.text.pdf.PdfCopy.Close()
 at iTextSharp.text.Document.Close()

当我调试它时它有 3 页。这里有什么问题??

这是我的代码

public static MemoryStream MergePdfs(List<MemoryStream> pdfStreams)
       {
        //Create output stream
           MemoryStream OutStream = new MemoryStream();
           Document Document = null;

           try
           {
                //Create Main reader
                PdfReader Reader = new PdfReader(pdfStreams.ElementAt(0));
                //Create Main Doc
                Document = new Document(Reader.GetPageSizeWithRotation(1));
                //Create main writer
                PdfCopy Writer = new PdfCopy(Document, OutStream);
                //Open document for writing
                Document.Open();
                //Add pages
                AddPages(Reader.NumberOfPages, Reader, ref Writer);

                //For each additional pdf after first combine them into main document
                foreach (MemoryStream PdfStream in pdfStreams.Skip(1))
                {
                    PdfReader Reader2 = new PdfReader(PdfStream);
                    // Add content
                    AddPages(Reader2.NumberOfPages, Reader2, ref Writer);
                }
             }
             finally
             {
                 // Step 5: Close the document
                 if (Document != null)
                     Document.Close();

                foreach (var Strm in pdfStreams)
                {
                    try { if (null != Strm) Strm.Dispose(); } catch { }
                }
             }

             return OutStream;
         }

        private static void AddPages(int Pages, PdfReader reader, ref PdfCopy writer)
        {
            PdfImportedPage Page = null;

            for (int X = 0; X < Pages; X++)
            {
                 Page = writer.GetImportedPage(reader, X);
                 writer.AddPage(Page);
            }

            if (reader.AcroForm != null)
                writer.CopyAcroForm(reader);
        }

【问题讨论】:

  • 我传入的 MemoryStream 来自 byte[]。这意味着它们是完整的 PDF,因此它们不完全完整或任何东西都不应该有任何问题。我真的很想避免必须先将它们写入磁盘并再次读取它们以合并它们,就像我在网上看到的其他示例一样。这就是我使用内存流编写这个自定义的原因。
  • GetImportedPage 的页码从 1 开始。
  • 谢谢。您能否发表您的评论作为答案,以便我将其标记为正确。谢谢。答案是我需要函数中的循环看起来像这样并且它可以工作。 for (int X = 1; X

标签: c# asp.net .net pdf itextsharp


【解决方案1】:

GetImportedPage 的页码从 1 开始。因此:

for (int X = 1; X < Pages + 1; X++)
{
    Page = writer.GetImportedPage(reader, X);
    writer.AddPage(Page);
}

【讨论】:

  • 好吧,我生命中的 3 个小时我再也回不去了。这是一个令人困惑的错误信息.. 叹息。感谢您的回答,我希望我能早点找到它:p
猜你喜欢
  • 2013-03-09
  • 2023-03-22
  • 2011-01-15
  • 2023-03-03
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多