Beispiel #1
0
 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");
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        // 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);
        }
Beispiel #7
0
 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;
 }
Beispiel #8
0
 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;
     }
 }
Beispiel #9
0
        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);
        }