예제 #1
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var resources = (Resources)item;

            writer.WriteDictionaryStart();

            if (resources.Fonts?.Count > 0)
            {
                writer.WriteRaw("Font", PdfTokens.StartDictionary);
                for (var i = 0; i < resources.Fonts.Count; i++)
                {
                    var fontRef = references[resources.Fonts[i]];
                    writer.WriteReference($"{resources.Fonts[i].Id.ToString().Replace("-", "")}", fontRef);
                }
                writer.WriteLine(PdfTokens.EndDictionary);
            }

            if (resources.Images?.Count > 0)
            {
                writer.WriteRaw("XObject", PdfTokens.StartDictionary);
                for (var i = 0; i < resources.Images.Count; i++)
                {
                    var imgRef = references[resources.Images[i]];
                    writer.WriteReference($"{resources.Images[i].Id.ToString().Replace("-", "")}", imgRef);
                }
                writer.WriteLine(PdfTokens.EndDictionary);
            }

            writer.WriteDictionaryEnd();
        }
예제 #2
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var trailer = (PdfTrailer)item;

            writer.WriteDictionaryStart();

            writer.WriteRaw("Size", trailer.Size);
            writer.WriteReference("Root", trailer.Root);

            writer.WriteDictionaryEnd();
        }
예제 #3
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var catalog = (Catalog)item;

            writer.WriteDictionaryStart();

            writer.WriteType(catalog.Type);
            writer.WriteReference(nameof(catalog.Pages), references[catalog.Pages]);

            writer.WriteDictionaryEnd();
        }
예제 #4
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var font = (Font)item;

            writer.WriteDictionaryStart();

            writer.WriteType(font.Type);
            writer.WriteSubtype(font.Subtype.ToString());
            writer.WriteName("BaseFont", font.BaseFont);

            writer.WriteDictionaryEnd();
        }
예제 #5
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var pageNode = (PageNode)item;

            writer.WriteDictionaryStart();

            writer.WriteType(pageNode.Type);
            writer.WriteRaw(nameof(pageNode.Count), pageNode.Count);
            writer.WriteReferences(nameof(pageNode.Kids), pageNode.Kids.Select(k => references[k]));

            writer.WriteDictionaryEnd();
        }
예제 #6
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var xrefTable = (XrefTable)item;

            writer.WriteLine($"0 {xrefTable.Entries.Count}");
            foreach (var xref in xrefTable.Entries)
            {
                var offset     = xref.Offset.ToString().PadLeft(10, '0');
                var generation = xref.Reference.Generation.ToString().PadLeft(5, '0');
                var free       = xref.Free ? "f" : "n";
                writer.WriteLine($"{offset} {generation} {free}");
            }
        }
예제 #7
0
        public SerializationResult SerializeTree(PdfWriter writer, IPdfObject root)
        {
            var references = new List <Guid>();
            var indRefs    = new IndirectObjectDictionary();

            // Add empty GUID to represent the "free" object
            references.Add(Guid.Empty);

            var offsets = new List <int>();

            // need to visit all nodes to reserve references for each node

            var nodesToSerialize = new ConcurrentQueue <IPdfObject>();
            var nodesToVisit     = new Stack <IPdfObject>();

            nodesToVisit.Push(root);
            while (nodesToVisit.Count > 0)
            {
                var node = nodesToVisit.Pop();
                if (node == null || indRefs.Contains(node))
                {
                    continue;
                }

                nodesToVisit.PushRange(node.GetChildren());
                indRefs.Add(node);
                nodesToSerialize.Enqueue(node);
            }

            while (nodesToSerialize.TryDequeue(out IPdfObject node))
            {
                offsets.Add((int)writer.Position);
                writer.WriteLine($"{indRefs[node].Identifier} 0 {PdfTokens.StartObject}");
                SerdesFactory.GetFor(node).Serialize(writer, node, indRefs);
                writer.WriteLine(PdfTokens.EndObject);
            }

            return(new SerializationResult()
            {
                Offsets = offsets,
                References = indRefs
            });
        }
