/// <summary> /// Prepends a new content stream and returns it. /// </summary> public PdfContent PrependContent() { Debug.Assert(Owner != null); SetModified(); PdfContent content = new PdfContent(Owner); Owner._irefTable.Add(content); Debug.Assert(content.Reference != null); Elements.Insert(0, content.Reference); return(content); }
/// <summary> /// Replaces the current content of the page with the specified bytes. /// </summary> PdfContent ReplaceContent(byte[] contentBytes) { Debug.Assert(Owner != null); PdfContent content = new PdfContent(Owner); content.CreateStream(contentBytes); Owner._irefTable.Add(content); Elements.Clear(); Elements.Add(content.Reference); return(content); }
void SetModified() { if (!_modified) { _modified = true; int count = Elements.Count; if (count == 1) { PdfContent content = (PdfContent)((PdfReference)Elements[0]).Value; content.PreserveGraphicsState(); } else if (count > 1) { // Surround content streams with q/Q operations byte[] value; int length; PdfContent content = (PdfContent)((PdfReference)Elements[0]).Value; if (content != null && content.Stream != null) { length = content.Stream.Length; value = new byte[length + 2]; value[0] = (byte)'q'; value[1] = (byte)'\n'; Array.Copy(content.Stream.Value, 0, value, 2, length); content.Stream.Value = value; content.Elements.SetInteger("/Length", length + 2); } content = (PdfContent)((PdfReference)Elements[count - 1]).Value; if (content != null && content.Stream != null) { length = content.Stream.Length; value = new byte[length + 3]; Array.Copy(content.Stream.Value, 0, value, 0, length); value[length] = (byte)' '; value[length + 1] = (byte)'Q'; value[length + 2] = (byte)'\n'; content.Stream.Value = value; content.Elements.SetInteger("/Length", length + 3); } } } }
/// <summary> /// Creates a single content stream with the bytes from the array of the content streams. /// This operation does not modify any of the content streams in this array. /// </summary> public PdfContent CreateSingleContent() { byte[] bytes = new byte[0]; byte[] bytes1; byte[] bytes2; foreach (PdfItem iref in Elements) { PdfDictionary cont = (PdfDictionary)((PdfReference)iref).Value; bytes1 = bytes; bytes2 = cont.Stream.UnfilteredValue; bytes = new byte[bytes1.Length + bytes2.Length + 1]; bytes1.CopyTo(bytes, 0); bytes[bytes1.Length] = (byte)'\n'; bytes2.CopyTo(bytes, bytes1.Length + 1); } PdfContent content = new PdfContent(Owner); content.Stream = new PdfDictionary.PdfStream(bytes, content); return(content); }