internal PdfDictionary(PdfStreamReader reader) { _children = new PdfValueList(); _children.pdfReadChildren(reader, PdfValueType.DictionaryEnd); }
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; } } }
internal PdfArray(PdfStreamReader reader) { _children = new PdfValueList(); _children.pdfReadChildren(reader, PdfValueType.ArrayEnd); }