internal PdfDictionary(PdfStreamReader reader)
 {
     _children = new PdfValueList();
     _children.pdfReadChildren(reader, PdfValueType.DictionaryEnd);
 }
Beispiel #2
0
        private void                                _readPageResources(PdfDictionary page)
        {
            PdfValueList resources = page.ValueByName <PdfDictionary>("Resources", mandatory: false)?.Children;

            if (resources != null)
            {
                for (int resourceIdx = 0; resourceIdx < resources.Count; ++resourceIdx)
                {
                    if (resources[resourceIdx] is PdfName)
                    {
                        string cls = resources[resourceIdx].Cast <PdfName>().Value;

                        try {
                            if (++resourceIdx >= resources.Count)
                            {
                                throw new PdfException("Resource dictionary corrupt.");
                            }


                            switch (cls)
                            {
#if DEBUG_TEST
                            case "ProcSet":
                                System.Diagnostics.Debug.WriteLine("Resourse " + cls);
                                break;

                            case "Properties": {
                                var resourceItems = resources[resourceIdx].Resolve <PdfDictionary>();

                                if ((resourceItems.Children.Count % 2) != 0)
                                {
                                    throw new PdfException("Resource dictionary corrupt.");
                                }

                                for (int ItemIdx = 0; ItemIdx < resourceItems.Children.Count - 1; ItemIdx += 2)
                                {
                                    System.Diagnostics.Debug.WriteLine("Resourse " + cls + " " + resourceItems.Children[ItemIdx].Cast <PdfName>().Value + " removed.");
                                }

                                ++resourceIdx;
                            }
                            break;
#else
                            case "ProcSet":
                            case "Properties":
                                ++resourceIdx;
                                break;
#endif
                            case "Font":
                            case "XObject":
                            case "ExtGState":
                            case "ColorSpace": {
                                var resourceItems = resources[resourceIdx].Resolve <PdfDictionary>();

                                if ((resourceItems.Children.Count % 2) != 0)
                                {
                                    throw new PdfException("Resource dictionary corrupt.");
                                }

                                for (int ItemIdx = 0; ItemIdx < resourceItems.Children.Count - 1; ItemIdx += 2)
                                {
                                    var value = resourceItems.Children[ItemIdx + 1];

                                    if (cls == "Font")
                                    {
                                        var fontDic = value.Resolve <PdfDictionary>();

                                        if (new PdfName("Type").Equals(fontDic.Children[0]) &&
                                            new PdfName("Font").Equals(fontDic.Children[1]) &&
                                            new PdfName("Subtype").Equals(fontDic.Children[2]) &&
                                            new PdfName("Type1").Equals(fontDic.Children[3]) &&
                                            new PdfName("BaseFont").Equals(fontDic.Children[4]) &&
                                            new PdfName("Encoding").Equals(fontDic.Children[6]) &&
                                            new PdfName("WinAnsiEncoding").Equals(fontDic.Children[7]))
                                        {
                                            var stdFont = PdfStandard.Standard.FindStandardFontByName(fontDic.Children[5].Cast <PdfName>().Value);
                                            if (stdFont != null)
                                            {
                                                value = stdFont;
                                            }
                                        }
                                    }

                                    _resources.Add(cls,
                                                   resourceItems.Children[ItemIdx].Cast <PdfName>().Value,
                                                   value);
                                }
                            }
                            break;
                            }
                        }
                        catch (Exception err) {
                            throw new PdfException("Processing resource '" + cls + "' failed.", err);
                        }
                    }
                }
            }
        }
        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;
                }
            }
        }
Beispiel #4
0
 internal PdfArray(PdfStreamReader reader)
 {
     _children = new PdfValueList();
     _children.pdfReadChildren(reader, PdfValueType.ArrayEnd);
 }