You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by jg...@apache.org on 2025/03/14 15:54:08 UTC
(xmlgraphics-fop-pdf-images) branch temp/jgoncalves-pdfua-paragraph updated (79718cf -> 52229e2)
This is an automated email from the ASF dual-hosted git repository.
jgoncalves pushed a change to branch temp/jgoncalves-pdfua-paragraph
in repository https://gitbox.apache.org/repos/asf/xmlgraphics-fop-pdf-images.git
discard 79718cf FOP-3230: Skip paragraph type elements when merging structure trees
new 52229e2 FOP-3230: Skip paragraph type elements when merging structure trees
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (79718cf)
\
N -- N -- N refs/heads/temp/jgoncalves-pdfua-paragraph (52229e2)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../apache/fop/render/pdf/pdfbox/StructureTreeMerger.java | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org
(xmlgraphics-fop-pdf-images) 01/01: FOP-3230: Skip paragraph type elements when merging structure trees
Posted by jg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jgoncalves pushed a commit to branch temp/jgoncalves-pdfua-paragraph
in repository https://gitbox.apache.org/repos/asf/xmlgraphics-fop-pdf-images.git
commit 52229e20cf887aed5d258c86f6a3c919c3e058b6
Author: Joao Goncalves <jg...@smartcommunications.com>
AuthorDate: Thu Mar 13 17:33:10 2025 -0500
FOP-3230: Skip paragraph type elements when merging structure trees
---
.../fop/render/pdf/pdfbox/StructureTreeMerger.java | 17 ++++---
.../render/pdf/StructureTreeMergerTestCase.java | 52 ++++++++++++++++------
2 files changed, 50 insertions(+), 19 deletions(-)
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java b/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
index e90a7f3..396f309 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
@@ -36,7 +36,6 @@ import org.apache.pdfbox.cos.COSObject;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.documentinterchange.taggedpdf.StandardStructureTypes;
-
import org.apache.fop.pdf.PDFDictionary;
import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFNumber;
@@ -44,7 +43,8 @@ import org.apache.fop.pdf.PDFObject;
import org.apache.fop.pdf.PDFPage;
import org.apache.fop.pdf.PDFReference;
import org.apache.fop.pdf.PDFStructElem;
-
+import org.apache.fop.pdf.StandardStructureTypes.Paragraphlike;
+import org.apache.fop.pdf.StructureType;
import org.apache.fop.render.pdf.PDFLogicalStructureHandler;
@@ -127,12 +127,12 @@ public class StructureTreeMerger {
}
public void setCurrentSessionElem() {
- if (isCurrentSessionElemEmpty(currentSessionElem)) {
+ if (isCurrentSessionElemInvalid(currentSessionElem)) {
List<PDFStructElem> structureTreeElements = pdfDoc.getStructureTreeElements();
for (int i = structureTreeElements.size() - 1; i >= 0; i--) {
PDFStructElem elem = structureTreeElements.get(i);
// We need to make sure it's not an empty element (like an empty block)
- if (!isCurrentSessionElemEmpty(elem)) {
+ if (!isCurrentSessionElemInvalid(elem)) {
currentSessionElem = elem;
break;
}
@@ -140,8 +140,13 @@ public class StructureTreeMerger {
}
}
- private boolean isCurrentSessionElemEmpty(PDFStructElem elem) {
- return elem == null || elem.get("P") == null;
+ private boolean isCurrentSessionElemInvalid(PDFStructElem elem) {
+ return elem == null || elem.get("P") == null || isStructureTypeParagraph(elem.getStructureType());
+ }
+
+ private boolean isStructureTypeParagraph(StructureType type) {
+ return Arrays.asList(Paragraphlike.H, Paragraphlike.H1, Paragraphlike.H2, Paragraphlike.H3, Paragraphlike.H4,
+ Paragraphlike.H5, Paragraphlike.H6, Paragraphlike.P).contains(type);
}
private void createParents(COSArray markedContentParents) throws IOException {
diff --git a/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java b/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java
index 9d69140..5921e37 100644
--- a/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java
@@ -20,7 +20,9 @@ package org.apache.fop.render.pdf;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -250,12 +252,12 @@ public class StructureTreeMergerTestCase {
public void testNonEmptyElement() {
PDFStructElem sectElem = createPDFStructElem(StandardStructureTypes.Grouping.SECT, CONTENT);
PDFStructElem partElem = createPDFStructElem(StandardStructureTypes.Paragraphlike.P, CONTENT);
- defaultTestSetCurrentSessionElem(Arrays.asList(sectElem, partElem), null, partElem,
- "If element is not empty, it must be chosen");
+ defaultTestSetCurrentSessionElem(Arrays.asList(partElem, sectElem), null, sectElem,
+ "If element is not empty and not of type Paragraph, it must be chosen");
}
@Test
- public void testEmptyElement() {
+ public void testEmptyParagraphElement() {
PDFStructElem sectElem = createPDFStructElem(StandardStructureTypes.Grouping.SECT, CONTENT);
PDFStructElem partElem = createPDFStructElem(StandardStructureTypes.Paragraphlike.P, null);
defaultTestSetCurrentSessionElem(Arrays.asList(sectElem, partElem), null, sectElem,
@@ -272,26 +274,46 @@ public class StructureTreeMergerTestCase {
@Test
public void testEmptySectElement() {
- PDFStructElem partElem = createPDFStructElem(StandardStructureTypes.Paragraphlike.P, CONTENT);
+ PDFStructElem divElem = createPDFStructElem(StandardStructureTypes.Grouping.DIV, CONTENT);
PDFStructElem sectElem = createPDFStructElem(StandardStructureTypes.Grouping.SECT, null);
- defaultTestSetCurrentSessionElem(Arrays.asList(partElem, sectElem), null, partElem,
+ defaultTestSetCurrentSessionElem(Arrays.asList(divElem, sectElem), null, divElem,
"Elements can't be empty");
}
@Test
public void testSetterReplacesPreviousValueIfEmpty() {
- PDFStructElem partElem = createPDFStructElem(StandardStructureTypes.Paragraphlike.P, CONTENT);
+ PDFStructElem divElem = createPDFStructElem(StandardStructureTypes.Grouping.DIV, CONTENT);
PDFStructElem sectElem = createPDFStructElem(StandardStructureTypes.Grouping.SECT, null);
- defaultTestSetCurrentSessionElem(Arrays.asList(partElem, sectElem), Arrays.asList(sectElem, partElem),
- partElem, "If the current session elem is empty, it must be replaced");
+ defaultTestSetCurrentSessionElem(Arrays.asList(sectElem, divElem), null,
+ divElem, "Must replace current session elem if empty");
}
@Test
public void testSetterDoesntReplacePreviousValueIfNotEmpty() {
- PDFStructElem partElem = createPDFStructElem(StandardStructureTypes.Paragraphlike.P, CONTENT);
+ PDFStructElem divElem = createPDFStructElem(StandardStructureTypes.Grouping.DIV, CONTENT);
+ PDFStructElem emptySectElem = createPDFStructElem(StandardStructureTypes.Grouping.SECT, null);
PDFStructElem sectElem = createPDFStructElem(StandardStructureTypes.Grouping.SECT, CONTENT);
- defaultTestSetCurrentSessionElem(Arrays.asList(partElem, sectElem), Arrays.asList(sectElem, partElem),
- sectElem, "Elements can't be empty");
+ defaultTestSetCurrentSessionElem(Arrays.asList(divElem, emptySectElem), Collections.singletonList(sectElem),
+ divElem, "Should not replace if current element is valid");
+ }
+
+ @Test
+ public void testIgnoredParagraphTypeElements() {
+ PDFStructElem divElem = createPDFStructElem(StandardStructureTypes.Grouping.DIV, CONTENT);
+
+ List<PDFStructElem> elems = new ArrayList<>();
+ elems.add(createPDFStructElem(StandardStructureTypes.Paragraphlike.H, CONTENT));
+ elems.add(createPDFStructElem(StandardStructureTypes.Paragraphlike.H1, CONTENT));
+ elems.add(createPDFStructElem(StandardStructureTypes.Paragraphlike.H2, CONTENT));
+ elems.add(createPDFStructElem(StandardStructureTypes.Paragraphlike.H3, CONTENT));
+ elems.add(createPDFStructElem(StandardStructureTypes.Paragraphlike.H4, CONTENT));
+ elems.add(createPDFStructElem(StandardStructureTypes.Paragraphlike.H5, CONTENT));
+ elems.add(createPDFStructElem(StandardStructureTypes.Paragraphlike.H6, CONTENT));
+ elems.add(divElem);
+ elems.add(createPDFStructElem(StandardStructureTypes.Paragraphlike.P, CONTENT));
+
+ defaultTestSetCurrentSessionElem(elems, null, divElem,
+ "Paragraph type elements must be ignored and replaced");
}
private void defaultTestSetCurrentSessionElem(List<PDFStructElem> elems, List<PDFStructElem> secondElems,
@@ -303,12 +325,16 @@ public class StructureTreeMergerTestCase {
page.setDocument(mockPdfDoc);
PDFBoxAdapter mockAdapter = mock(PDFBoxAdapter.class);
when(mockAdapter.getTargetPage()).thenReturn(page);
- StructureTreeMerger structureTreeMerger = new StructureTreeMerger(null, null,
+
+ StructureTreeMerger structureTreeMerger = new StructureTreeMerger(elems.get(0), null,
mockAdapter, null);
+ assertEquals("Constructor sets the current session element without restrictions",
+ elems.get(0), structureTreeMerger.getCurrentSessionElem());
+
structureTreeMerger.setCurrentSessionElem();
assertEquals(assertionMessage, expected, structureTreeMerger.getCurrentSessionElem());
if (secondElems != null) {
- when(mockPdfDoc.getStructureTreeElements()).thenReturn(elems);
+ when(mockPdfDoc.getStructureTreeElements()).thenReturn(secondElems);
structureTreeMerger.setCurrentSessionElem();
assertEquals(assertionMessage, expected, structureTreeMerger.getCurrentSessionElem());
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org