예제 #1
0
 /// <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;
 }
예제 #2
0
        /// <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;
            }
        }
예제 #3
0
 /// <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);
 }
예제 #4
0
        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());
        }
예제 #5
0
        /// <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());
        }
예제 #6
0
 /// <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;
 }
예제 #7
0
        /// <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;
        }
예제 #8
0
        /// <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;
        }
예제 #9
0
        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);
        }