示例#1
0
        private void                    _writeObject(PdfValue obj)
        {
            var r = _referenceTable[obj];

            r.Position = _writer.PdfPosition;
            _writer.WriteObj(this, r, obj);
        }
示例#2
0
        internal PdfWriterReference      AddObj(PdfValue obj)
        {
            if (!_referenceTable.TryGetValue(obj, out var reference))
            {
                obj.pdfAddToDocument(this);

                reference = new PdfWriterReference(_xrefTable.Count);
                _xrefTable.Add(reference);
                _referenceTable.Add(obj, reference);

                if (obj is PdfPage)
                {
                    _pages.Add((PdfPage)obj);
                }

                if (obj.hasStream)
                {
                    reference.Position = _writer.PdfPosition;
                    _writer.WriteObj(this, reference, obj);
                }
                else
                {
                    _objToWrite.Add(obj);
                }
            }

            return(reference);
        }
        public PdfValue                ValueByName(string name)
        {
            for (int i = 0; i < Children.Count; ++i)
            {
                if (Children[i].Type == PdfValueType.Name)
                {
                    if (((PdfName)Children[i]).Value == name)
                    {
                        PdfValue Token = Children[i + 1];

                        return(Token);
                    }
                }
            }

            return(null);
        }
示例#4
0
 internal PdfWriterReference      GetReference(PdfValue obj)
 {
     return(_referenceTable[obj]);
 }
示例#5
0
 internal void                    setValue(PdfValue value)
 {
     this._value = value;
 }
        private void                        _readXrefObject(int pos, PdfStreamReader reader, PdfValue firstToken)
        {
            int id       = ((PdfInteger)firstToken).Value;
            int revision = reader.ReadInt();

            reader.ReadToken(PdfValueType.ObjectBegin);
            _allocateXrefTable(id + 1);
            var rr = new PdfReferenceReader(this, id, revision, pos);

            if (!(_readObj(reader, false) is PdfObjectReader obj))
            {
                throw new PdfExceptionReader("Invalid Xref obj.");
            }
            rr.setValue(obj);
            _xrefTable[id] = rr;

            var                dictionary = obj.Dictionary.Children;
            PdfValueList       w          = null;
            PdfValueList       index      = null;
            int                size       = 0;
            PdfReferenceReader prev       = null;

            for (int i = 0; i < dictionary.Count; ++i)
            {
                var entry = dictionary[i];
                if (entry is PdfName)
                {
                    switch (((PdfName)entry).Value)
                    {
                    case "W":       w = ((PdfArray)dictionary[++i]).Children;               break;

                    case "Index":   index = ((PdfArray)dictionary[++i]).Children;               break;

                    case "Size":    size = ((PdfInteger)dictionary[++i]).Value;                break;

                    case "Prev":    prev = (PdfReferenceReader)dictionary[++i];                break;

                    case "Root":    _rootReference = (PdfReferenceReader)dictionary[++i];                break;

                    case "Encrypt": _encryptReference = (PdfReferenceReader)dictionary[++i];                break;

                    case "Info":    _infoReference = (PdfReferenceReader)dictionary[++i];                break;

                    case "ID":      _id = ((PdfArray)dictionary[++i]).Children.ToArray();     break;
                    }
                }
            }

            if (obj.NamedType != "XRef" || w == null || index == null)
            {
                throw new PdfExceptionReader("Invalid xref object.");
            }

            int s1 = ((PdfInteger)w[0]).Value;
            int s2 = ((PdfInteger)w[1]).Value;
            int s3 = ((PdfInteger)w[2]).Value;

            id = ((PdfInteger)index[0]).Value;

            _allocateXrefTable(((PdfInteger)index[1]).Value);

            using (var r = new PdfXrefStreamReader(obj.GetUncompressStream())) {
                while (!r.EOF)
                {
                    int t  = r.ReadValue(s1);
                    int v2 = r.ReadValue(s2);
                    int v3 = r.ReadValue(s3);

                    switch (t)
                    {
                    case 0:                                                                             break;

                    case 1:     pdfGetReference(id, v3).setPosition(v2);                                break;

                    case 2:     pdfGetReference(id, 0).setCompressed(v3, pdfGetReference(v2, 0));       break;

                    default:    throw new PdfExceptionReader("cross-reference stream type #" + t + " unknown.");
                    }

                    ++id;
                }
            }
        }