diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java index d572da627e..89a681ecf8 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java @@ -1457,6 +1457,9 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para */ private CTSpacing getCTSpacing(boolean create) { CTPPr pr = getCTPPr(create); + if (pr == null) { + return null; + } CTSpacing ct = pr.getSpacing(); if (create && ct == null) { ct = pr.addNewSpacing(); diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java index 2aaf6b1072..5ef646a77c 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java @@ -921,6 +921,50 @@ public final class TestXWPFParagraph { } } + @Test + void testGettersWithEmptyParagraphProperties() throws IOException { + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("emptyPPr.docx")) { + XWPFParagraph p = doc.getParagraphArray(0); + + assertNull(p.getNumID()); + assertNull(p.getNumIlvl()); + assertNull(p.getNumFmt()); + assertNull(p.getNumLevelText()); + assertNull(p.getNumStartOverride()); + assertFalse(p.isKeepNext()); + + assertFalse(p.isAlignmentSet()); + assertEquals(ParagraphAlignment.LEFT, p.getAlignment()); + assertEquals(TextAlignment.AUTO, p.getVerticalAlignment()); + + assertEquals(Borders.NONE, p.getBorderTop()); + assertEquals(Borders.NONE, p.getBorderBottom()); + assertEquals(Borders.NONE, p.getBorderLeft()); + assertEquals(Borders.NONE, p.getBorderRight()); + assertEquals(Borders.NONE, p.getBorderBetween()); + + assertEquals(-1, p.getSpacingAfter()); + assertEquals(-1, p.getSpacingAfterLines()); + assertEquals(-1, p.getSpacingBefore()); + assertEquals(-1, p.getSpacingBeforeLines()); + assertEquals(-1, p.getSpacingBetween()); + assertEquals(LineSpacingRule.AUTO, p.getSpacingLineRule()); + + assertEquals(-1, p.getIndentationLeft()); + assertEquals(-1, p.getIndentationLeftChars()); + assertEquals(-1, p.getIndentationRight()); + assertEquals(-1, p.getIndentationRightChars()); + assertEquals(-1, p.getIndentationHanging()); + assertEquals(-1, p.getIndentationFirstLine()); + + assertFalse(p.isPageBreak()); + assertFalse(p.isWordWrapped()); + + assertNull(p.getStyleID()); + assertNull(p.getStyle()); + } + } + private static void checkSearchText(XWPFParagraph paragraph, String search, int beginRun, int endRun, int beginText, int endText, int beginChar, int endChar) { TextSegment result = paragraph.searchText(search, new PositionInParagraph()); diff --git a/test-data/document/emptyPPr.docx b/test-data/document/emptyPPr.docx new file mode 100644 index 0000000000..7ef696b1e1 Binary files /dev/null and b/test-data/document/emptyPPr.docx differ