diff --git a/src/UglyToad.PdfPig.Tests/Integration/OptionalContentTests.cs b/src/UglyToad.PdfPig.Tests/Integration/OptionalContentTests.cs index de7dcbf4..f5383745 100644 --- a/src/UglyToad.PdfPig.Tests/Integration/OptionalContentTests.cs +++ b/src/UglyToad.PdfPig.Tests/Integration/OptionalContentTests.cs @@ -6,6 +6,18 @@ namespace UglyToad.PdfPig.Tests.Integration { public class OptionalContentTests { + [Fact] + public void NoMarkedOptionalContent() + { + using (var document = PdfDocument.Open(IntegrationHelpers.GetDocumentPath("AcroFormsBasicFields.pdf"))) + { + var page = document.GetPage(1); + var oc = page.ExperimentalAccess.GetOptionalContents(); + + Assert.Equal(0, oc.Count); + } + } + [Fact] public void MarkedOptionalContent() { diff --git a/src/UglyToad.PdfPig/Content/OptionalContentGroupElement.cs b/src/UglyToad.PdfPig/Content/OptionalContentGroupElement.cs index 2732bcbd..1a688c43 100644 --- a/src/UglyToad.PdfPig/Content/OptionalContentGroupElement.cs +++ b/src/UglyToad.PdfPig/Content/OptionalContentGroupElement.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using UglyToad.PdfPig.Tokenization.Scanner; using UglyToad.PdfPig.Tokens; namespace UglyToad.PdfPig.Content @@ -37,16 +38,16 @@ namespace UglyToad.PdfPig.Content /// public MarkedContentElement MarkedContent { get; } - internal OptionalContentGroupElement(MarkedContentElement markedContentElement) + internal OptionalContentGroupElement(MarkedContentElement markedContentElement, IPdfTokenScanner pdfTokenScanner) { MarkedContent = markedContentElement; // Type - Required - if (markedContentElement.Properties.TryGet(NameToken.Type, out NameToken type)) + if (markedContentElement.Properties.TryGet(NameToken.Type, pdfTokenScanner, out NameToken type)) { Type = type.Data; } - else if (markedContentElement.Properties.TryGet(NameToken.Type, out StringToken typeStr)) + else if (markedContentElement.Properties.TryGet(NameToken.Type, pdfTokenScanner, out StringToken typeStr)) { Type = typeStr.Data; } @@ -59,11 +60,11 @@ namespace UglyToad.PdfPig.Content { case "OCG": // Optional content group dictionary // Name - Required - if (markedContentElement.Properties.TryGet(NameToken.Name, out NameToken name)) + if (markedContentElement.Properties.TryGet(NameToken.Name, pdfTokenScanner, out NameToken name)) { Name = name.Data; } - else if (markedContentElement.Properties.TryGet(NameToken.Name, out StringToken nameStr)) + else if (markedContentElement.Properties.TryGet(NameToken.Name, pdfTokenScanner, out StringToken nameStr)) { Name = nameStr.Data; } @@ -73,15 +74,15 @@ namespace UglyToad.PdfPig.Content } // Intent - Optional - if (markedContentElement.Properties.TryGet(NameToken.Intent, out NameToken intentName)) + if (markedContentElement.Properties.TryGet(NameToken.Intent, pdfTokenScanner, out NameToken intentName)) { Intent = new string[] { intentName.Data }; } - else if (markedContentElement.Properties.TryGet(NameToken.Intent, out StringToken intentStr)) + else if (markedContentElement.Properties.TryGet(NameToken.Intent, pdfTokenScanner, out StringToken intentStr)) { Intent = new string[] { intentStr.Data }; } - else if (markedContentElement.Properties.TryGet(NameToken.Intent, out ArrayToken intentArray)) + else if (markedContentElement.Properties.TryGet(NameToken.Intent, pdfTokenScanner, out ArrayToken intentArray)) { List intentList = new List(); foreach (var token in intentArray.Data) @@ -108,7 +109,7 @@ namespace UglyToad.PdfPig.Content } // Usage - Optional - if (markedContentElement.Properties.TryGet(NameToken.Usage, out DictionaryToken usage)) + if (markedContentElement.Properties.TryGet(NameToken.Usage, pdfTokenScanner, out DictionaryToken usage)) { this.Usage = usage.Data; } @@ -116,25 +117,25 @@ namespace UglyToad.PdfPig.Content case "OCMD": // OCGs - Optional - if (markedContentElement.Properties.TryGet(NameToken.Ocgs, out DictionaryToken ocgsD)) + if (markedContentElement.Properties.TryGet(NameToken.Ocgs, pdfTokenScanner, out DictionaryToken ocgsD)) { // dictionary or array throw new NotImplementedException($"{NameToken.Ocgs}"); } - else if (markedContentElement.Properties.TryGet(NameToken.Ocgs, out ArrayToken ocgsA)) + else if (markedContentElement.Properties.TryGet(NameToken.Ocgs, pdfTokenScanner, out ArrayToken ocgsA)) { // dictionary or array throw new NotImplementedException($"{NameToken.Ocgs}"); } // P - Optional - if (markedContentElement.Properties.TryGet(NameToken.P, out NameToken p)) + if (markedContentElement.Properties.TryGet(NameToken.P, pdfTokenScanner, out NameToken p)) { throw new NotImplementedException($"{NameToken.P}"); } // VE - Optional - if (markedContentElement.Properties.TryGet(NameToken.VE, out ArrayToken ve)) + if (markedContentElement.Properties.TryGet(NameToken.VE, pdfTokenScanner, out ArrayToken ve)) { throw new NotImplementedException($"{NameToken.VE}"); } diff --git a/src/UglyToad.PdfPig/Content/Page.cs b/src/UglyToad.PdfPig/Content/Page.cs index 9ce53278..1b3ac8ab 100644 --- a/src/UglyToad.PdfPig/Content/Page.cs +++ b/src/UglyToad.PdfPig/Content/Page.cs @@ -199,14 +199,13 @@ /// Gets any optional content on the page. /// Does not handle XObjects and annotations for the time being. /// - public IDictionary> GetOptionalContents() + public IReadOnlyDictionary> GetOptionalContents() { + List mcesOptional = new List(); + // 4.10.2 // Optional content in content stream - var mc = page.Content?.GetMarkedContents(); - - List mcesOptional = new List(); - GetOptionalContentsRecursively(mc, ref mcesOptional); + GetOptionalContentsRecursively(page.Content?.GetMarkedContents(), ref mcesOptional); // Optional content in XObjects and annotations // TO DO @@ -217,11 +216,16 @@ private void GetOptionalContentsRecursively(IReadOnlyList markedContentElements, ref List mcesOptional) { + if (markedContentElements.Count == 0) + { + return; + } + foreach (var mce in markedContentElements) { if (mce.Tag == "OC") { - mcesOptional.Add(new OptionalContentGroupElement(mce)); + mcesOptional.Add(new OptionalContentGroupElement(mce, page.pdfScanner)); // we don't recurse } else if (mce.Children?.Count > 0) diff --git a/src/UglyToad.PdfPig/Content/PageContent.cs b/src/UglyToad.PdfPig/Content/PageContent.cs index 0e645df3..f2a03104 100644 --- a/src/UglyToad.PdfPig/Content/PageContent.cs +++ b/src/UglyToad.PdfPig/Content/PageContent.cs @@ -1,12 +1,11 @@ namespace UglyToad.PdfPig.Content { - using System; - using System.Collections.Generic; - using System.Linq; using Core; using Filters; using Graphics; using Graphics.Operations; + using System; + using System.Collections.Generic; using Tokenization.Scanner; using XObjects;