private void                        _constructPages(PdfDictionary pageNode, List <PdfDictionary> pages)
        {
            switch (pageNode.NamedType)
            {
            case "Page":
                pages.Add(pageNode);
                return;

            case "Pages":
                foreach (PdfValue kid in pageNode.ValueByName <PdfArray>("Kids").Children)
                {
                    _constructPages(kid.Resolve <PdfDictionary>(), pages);
                }
                break;
            }
        }
示例#2
0
        private void                                _readPageContent(PdfDictionary page)
        {
            var contents = page.ValueByName("Contents");

            if (contents is PdfArray pdfArray)
            {
                var        contentsArray = pdfArray.Children;
                PdfContent Parent        = null;

                for (int i = 0; i < contentsArray.Count - 1; ++i)
                {
                    if (!(contentsArray[i] is PdfReferenceReader))
                    {
                        throw new PdfException("Invalid content referecen.");
                    }

                    Parent = new PdfContent(Parent, ((PdfReferenceReader)contentsArray[i]).Object);
                }

                if (!(contentsArray[contentsArray.Count - 1] is PdfReferenceReader))
                {
                    throw new PdfException("Invalid content referecen.");
                }

                _parent = Parent;
                _readContent(((PdfReferenceReader)contentsArray[contentsArray.Count - 1]).Object);
            }
            else if (contents is PdfReferenceReader pdfRR)
            {
                _readContent(pdfRR.Object);
            }
            else
            {
                throw new PdfExceptionReader("Unknown Content " + contents.GetType().Name);
            }
        }
示例#3
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);
                        }
                    }
                }
            }
        }