C# 合并PDF iTextSharp
我在线查看了一些示例,并提出了使用iTextSharp合并PDF的代码。但我得到一个错误: {“文档没有页面。”} 在Page=writer.GetImportedPage(reader,X)处失败强> 下面是堆栈跟踪: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
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