public PdfReference GetIndirectReference(PdfCrossReference xref) { return(new PdfReference(this) { ObjectNumber = xref.ObjectNumber, Generation = xref.Generation }); }
private void WriteIndirectObject(PdfCrossReference obj) { if (obj.EntryType != XrefEntryType.Used) { return; } AsciiToOutput($"{obj.ObjectNumber} {obj.Generation} obj\n"); WriteObject(obj.Object); AsciiToOutput("\nendobj\n"); }
private PdfCrossReference ParseFromStream(PdfCrossReference indirectObj) { PdfCrossReference streamObjRef = _doc.Xref.Get(indirectObj.StreamObjectNumber, 0); if (streamObjRef == null || streamObjRef.EntryType != XrefEntryType.Used) { throw new Exception("Indirect object stream could not be found"); } ParseIndirectObjectDefinition(streamObjRef); var objectStream = streamObjRef.Object as ObjectStream; indirectObj.Object = objectStream[indirectObj.Offset]; indirectObj.Loaded = true; return(indirectObj); }
private IPdfStream SetObjectType(PdfCrossReference xref, PdfStream stream) { if (!stream.Dict.ContainsKey("/Type")) { return(stream); } string objType = stream.Dict.Get <PdfName>("/Type").Name; switch (objType) { case "/XRef": return(new XrefObject(stream, xref.ObjectNumber)); case "/ObjStm": return(new ObjectStream(_doc, stream)); case "/XObject": return(new XObject(stream)); default: return(stream); } }
internal IPdfObject ResolveReference(PdfReference reference) { PdfCrossReference indirectObj = Xref.Get(reference.ObjectNumber, reference.Generation); if (indirectObj == null) { return(null); } if (!indirectObj.Loaded) { Parser.ParseIndirectObjectDefinition(indirectObj); } IPdfObject obj = indirectObj.Object; if (obj is PdfReference) { return(ResolveReference(obj as PdfReference)); } return(obj); }
// For some objects it is useful to have access to special properties for access or manipulation. // Those are selected from the /Type here private IPdfObject SetObjectType(PdfCrossReference xref, PdfDictionary dict) { if (dict.ContainsKey("/Type")) { string objType = dict.Get <PdfName>("/Type").Name; switch (objType) { case "/Catalog": return(new Catalog(dict)); case "/Pages": return(new Pages(dict)); case "/Page": return(new Page(dict)); case "/Font": return(new Font(dict)); } } if (xref.ObjectNumber == _doc.Trailer.Info.ObjectNumber && xref.Generation == _doc.Trailer.Info.Generation) { return(new InformationDictionary(dict)); } return(dict); }
protected internal void Write(PdfIndirectObject indirect, int refNumber) { PdfCrossReference pxref = new PdfCrossReference(refNumber, position); xrefs.Remove(pxref); xrefs[pxref] = null; indirect.WriteTo(writer.Os); position = writer.Os.Counter; }
internal PdfIndirectObject Add(PdfObject objecta, int refNumber, bool inObjStm) { if (inObjStm && objecta.CanBeInObjStm() && writer.FullCompression) { PdfCrossReference pxref = AddToObjStm(objecta, refNumber); PdfIndirectObject indirect = new PdfIndirectObject(refNumber, objecta, writer); xrefs.Remove(pxref); xrefs[pxref] = null; return indirect; } else { PdfIndirectObject indirect = new PdfIndirectObject(refNumber, objecta, writer); PdfCrossReference pxref = new PdfCrossReference(refNumber, position); xrefs.Remove(pxref); xrefs[pxref] = null; indirect.WriteTo(writer.Os); position = writer.Os.Counter; return indirect; } }
internal PdfCrossReference ParseIndirectObjectDefinition(PdfCrossReference indirectObj) { int offset = -1; if (indirectObj == null) { offset = _lexer.Current.Offset; } else { if (indirectObj.Loaded) { return(indirectObj); } // Entry points to an indirect object stream - resolve that. if (indirectObj != null && indirectObj.EntryType == XrefEntryType.InStream) { return(ParseFromStream(indirectObj)); } _lexer.Seek(indirectObj.Offset); _lexer.Next(); Expect(TokenType.Integer); } int objectNumber = (int)_lexer.Current.Value; _lexer.Next(); Expect(TokenType.Integer); int generation = (int)_lexer.Current.Value; if (indirectObj == null) { indirectObj = new PdfCrossReference() { EntryType = XrefEntryType.Used, ObjectNumber = objectNumber, Generation = generation, Offset = offset } } ; else if (objectNumber != indirectObj.ObjectNumber || generation != indirectObj.Generation) { throw new ParserException($"Expecting object {indirectObj.ObjectNumber} {indirectObj.Generation} at offset {indirectObj.Offset} but got {objectNumber} {generation}"); } _lexer.Next(); Expect(TokenType.Object); IPdfObject obj = ParseObject(); _lexer.Next(); if (Accept(TokenType.Stream)) { if (!(obj is PdfDictionary)) { throw new ParserException("Stream objects must be preceded by a dictionary"); } obj = SetObjectType(indirectObj, ParseStream(obj as PdfDictionary)); _lexer.Next(); } else if (obj is PdfDictionary) { obj = SetObjectType(indirectObj, obj as PdfDictionary); } Expect(TokenType.EndObject); indirectObj.Object = obj; indirectObj.Loaded = true; return(indirectObj); }