From a79c17988a43c7d501d1556db2c228ffb0a33460 Mon Sep 17 00:00:00 2001 From: Kakhnovich Raman Date: Wed, 17 Sep 2025 15:25:46 +0300 Subject: [PATCH 1/6] Add funcionality to filter invisible OCGs --- .../gf/model/factory/chunks/ChunkParser.java | 70 +++++++++++++++++++ .../model/impl/containers/StaticStorages.java | 6 ++ 2 files changed, 76 insertions(+) diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java index 25b2fd7ba..af6b1890c 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java @@ -27,6 +27,7 @@ import org.verapdf.model.tools.constants.Operators; import org.verapdf.cos.*; import org.verapdf.operator.Operator; +import org.verapdf.pd.PDDocument; import org.verapdf.pd.PDExtGState; import org.verapdf.pd.PDResource; import org.verapdf.pd.colors.PDColorSpace; @@ -35,6 +36,7 @@ import org.verapdf.pd.colors.PDDeviceRGB; import org.verapdf.pd.images.PDXForm; import org.verapdf.pd.images.PDXObject; +import org.verapdf.tools.StaticResources; import org.verapdf.wcag.algorithms.entities.content.*; import org.verapdf.wcag.algorithms.entities.geometry.BoundingBox; import org.verapdf.wcag.algorithms.entities.geometry.MultiBoundingBox; @@ -59,6 +61,7 @@ public class ChunkParser { private final Deque graphicsStateStack = new ArrayDeque<>(); private final Stack markedContentStack = new Stack<>(); + private final Stack visibleContentStack = new Stack(); private final Set processedMCIDs = new HashSet<>(); @@ -97,6 +100,13 @@ public void parseChunk(Operator rawOperator, List arguments) { case Operators.BDC: processLineArts(); Long mcid = getMCID(arguments, resourceHandler); + if (StaticStorages.getIsFilterInvisibleLayers()) { + if (getLayerVisibility(arguments, resourceHandler)) { + visibleContentStack.push(true); + } else { + visibleContentStack.push(false); + } + } if (mcid != null) { if (processedMCIDs.contains(mcid)) { mcid = null; @@ -112,6 +122,9 @@ public void parseChunk(Operator rawOperator, List arguments) { markedContentStack.pop(); } else { LOGGER.log(Level.WARNING, "EMC operator does not have a balancing BMC/BDC operator"); + } + if (!visibleContentStack.isEmpty()) { + visibleContentStack.pop(); } break; case Operators.G_FILL: { @@ -268,6 +281,9 @@ public void parseChunk(Operator rawOperator, List arguments) { break; case Operators.TJ_SHOW: { processLineArts(); + if (!processLayers()) { + break; + } TextChunk textChunk = createTextChunk(arguments, Operators.TJ_SHOW); if (textChunk != null) { putChunk(getMarkedContent(), textChunk); @@ -277,6 +293,9 @@ public void parseChunk(Operator rawOperator, List arguments) { case Operators.TJ_SHOW_POS: { processLineArts(); TextChunk textChunk = createTextChunk(arguments, Operators.TJ_SHOW_POS); + if (!processLayers()) { + break; + } if (textChunk != null) { putChunk(getMarkedContent(), textChunk); } @@ -285,6 +304,9 @@ public void parseChunk(Operator rawOperator, List arguments) { case Operators.QUOTE: { processLineArts(); processT_STAR(); + if (!processLayers()) { + break; + } TextChunk textChunk = createTextChunk(arguments, Operators.QUOTE); if (textChunk != null) { putChunk(getMarkedContent(), textChunk); @@ -298,6 +320,9 @@ public void parseChunk(Operator rawOperator, List arguments) { processDoubleQuote(arguments.get(0).getReal(), arguments.get(1).getReal()); } TextChunk textChunk = createTextChunk(arguments, Operators.DOUBLE_QUOTE); + if (!processLayers()) { + break; + } if (textChunk != null) { putChunk(getMarkedContent(), textChunk); } @@ -343,6 +368,9 @@ public void parseChunk(Operator rawOperator, List arguments) { break; case Operators.BI: processLineArts(); + if (!processLayers()) { + break; + } putChunk(getMarkedContent(), new ImageChunk(parseImageBoundingBox())); break; case Operators.C_CURVE_TO: @@ -480,6 +508,9 @@ public void parseChunk(Operator rawOperator, List arguments) { PDXObject xObject = resourceHandler.getXObject(getLastCOSName(arguments)); if (xObject != null) { if (ASAtom.IMAGE.equals(xObject.getType())) { + if (!processLayers()) { + break; + } putChunk(getMarkedContent(), new ImageChunk(parseImageBoundingBox())); } else if (ASAtom.FORM.equals(xObject.getType())) { Long markedContent = getMarkedContent(); @@ -885,6 +916,9 @@ private static Long getMCID(List arguments, ResourceHandler resources) } else if (lastArg.getType() == COSObjType.COS_NAME && resources != null) { PDResource properties = resources.getProperties(lastArg.getName()); if (properties != null) { + COSObject object = properties.getObject(); + PDDocument doc = StaticResources.getDocument(); + doc.getCatalog().getOCProperties().getGroupNames(); COSBase cosProperties = properties.getObject().getDirectBase(); if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { return cosProperties.getIntegerKey(ASAtom.MCID); @@ -895,6 +929,31 @@ private static Long getMCID(List arguments, ResourceHandler resources) return null; } + private static boolean getLayerVisibility(List arguments, ResourceHandler resources) { + if (!arguments.isEmpty()) { + COSBase lastArg = arguments.get(arguments.size() - 1); + if (arguments.get(0).getType() == COSObjType.COS_NAME) { + if (arguments.get(0).getName().equals(ASAtom.OC)) { + if (lastArg.getType() == COSObjType.COS_NAME && resources != null) { + PDResource properties = resources.getProperties(lastArg.getName()); + if (properties != null) { + COSBase cosProperties = properties.getObject().getDirectBase(); + if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { + String name = cosProperties.getStringKey(ASAtom.NAME); + PDDocument doc = StaticResources.getDocument(); + String[] names = doc.getCatalog().getOCProperties().getGroupNames(); + if (Arrays.asList(names).contains(name)) { + return doc.getCatalog().getOCProperties().isVisibleLayer(name); + } + } + } + } + } + } + } + return true; + } + private LineChunk transformLineChunk(LineChunk lineChunk, double lineWidth, int lineCap) { return LineChunk.createLineChunk(pageNumber, graphicsState.getCTM().transformX(lineChunk.getStartX(), lineChunk.getStartY()), @@ -971,4 +1030,15 @@ public void processLineArts() { boundingBoxes.clear(); } } + + public boolean processLayers() { + if (!StaticContainers.isDataLoader()) { + return true; + } + if (StaticStorages.getIsFilterInvisibleLayers()) { + return visibleContentStack.isEmpty() || visibleContentStack.peek(); + } else { + return true; + } + } } diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java b/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java index ee72f1bb5..6966b70a5 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java @@ -30,11 +30,13 @@ public class StaticStorages { private static final ThreadLocal chunks = new ThreadLocal<>(); private static final ThreadLocal isIgnoreMCIDs = new ThreadLocal<>(); private static final ThreadLocal isAddSpacesBetweenTextPieces = new ThreadLocal<>(); + private static final ThreadLocal isFilterInvisibleLayers = new ThreadLocal<>(); public static void clearAllContainers() { chunks.set(new ChunkContainer()); isIgnoreMCIDs.set(false); isAddSpacesBetweenTextPieces.set(false); + isFilterInvisibleLayers.set(false); } public static ChunkContainer getChunks() { @@ -52,6 +54,10 @@ public static Boolean getIsIgnoreMCIDs() { return isIgnoreMCIDs.get(); } + public static Boolean getIsFilterInvisibleLayers() {return isFilterInvisibleLayers.get();} + + public static void setIsFilterInvisibleLayers(Boolean isFilterInvisibleLayers) { StaticStorages.isFilterInvisibleLayers.set(isFilterInvisibleLayers);} + public static void setIsIgnoreMCIDs(Boolean isIgnoreMCIDs) { StaticStorages.isIgnoreMCIDs.set(isIgnoreMCIDs); } From e6ae58e3f019f37bb77bb3d8260eb9665e727faa Mon Sep 17 00:00:00 2001 From: Kakhnovich Raman Date: Wed, 17 Sep 2025 21:56:18 +0300 Subject: [PATCH 2/6] Some refactoring --- .../gf/model/factory/chunks/ChunkParser.java | 46 +++++++++---------- .../model/impl/containers/StaticStorages.java | 4 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java index af6b1890c..fce44ee52 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java @@ -27,6 +27,7 @@ import org.verapdf.model.tools.constants.Operators; import org.verapdf.cos.*; import org.verapdf.operator.Operator; +import org.verapdf.pd.PDCatalog; import org.verapdf.pd.PDDocument; import org.verapdf.pd.PDExtGState; import org.verapdf.pd.PDResource; @@ -36,6 +37,7 @@ import org.verapdf.pd.colors.PDDeviceRGB; import org.verapdf.pd.images.PDXForm; import org.verapdf.pd.images.PDXObject; +import org.verapdf.pd.optionalcontent.PDOptionalContentProperties; import org.verapdf.tools.StaticResources; import org.verapdf.wcag.algorithms.entities.content.*; import org.verapdf.wcag.algorithms.entities.geometry.BoundingBox; @@ -101,11 +103,7 @@ public void parseChunk(Operator rawOperator, List arguments) { processLineArts(); Long mcid = getMCID(arguments, resourceHandler); if (StaticStorages.getIsFilterInvisibleLayers()) { - if (getLayerVisibility(arguments, resourceHandler)) { - visibleContentStack.push(true); - } else { - visibleContentStack.push(false); - } + visibleContentStack.push(getLayerVisibility(arguments, resourceHandler)); } if (mcid != null) { if (processedMCIDs.contains(mcid)) { @@ -916,9 +914,6 @@ private static Long getMCID(List arguments, ResourceHandler resources) } else if (lastArg.getType() == COSObjType.COS_NAME && resources != null) { PDResource properties = resources.getProperties(lastArg.getName()); if (properties != null) { - COSObject object = properties.getObject(); - PDDocument doc = StaticResources.getDocument(); - doc.getCatalog().getOCProperties().getGroupNames(); COSBase cosProperties = properties.getObject().getDirectBase(); if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { return cosProperties.getIntegerKey(ASAtom.MCID); @@ -930,20 +925,24 @@ private static Long getMCID(List arguments, ResourceHandler resources) } private static boolean getLayerVisibility(List arguments, ResourceHandler resources) { - if (!arguments.isEmpty()) { - COSBase lastArg = arguments.get(arguments.size() - 1); - if (arguments.get(0).getType() == COSObjType.COS_NAME) { - if (arguments.get(0).getName().equals(ASAtom.OC)) { - if (lastArg.getType() == COSObjType.COS_NAME && resources != null) { - PDResource properties = resources.getProperties(lastArg.getName()); - if (properties != null) { - COSBase cosProperties = properties.getObject().getDirectBase(); - if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { - String name = cosProperties.getStringKey(ASAtom.NAME); - PDDocument doc = StaticResources.getDocument(); - String[] names = doc.getCatalog().getOCProperties().getGroupNames(); - if (Arrays.asList(names).contains(name)) { - return doc.getCatalog().getOCProperties().isVisibleLayer(name); + if (arguments != null && !arguments.isEmpty() && resources != null) { + if (arguments.get(0).getType() == COSObjType.COS_NAME && arguments.get(0).getName().equals(ASAtom.OC)) { + COSBase lastArg = arguments.get(arguments.size() - 1); + if (lastArg != null && lastArg.getType() == COSObjType.COS_NAME) { + PDResource properties = resources.getProperties(lastArg.getName()); + if (properties != null) { + COSBase cosProperties = properties.getObject().getDirectBase(); + if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { + String name = cosProperties.getStringKey(ASAtom.NAME); + PDDocument doc = StaticResources.getDocument(); + if (doc != null && name != null) { + PDCatalog catalog = doc.getCatalog(); + PDOptionalContentProperties optProperties = catalog.getOCProperties(); + if (optProperties != null) { + List names = optProperties.getGroupNames(); + if (names.contains(name)) { + return optProperties.isVisibleLayer(name); + } } } } @@ -1037,8 +1036,7 @@ public boolean processLayers() { } if (StaticStorages.getIsFilterInvisibleLayers()) { return visibleContentStack.isEmpty() || visibleContentStack.peek(); - } else { - return true; } + return true; } } diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java b/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java index 6966b70a5..c441771fe 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java @@ -54,7 +54,9 @@ public static Boolean getIsIgnoreMCIDs() { return isIgnoreMCIDs.get(); } - public static Boolean getIsFilterInvisibleLayers() {return isFilterInvisibleLayers.get();} + public static Boolean getIsFilterInvisibleLayers() { + return isFilterInvisibleLayers.get(); + } public static void setIsFilterInvisibleLayers(Boolean isFilterInvisibleLayers) { StaticStorages.isFilterInvisibleLayers.set(isFilterInvisibleLayers);} From c0fac7615568a22ab5e9de7d3343b7e195de8944 Mon Sep 17 00:00:00 2001 From: Kakhnovich Raman Date: Thu, 18 Sep 2025 12:40:51 +0300 Subject: [PATCH 3/6] Some refactoring --- .../gf/model/factory/chunks/ChunkParser.java | 44 ++++++++++--------- .../model/impl/containers/StaticStorages.java | 4 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java index fce44ee52..4275dd27c 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java @@ -912,13 +912,10 @@ private static Long getMCID(List arguments, ResourceHandler resources) if (lastArg.getType() == COSObjType.COS_DICT) { return lastArg.getIntegerKey(ASAtom.MCID); } else if (lastArg.getType() == COSObjType.COS_NAME && resources != null) { - PDResource properties = resources.getProperties(lastArg.getName()); - if (properties != null) { - COSBase cosProperties = properties.getObject().getDirectBase(); - if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { - return cosProperties.getIntegerKey(ASAtom.MCID); - } - } + COSBase cosProperties = getPropertyByName(lastArg.getName(), resources); + if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { + return cosProperties.getIntegerKey(ASAtom.MCID); + } } } return null; @@ -929,20 +926,17 @@ private static boolean getLayerVisibility(List arguments, ResourceHandl if (arguments.get(0).getType() == COSObjType.COS_NAME && arguments.get(0).getName().equals(ASAtom.OC)) { COSBase lastArg = arguments.get(arguments.size() - 1); if (lastArg != null && lastArg.getType() == COSObjType.COS_NAME) { - PDResource properties = resources.getProperties(lastArg.getName()); - if (properties != null) { - COSBase cosProperties = properties.getObject().getDirectBase(); - if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { - String name = cosProperties.getStringKey(ASAtom.NAME); - PDDocument doc = StaticResources.getDocument(); - if (doc != null && name != null) { - PDCatalog catalog = doc.getCatalog(); - PDOptionalContentProperties optProperties = catalog.getOCProperties(); - if (optProperties != null) { - List names = optProperties.getGroupNames(); - if (names.contains(name)) { - return optProperties.isVisibleLayer(name); - } + COSBase cosProperties = getPropertyByName(lastArg.getName(), resources); + if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { + String name = cosProperties.getStringKey(ASAtom.NAME); + PDDocument doc = StaticResources.getDocument(); + if (doc != null && name != null) { + PDCatalog catalog = doc.getCatalog(); + PDOptionalContentProperties optProperties = catalog.getOCProperties(); + if (optProperties != null) { + List names = optProperties.getGroupNames(); + if (names.contains(name)) { + return optProperties.isVisibleLayer(name); } } } @@ -953,6 +947,14 @@ private static boolean getLayerVisibility(List arguments, ResourceHandl return true; } + private static COSBase getPropertyByName(ASAtom name, ResourceHandler resources) { + PDResource properties = resources.getProperties(name); + if (properties != null) { + return properties.getObject().getDirectBase(); + } + return null; + } + private LineChunk transformLineChunk(LineChunk lineChunk, double lineWidth, int lineCap) { return LineChunk.createLineChunk(pageNumber, graphicsState.getCTM().transformX(lineChunk.getStartX(), lineChunk.getStartY()), diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java b/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java index c441771fe..959129092 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/impl/containers/StaticStorages.java @@ -58,7 +58,9 @@ public static Boolean getIsFilterInvisibleLayers() { return isFilterInvisibleLayers.get(); } - public static void setIsFilterInvisibleLayers(Boolean isFilterInvisibleLayers) { StaticStorages.isFilterInvisibleLayers.set(isFilterInvisibleLayers);} + public static void setIsFilterInvisibleLayers(Boolean isFilterInvisibleLayers) { + StaticStorages.isFilterInvisibleLayers.set(isFilterInvisibleLayers); + } public static void setIsIgnoreMCIDs(Boolean isIgnoreMCIDs) { StaticStorages.isIgnoreMCIDs.set(isIgnoreMCIDs); From 6a0a5aac753ff91b406d4a1d9b534b6be805091e Mon Sep 17 00:00:00 2001 From: Kakhnovich Raman Date: Thu, 18 Sep 2025 16:37:00 +0300 Subject: [PATCH 4/6] Update ChunkParser.java --- .../gf/model/factory/chunks/ChunkParser.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java index 4275dd27c..a46d62a41 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java @@ -290,10 +290,10 @@ public void parseChunk(Operator rawOperator, List arguments) { } case Operators.TJ_SHOW_POS: { processLineArts(); - TextChunk textChunk = createTextChunk(arguments, Operators.TJ_SHOW_POS); if (!processLayers()) { break; } + TextChunk textChunk = createTextChunk(arguments, Operators.TJ_SHOW_POS); if (textChunk != null) { putChunk(getMarkedContent(), textChunk); } @@ -317,10 +317,10 @@ public void parseChunk(Operator rawOperator, List arguments) { arguments.get(1).getType().isNumber()) { processDoubleQuote(arguments.get(0).getReal(), arguments.get(1).getReal()); } - TextChunk textChunk = createTextChunk(arguments, Operators.DOUBLE_QUOTE); if (!processLayers()) { break; } + TextChunk textChunk = createTextChunk(arguments, Operators.DOUBLE_QUOTE); if (textChunk != null) { putChunk(getMarkedContent(), textChunk); } @@ -503,12 +503,12 @@ public void parseChunk(Operator rawOperator, List arguments) { break; case Operators.DO: processLineArts(); + if (!processLayers()) { + break; + } PDXObject xObject = resourceHandler.getXObject(getLastCOSName(arguments)); if (xObject != null) { if (ASAtom.IMAGE.equals(xObject.getType())) { - if (!processLayers()) { - break; - } putChunk(getMarkedContent(), new ImageChunk(parseImageBoundingBox())); } else if (ASAtom.FORM.equals(xObject.getType())) { Long markedContent = getMarkedContent(); @@ -583,6 +583,10 @@ private void processh() { } private void processB() { + if (!processLayers()) { + nonDrawingArtifacts = new ArrayList<>(); + return; + } Long mcid = getMarkedContent(); BoundingBox boundingBox = new MultiBoundingBox(); for (Object chunk : nonDrawingArtifacts) { @@ -609,6 +613,10 @@ private void processB() { } private void processS() { + if (!processLayers()) { + nonDrawingArtifacts = new ArrayList<>(); + return; + } Long mcid = getMarkedContent(); BoundingBox boundingBox = new MultiBoundingBox(); for (Object chunk : nonDrawingArtifacts) { @@ -645,6 +653,10 @@ private void processS() { } private void processf() { + if (!processLayers()) { + nonDrawingArtifacts = new ArrayList<>(); + return; + } Long mcid = getMarkedContent(); BoundingBox boundingBox = new MultiBoundingBox(); for (int i = 0; i < nonDrawingArtifacts.size(); i++) { From 47739c57bf1cc71a6dcad65a152f026007630941 Mon Sep 17 00:00:00 2001 From: Kakhnovich Raman Date: Thu, 18 Sep 2025 21:11:54 +0300 Subject: [PATCH 5/6] Some refactoring --- .../verapdf/gf/model/impl/pd/GFPDOCProperties.java | 12 ++++-------- .../verapdf/gf/model/factory/chunks/ChunkParser.java | 12 ++++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/GFPDOCProperties.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/GFPDOCProperties.java index c4191b4b3..b3841b7f2 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/GFPDOCProperties.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/GFPDOCProperties.java @@ -73,11 +73,9 @@ private List getD() { if (contentProperties.getType() == COSObjType.COS_DICT) { COSObject defaultConfig = contentProperties.getKey(ASAtom.D); if (!defaultConfig.empty() && defaultConfig.getType() == COSObjType.COS_DICT) { - String[] groupNames = ((PDOptionalContentProperties) this.simplePDObject).getGroupNames(); - List groupNamesList = Arrays.asList(groupNames == null ? - new String[]{} : groupNames); + List groupNames = ((PDOptionalContentProperties) this.simplePDObject).getGroupNames(); - PDOCConfig pdConfig = new GFPDOCConfig(new PDObject(defaultConfig), groupNamesList, false); + PDOCConfig pdConfig = new GFPDOCConfig(new PDObject(defaultConfig), groupNames, false); result.add(pdConfig); return result; @@ -99,9 +97,7 @@ private List getConfigs() { return Collections.emptyList(); } List names = getDName((COSDictionary) contentProperties.getDirectBase()); - String[] groupNames = ((PDOptionalContentProperties) this.simplePDObject).getGroupNames(); - List groupNamesList = Arrays.asList(groupNames == null ? - new String[]{} : groupNames); + List groupNames = ((PDOptionalContentProperties) this.simplePDObject).getGroupNames(); COSObject configs = contentProperties.getKey(ASAtom.CONFIGS); @@ -109,7 +105,7 @@ private List getConfigs() { List result = new ArrayList<>(); for (COSObject config : (COSArray)configs.getDirectBase()) { if (!config.empty() && config.getType() == COSObjType.COS_DICT) { - PDOCConfig pdConfig = new GFPDOCConfig(new PDObject(config), groupNamesList, names.contains(config.getStringKey(ASAtom.NAME))); + PDOCConfig pdConfig = new GFPDOCConfig(new PDObject(config), groupNames, names.contains(config.getStringKey(ASAtom.NAME))); String name = pdConfig.getName(); if (name != null) { names.add(name); diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java index a46d62a41..f25210b6d 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java @@ -924,9 +924,9 @@ private static Long getMCID(List arguments, ResourceHandler resources) if (lastArg.getType() == COSObjType.COS_DICT) { return lastArg.getIntegerKey(ASAtom.MCID); } else if (lastArg.getType() == COSObjType.COS_NAME && resources != null) { - COSBase cosProperties = getPropertyByName(lastArg.getName(), resources); - if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { - return cosProperties.getIntegerKey(ASAtom.MCID); + COSBase property = getPropertyByName(lastArg.getName(), resources); + if (property != null && property.getType() == COSObjType.COS_DICT) { + return property.getIntegerKey(ASAtom.MCID); } } } @@ -938,9 +938,9 @@ private static boolean getLayerVisibility(List arguments, ResourceHandl if (arguments.get(0).getType() == COSObjType.COS_NAME && arguments.get(0).getName().equals(ASAtom.OC)) { COSBase lastArg = arguments.get(arguments.size() - 1); if (lastArg != null && lastArg.getType() == COSObjType.COS_NAME) { - COSBase cosProperties = getPropertyByName(lastArg.getName(), resources); - if (cosProperties != null && cosProperties.getType() == COSObjType.COS_DICT) { - String name = cosProperties.getStringKey(ASAtom.NAME); + COSBase property = getPropertyByName(lastArg.getName(), resources); + if (property != null && property.getType() == COSObjType.COS_DICT) { + String name = property.getStringKey(ASAtom.NAME); PDDocument doc = StaticResources.getDocument(); if (doc != null && name != null) { PDCatalog catalog = doc.getCatalog(); From ee874569d5e2c3b97bd13661584e9c6d778b5dee Mon Sep 17 00:00:00 2001 From: Kakhnovich Raman Date: Thu, 18 Sep 2025 21:23:01 +0300 Subject: [PATCH 6/6] Update ChunkParser.java --- .../java/org/verapdf/gf/model/factory/chunks/ChunkParser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java index f25210b6d..da584d3aa 100644 --- a/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java +++ b/wcag-validation/src/main/java/org/verapdf/gf/model/factory/chunks/ChunkParser.java @@ -935,7 +935,8 @@ private static Long getMCID(List arguments, ResourceHandler resources) private static boolean getLayerVisibility(List arguments, ResourceHandler resources) { if (arguments != null && !arguments.isEmpty() && resources != null) { - if (arguments.get(0).getType() == COSObjType.COS_NAME && arguments.get(0).getName().equals(ASAtom.OC)) { + COSBase firstArg = arguments.get(0); + if (firstArg.getType() == COSObjType.COS_NAME && firstArg.getName().equals(ASAtom.OC)) { COSBase lastArg = arguments.get(arguments.size() - 1); if (lastArg != null && lastArg.getType() == COSObjType.COS_NAME) { COSBase property = getPropertyByName(lastArg.getName(), resources);