/// <summary> /// Writes the given object to the page (writes it on the document and adds it on this page). /// Returns an object reference to the object. /// </summary> public virtual PdfObjectRef WriteObject(PdfObject obj) { if (obj is PdfScriptObject) { foreach (var font in ((PdfScriptObject)obj).ReferencedFonts) DocumentWriter.RegisterFont(font); } var objRef = DocumentWriter.WriteObject(obj); this.WriteObjectRef(objRef); return objRef; }
/// <summary> /// Closes this PageWriter, writing as PageObject to the document. /// </summary> public virtual void Close() { if(DocumentWriter != null) { // Create and write the PageObject: var pageObj = new PdfObject(); pageObj.Data["Type"] = "/Page"; pageObj.Data["MediaBox"] = String.Format("[0 0 {0:0.###} {1:0.###}]", this.Width, this.Height); if (this.Content.Count > 0) pageObj.Data["Contents"] = "[" + String.Join(" ", this.Content.Select(c => c.ToString())) + "]"; DocumentWriter.WritePage(pageObj); // Page is now closed: DocumentWriter = null; } }
/// <summary> /// Writes a PdfPageObject and links it to the pages tree. /// For internal use. /// </summary> public void WritePage(PdfObject pageObj) { pageObj.Data["Type"] = "/Page"; pageObj.Data["Parent"] = PagesRef; pageObj.Data["Resources"] = ResourcesRef; var pageObjRef = this.WriteObject(pageObj); PageRefs.Add(pageObjRef); }
protected virtual void WriteTrailer() { var resources = new PdfObject(); if (this.Fonts.Count > 0) resources.Data["Font"] = "<< " + String.Join(" ", this.Fonts.Select(kv => kv.Key + " " + kv.Value)) + " >>"; if (this.XObjects.Count > 0) resources.Data["XObject"] = "<< " + String.Join(" ", this.XObjects.Select(kv => kv.Key + " " + kv.Value)) + " >>"; this.WriteObject(resources, ResourcesRef); var pages = new PdfObject(); pages.Data["Type"] = "/Pages"; pages.Data["Count"] = PageRefs.Count; pages.Data["Kids"] = "[" + String.Join(" ", PageRefs.Select(r => r.ToString())) + "]"; WriteObject(pages, PagesRef); var xrefStart = this.Position; var builder = new StringBuilder(); builder.Append("xref\r\n"); builder.Append("0 "); builder.Append(Xref.Count + 1); builder.Append("\r\n"); builder.Append("0000000000 65535 f\r\n"); foreach (var offset in Xref) { if (offset < 0) { builder.AppendFormat("{0:0000000000} {1:00000} {2}\r\n", 0L, CurrentGenerationId, 'f'); } else { builder.AppendFormat("{0:0000000000} {1:00000} {2}\r\n", offset, CurrentGenerationId, 'n'); } } var fileId = Guid.NewGuid().ToString().Replace("-", ""); builder.Append("trailer\n<<\n/Size "); builder.Append(Xref.Count + 1); builder.Append("\n/Root "); builder.Append(CatalogRef); builder.Append("\n/Info "); builder.Append(InfoRef); builder.Append("\n/ID [<"); builder.Append(fileId); builder.Append("><"); builder.Append(fileId); builder.Append(">]"); builder.Append("\n>>\nstartxref\n"); builder.Append(xrefStart); builder.Append("\n%%EOF\n"); this.WriteRaw(builder.ToString()); }
/// <summary> /// Writes a PdfObject to this document given its object reference. /// </summary> public virtual void WriteObject(PdfObject obj, PdfObjectRef objRef) { if (obj is PdfScriptObject) { foreach (var font in ((PdfScriptObject)obj).ReferencedFonts) RegisterFont(font); } Xref[objRef.ObjectId-1] = this.Position; var builder = new StringBuilder(); builder.Append(objRef.ObjectId + " " + objRef.GenerationId + " obj\n"); if (obj.Data != null || obj.Stream != null) { builder.Append("<<\n"); if (obj.Data != null) { foreach (var pair in obj.Data) { builder.Append('/'); builder.Append(pair.Key); builder.Append(' '); builder.Append(pair.Value.ToString()); builder.Append('\n'); } } if (obj.Stream == null) { builder.Append(">>\n"); } else if (obj.Stream is PdfBinaryStream) { var s = ((PdfBinaryStream)obj.Stream); builder.Append("/Length "); builder.Append(s.Length); builder.Append("\n/Filter ["); builder.Append(s.Filter); builder.Append("]\n>>\n"); builder.Append("stream\n"); this.WriteRaw(builder.ToString()); builder.Length = 0; this.WriteRaw(s.Content, 0, s.Content.Length); builder.Append("\nendstream\n"); } else { byte[] bytes; if ((obj.Stream is PdfTextStream) && (this.Options.TextFilter != null)) { bytes = this.Options.TextFilter.EncodeString(((PdfTextStream)obj.Stream).Content.ToString()); builder.Append("/Filter ["); builder.Append(this.Options.TextFilter.Name); builder.Append("]\n"); } else { bytes = Encoding.Default.GetBytes(((PdfTextStream)obj.Stream).Content.ToString()); } builder.Append("/Length "); builder.Append(bytes.Length); builder.Append('\n'); builder.Append(">>\n"); builder.Append("stream\n"); this.WriteRaw(builder.ToString()); builder.Length = 0; this.WriteRaw(bytes, 0, bytes.Length); builder.Append("\nendstream\n"); } } builder.Append("endobj\n"); this.WriteRaw(builder.ToString()); }
/// <summary> /// Writes a PdfObject to this document and returns the reference to that object. /// Note that this does not add the object to a page. /// </summary> public PdfObjectRef WriteObject(PdfObject obj) { var objRef = NewObjectRef(); this.WriteObject(obj, objRef); return objRef; }
/// <summary> /// Adds an 'XObject' to the stream and returns a reference object to it. /// </summary> public PdfObjectRef AddXObject(PdfObject obj) { var objRef = this.NewObjectRef(); var name = (obj.Data.ContainsKey("Name")) ? obj.Data["Name"].ToString() : objRef.ToDefaultName(); if (obj.Data.ContainsKey("Type") && !"/XObject".Equals(obj.Data["Type"])) throw new ArgumentException("PdfObject is not a valid XObject, it's Type must be '/XObject'."); obj.Data["Type"] = "/XObject"; if (!obj.Data.ContainsKey("Subtype")) obj.Data["Subtype"] = "/Form"; obj.Data["Name"] = name; this.WriteObject(obj, objRef); RegisterXObject(objRef, name); return objRef; }
/// <summary> /// Adds an image to the PDF document and returns a reference object to it. /// </summary> public PdfObjectRef AddImage(Image image) { var obj = new PdfObject(); obj.Data["Subtype"] = "/Image"; obj.Data["Width"] = image.Width; obj.Data["Height"] = image.Height; obj.Data["BitsPerComponent"] = "8"; obj.Data["ColorSpace"] = "/DeviceRGB"; using (var ms = new MemoryStream()) { image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); obj.Stream = new PdfBinaryStream("/DCTDecode", ms.ToArray()); } var objRef = AddXObject(obj); ImageRatios[objRef] = (double)image.Height / image.Width; return objRef; }
protected virtual void WriteIntro() { var binarybytes = new byte[] { 0xE2, 0xE3, 0xCF, 0xD3 }; WriteRaw("%PDF-" + PdfVersion + "\n%"); WriteRaw(binarybytes, 0, binarybytes.Length); WriteRaw("\n%Arebis.Pdf .NET Library\n"); var catalog = new PdfObject(); catalog.Data["Type"] = "/Catalog"; catalog.Data["Version"] = "/" + PdfVersion; catalog.Data["Pages"] = PagesRef; WriteObject(catalog, CatalogRef); var info = new PdfObject(); if (!String.IsNullOrWhiteSpace(this.Options.Title)) info.Data["Title"] = '(' + this.Options.Title + ')'; if (!String.IsNullOrWhiteSpace(this.Options.Subject)) info.Data["Subject"] = '(' + this.Options.Subject + ')'; if (!String.IsNullOrWhiteSpace(this.Options.Keywords)) info.Data["Keywords"] = '(' + this.Options.Keywords + ')'; info.Data["Author"] = '(' + ((!String.IsNullOrWhiteSpace(this.Options.Author)) ? this.Options.Author : Environment.UserName) + ')'; info.Data["Creator"] = "(" + PdfCreator + ")"; var now = DateTime.Now; var timezone = TimeZone.CurrentTimeZone.GetUtcOffset(now); info.Data["CreationDate"] = "(D:" + now.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture) + (timezone.Ticks >= 0 ? '+' : '-') + String.Format("{0:00}'{1:00}'", Math.Abs(timezone.Hours), Math.Abs(timezone.Minutes)) + ")"; WriteObject(info, InfoRef); }