Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并PDF iTextSharp_C#_Asp.net_.net_Pdf_Itextsharp - Fatal编程技术网

C# 合并PDF iTextSharp

C# 合并PDF iTextSharp,c#,asp.net,.net,pdf,itextsharp,C#,Asp.net,.net,Pdf,Itextsharp,我在线查看了一些示例,并提出了使用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 iTextS

我在线查看了一些示例,并提出了使用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);
        }
公共静态内存流合并PDF(列出PDF流)
{
//创建输出流
MemoryStream OutStream=新的MemoryStream();
单据=空;
尝试
{
//创建主读卡器
PdfReader=newpdfReader(pdfStreams.ElementAt(0));
//创建主文档
文档=新文档(Reader.GetPageSizeWithRotation(1));
//创建主要作者
PdfCopy Writer=新的PdfCopy(文档,扩展);
//打开文档进行写作
Document.Open();
//添加页面
添加页面(Reader.NumberOfPages、Reader、ref-Writer);
//在第一次将它们合并到主文档之后,对于每个附加pdf
foreach(PdfStream中的MemoryStream PdfStream.Skip(1))
{
PdfReader Reader2=新PdfReader(PdfStream);
//添加内容
添加页面(Reader2.NumberOfPages、Reader2、ref-Writer);
}
}
最后
{
//步骤5:关闭文档
如果(文档!=null)
Document.Close();
foreach(pdfStreams中的var Strm)
{
请尝试{if(null!=Strm)Strm.Dispose();}捕获{}
}
}
回流分流;
}
私有静态void AddPages(int页、PdfReader读取器、ref PdfCopy writer)
{
PdfImportedPage=null;
对于(int X=0;X
GetImportedPage的页码以1为基础。因此:

for (int X = 1; X < Pages + 1; X++)
{
    Page = writer.GetImportedPage(reader, X);
    writer.AddPage(Page);
}
for(int X=1;X
我传入的内存流来自字节[]。这意味着它们是完整的PDF文件,所以它们不应该是完全完整的或任何问题。我真的不想像我在网上看到的其他例子那样,先把它们写到磁盘,然后再把它们读回来合并。这就是我使用内存流编写此自定义页面的原因。GetImportedPage的页码是基于1的。谢谢。你能把你的评论作为答案贴出来吗?这样我就把它标记为正确的。谢谢。答案是我需要函数中的循环看起来像这样,并且它可以工作。因为(intx=1;X