示例#1
0
        public ObjectToken WriteObject(Stream stream, IToken token, int?reservedNumber = null)
        {
            int number;

            if (reservedNumber.HasValue)
            {
                if (!reservedNumbers.Remove(reservedNumber.Value))
                {
                    throw new InvalidOperationException();
                }

                number = reservedNumber.Value;
            }
            else
            {
                number = CurrentNumber++;
            }

            var reference = new IndirectReference(number, 0);
            var obj       = new ObjectToken(stream.Position, reference, token);

            objectOffsets.Add(reference, obj.Position);
            TokenWriter.WriteToken(obj, stream);
            return(obj);
        }
示例#2
0
        public override IndirectReferenceToken WriteToken(IToken token)
        {
            if (!Initialized)
            {
                InitializePdf(DefaultVersion);
            }

            ms.SetLength(0);
            TokenWriter.WriteToken(token, ms);
            var contents = ms.ToArray();

            if (AttemptDeduplication && hashes.TryGetValue(contents, out var value))
            {
                return(value);
            }

            var ir = ReserveObjectNumber();

            if (AttemptDeduplication)
            {
                hashes.Add(contents, ir);
            }

            offsets.Add(ir.Data, Stream.Position);
            TokenWriter.WriteObject(ir.Data.ObjectNumber, ir.Data.Generation, contents, Stream);

            return(ir);
        }
        public ObjectToken WriteObject(Stream stream, IToken token)
        {
            var reference = new IndirectReference(CurrentNumber++, 0);
            var obj       = new ObjectToken(stream.Position, reference, token);

            objectOffsets.Add(reference, obj.Position);
            TokenWriter.WriteToken(obj, stream);
            return(obj);
        }
示例#4
0
        private static ObjectToken WriteObject(IToken content, Stream stream, Dictionary <IndirectReference, long> objectOffsets, ref int number)
        {
            var reference = new IndirectReference(number++, 0);
            var obj       = new ObjectToken(stream.Position, reference, content);

            objectOffsets.Add(reference, obj.Position);
            // TODO: write
            TokenWriter.WriteToken(obj, stream);
            return(obj);
        }
示例#5
0
        public virtual IndirectReferenceToken WriteToken(IToken token, IndirectReferenceToken indirectReference)
        {
            if (!Initialized)
            {
                InitializePdf(DefaultVersion);
            }

            offsets.Add(indirectReference.Data, Stream.Position);
            var obj = new ObjectToken(Stream.Position, indirectReference.Data, token);

            TokenWriter.WriteToken(obj, Stream);
            return(indirectReference);
        }
示例#6
0
        public virtual IndirectReferenceToken WriteToken(IToken token)
        {
            if (!Initialized)
            {
                InitializePdf(DefaultVersion);
            }

            var ir = ReserveObjectNumber();

            offsets.Add(ir.Data, Stream.Position);
            var obj = new ObjectToken(Stream.Position, ir.Data, token);

            TokenWriter.WriteToken(obj, Stream);
            return(ir);
        }
示例#7
0
        public override IndirectReferenceToken WriteToken(IToken token, IndirectReferenceToken indirectReference)
        {
            if (!Initialized)
            {
                InitializePdf(DefaultVersion);
            }

            ms.SetLength(0);
            TokenWriter.WriteToken(token, ms);
            var contents = ms.ToArray();

            hashes.Add(contents, indirectReference);
            offsets.Add(indirectReference.Data, Stream.Position);
            TokenWriter.WriteObject(indirectReference.Data.ObjectNumber, indirectReference.Data.Generation, contents, Stream);
            return(indirectReference);
        }
示例#8
0
        public void Flush(decimal version, IndirectReferenceToken catalogReference)
        {
            if (catalogReference == null)
            {
                throw new ArgumentNullException(nameof(catalogReference));
            }

            WriteString($"%PDF-{version:0.0}", Stream);

            Stream.WriteText("%");
            Stream.WriteByte(169);
            Stream.WriteByte(205);
            Stream.WriteByte(196);
            Stream.WriteByte(210);
            Stream.WriteNewLine();

            var         offsets      = new Dictionary <IndirectReference, long>();
            ObjectToken catalogToken = null;

            foreach (var pair in tokenReferences)
            {
                var referenceToken = pair.Key;
                var token          = pair.Value;
                var offset         = Stream.Position;
                var obj            = new ObjectToken(offset, referenceToken.Data, token);

                TokenWriter.WriteToken(obj, Stream);

                offsets.Add(referenceToken.Data, offset);

                if (catalogToken == null && referenceToken == catalogReference)
                {
                    catalogToken = obj;
                }
            }

            if (catalogToken == null)
            {
                throw new Exception("Catalog object wasn't found");
            }

            // TODO: Support document information
            TokenWriter.WriteCrossReferenceTable(offsets, catalogToken, Stream, null);
        }