2
我在網上查了幾個例子,想出了使用iTextSharp合併pdf的代碼。但是我得到一個錯誤:。合併PDFs iTextSharp
{ 「該文檔沒有頁。」}
它未能在頁= writer.GetImportedPage(讀取器,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格式,所以他們不應該有任何問題,他們不完整或任何東西。我真的很想避免先把它們寫到磁盤上,然後再次讀取它們,像我在網上看到的其他例子那樣合併它們。這就是爲什麼我使用內存流編寫這個自定義的。 – kyleb
GetImportedPage的頁碼爲1。 – mkl
謝謝。你可以發表你的評論作爲答案,所以我把它標記爲正確的。謝謝。答案是我需要函數中的循環看起來像這樣,它的工作原理。 for(int X = 1; X
kyleb