예제 #8
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var img = (ImageExternalObject)item;

            writer.WriteDictionaryStart();
            writer.WriteType(PdfObjectType.XObject);
            writer.WriteSubtype(img.Subtype.ToString());
            writer.WriteRaw(nameof(img.Width), img.Width);
            writer.WriteRaw(nameof(img.Height), img.Height);
            writer.WriteName(nameof(img.ColorSpace), new Name(img.ColorSpace.ToString()));
            writer.WriteRaw(nameof(img.BitsPerComponent), img.BitsPerComponent);
            writer.WriteRaw("Length", img.Data.Length);
            writer.WriteDictionaryEnd();

            writer.WriteLine(PdfTokens.Stream.Start);
            writer.Write(img.Data);
            writer.WriteLine();
            writer.WriteLine(PdfTokens.Stream.End);
        }
예제 #9
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var page = (Page)item;

            writer.WriteDictionaryStart();
            writer.WriteType(page.Type);
            writer.WriteReference(nameof(page.Parent), references[page.Parent]);

            writer.WriteRaw(nameof(page.Resources), string.Empty);

            SerdesFactory.GetFor(page.Resources).Serialize(writer, page.Resources, references);

            writer.WriteRaw(nameof(page.MediaBox), string.Empty);

            SerdesFactory.GetFor(page.MediaBox).Serialize(writer, page.MediaBox, references);

            writer.WriteReference(nameof(page.Contents), references[page.Contents]);

            writer.WriteDictionaryEnd();
        }
예제 #10
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var contentStream = (ContentStream)item;

            var streamData = new StringBuilder();

            foreach (var image in contentStream.ImageContent)
            {
                streamData.AppendLine(PdfTokens.Graphics.StateOperators.Save);
                // move/scale cm
                var xform = Transformer.GetTransform(new Rectangle(0, 0, 1), image.Rectangle);
                streamData.AppendLine($"{xform.M11} {xform.M12} {xform.M21} {xform.M22} {xform.M31} {xform.M32} {PdfTokens.Graphics.TransformOperators.ModifyTransformationMatrix}");

                // Do image
                streamData.AppendLine($"/{image.Image.Id.ToString().Replace("-", "")} {PdfTokens.Graphics.ImageOperators.Draw}");

                streamData.AppendLine(PdfTokens.Graphics.StateOperators.Restore);
            }

            foreach (var text in contentStream.TextContent)
            {
                streamData.AppendLine(PdfTokens.Text.Begin);
                streamData.AppendLine($"{text.FillColor.Red} {text.FillColor.Green} {text.FillColor.Blue} {PdfTokens.Graphics.ColorOperators.SetFillRGB}");
                streamData.AppendLine($"/{text.Font.Id.ToString().Replace("-", "")} {text.FontSize} {PdfTokens.Text.StateOperators.FontSize}");
                streamData.AppendLine($"{text.Rectangle.X} {text.Rectangle.Y} {PdfTokens.Text.PositioningOperators.MoveFromCurrent}");
                streamData.AppendLine($"( {text.Text} ) {PdfTokens.Text.ShowingOperators.Show}");
                streamData.AppendLine(PdfTokens.Text.End);
            }



            var streamContents = streamData.ToString();

            writer.WriteDictionaryStart();
            writer.WriteRaw("Length", streamContents.Length);
            writer.WriteDictionaryEnd();

            writer.WriteLine(PdfTokens.Stream.Start);
            writer.Write(streamContents);
            writer.WriteLine(PdfTokens.Stream.End);
        }
예제 #11
0
        public void Serialize(PdfWriter writer, object item, IndirectObjectDictionary references)
        {
            var rect = (Rectangle)item;

            writer.Write($"[{rect.X} {rect.Y} {rect.Width} {rect.Height}]");
        }