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); }
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); }
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); }
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); }
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); }
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); }
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); }