【发布时间】: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