/// <summary> /// Implements saving a PDF file. /// </summary> void DoSave(PdfWriter writer) { if (this.pages == null || this.pages.Count == 0) throw new InvalidOperationException("Cannot save a PDF document with no pages."); try { bool encrypt = this.securitySettings.DocumentSecurityLevel != PdfDocumentSecurityLevel.None; if (encrypt) { PdfStandardSecurityHandler securityHandler = this.securitySettings.SecurityHandler; if (securityHandler.Reference == null) this.irefTable.Add(securityHandler); else Debug.Assert(this.irefTable.Contains(securityHandler.ObjectID)); this.trailer.Elements[PdfTrailer.Keys.Encrypt] = this.securitySettings.SecurityHandler.Reference; } else this.trailer.Elements.Remove(PdfTrailer.Keys.Encrypt); PrepareForSave(); if (encrypt) this.securitySettings.SecurityHandler.PrepareEncryption(); writer.WriteFileHeader(this); PdfReference[] irefs = this.irefTable.AllReferences; int count = irefs.Length; for (int idx = 0; idx < count; idx++) { PdfReference iref = irefs[idx]; #if DEBUG_ if (iref.ObjectNumber == 378) GetType(); #endif iref.Position = writer.Position; iref.Value.WriteObject(writer); } int startxref = writer.Position; this.irefTable.WriteObject(writer); writer.WriteRaw("trailer\n"); this.trailer.Elements.SetInteger("/Size", count + 1); this.trailer.WriteObject(writer); writer.WriteEof(this, startxref); //if (encrypt) //{ // this.state &= ~DocumentState.SavingEncrypted; // //this.securitySettings.SecurityHandler.EncryptDocument(); //} } finally { if (writer != null) { writer.Stream.Flush(); // DO NOT CLOSE WRITER HERE //writer.Close(); } } }