From cceccc4baed1a7ef872b4e90b4cc81bc2430a422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Thu, 17 Jul 2025 13:11:46 +0200 Subject: [PATCH] Support all possible alignment values for docx tables. (#848) Besides the start/center/end values specified in the OOXML standard, Word also uses "left" and "right" as values. We need to support this to prevent POI code from crashing with such documents. Fixes: https://bz.apache.org/bugzilla/show_bug.cgi?id=69744 --- .../poi/xwpf/usermodel/TableRowAlign.java | 8 ++++-- .../org/apache/poi/xwpf/TestXWPFBugs.java | 26 ++++++++++++++++++ .../poi/xwpf/usermodel/TestXWPFTable.java | 8 +++++- test-data/document/table-alignment.docx | Bin 0 -> 15519 bytes 4 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 test-data/document/table-alignment.docx diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/TableRowAlign.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/TableRowAlign.java index 06653cdb33..fa03dd4998 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/TableRowAlign.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/TableRowAlign.java @@ -26,10 +26,12 @@ import java.util.Map; * Sets alignment values allowed for Tables and Table Rows */ public enum TableRowAlign { - - LEFT(STJcTable.INT_START), + + LEFT(STJcTable.INT_LEFT), + START(STJcTable.INT_START), CENTER(STJcTable.INT_CENTER), - RIGHT(STJcTable.INT_END); + RIGHT(STJcTable.INT_RIGHT), + END(STJcTable.INT_END); private static final Map imap; diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/TestXWPFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/TestXWPFBugs.java index 4eefc3517a..c39c7fe7cd 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/TestXWPFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/TestXWPFBugs.java @@ -44,6 +44,7 @@ import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlException; import org.junit.jupiter.api.Test; import org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJcTable; class TestXWPFBugs { private static final POIDataSamples samples = POIDataSamples.getDocumentInstance(); @@ -248,4 +249,29 @@ class TestXWPFBugs { assertEquals(ParagraphAlignment.LEFT, leftParagraph.getAlignment()); // LEFT is the real alignment value. } } + + @Test + public void testTableRightAlign() throws Exception { + // Document contains all possible values for table alignment, including null. + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("table-alignment.docx")) { + XWPFTable tbl0 = doc.getTableArray(0); + assertNull(tbl0.getTableAlignment()); + assertFalse(tbl0.getCTTbl().getTblPr().isSetJc()); + XWPFTable tbl1 = doc.getTableArray(1); + assertEquals(TableRowAlign.LEFT, tbl1.getTableAlignment()); + assertEquals(STJcTable.LEFT, tbl1.getCTTbl().getTblPr().getJc().xgetVal().getEnumValue()); + XWPFTable tbl2 = doc.getTableArray(2); + assertEquals(TableRowAlign.START, tbl2.getTableAlignment()); + assertEquals(STJcTable.START, tbl2.getCTTbl().getTblPr().getJc().xgetVal().getEnumValue()); + XWPFTable tbl3 = doc.getTableArray(3); + assertEquals(TableRowAlign.CENTER, tbl3.getTableAlignment()); + assertEquals(STJcTable.CENTER, tbl3.getCTTbl().getTblPr().getJc().xgetVal().getEnumValue()); + XWPFTable tbl4 = doc.getTableArray(4); + assertEquals(TableRowAlign.RIGHT, tbl4.getTableAlignment()); + assertEquals(STJcTable.RIGHT, tbl4.getCTTbl().getTblPr().getJc().xgetVal().getEnumValue()); + XWPFTable tbl5 = doc.getTableArray(5); + assertEquals(TableRowAlign.END, tbl5.getTableAlignment()); + assertEquals(STJcTable.END, tbl5.getCTTbl().getTblPr().getJc().xgetVal().getEnumValue()); + } + } } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFTable.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFTable.java index 3539dac261..3bd3205036 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFTable.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFTable.java @@ -571,14 +571,20 @@ class TestXWPFTable { void testSetGetTableAlignment() throws IOException { try (XWPFDocument doc = new XWPFDocument()) { XWPFTable tbl = doc.createTable(1, 1); + tbl.setTableAlignment(TableRowAlign.START); + assertEquals(TableRowAlign.START, tbl.getTableAlignment()); + assertEquals(STJcTable.INT_START, tbl.getTableAlignment().getValue()); tbl.setTableAlignment(TableRowAlign.LEFT); assertEquals(TableRowAlign.LEFT, tbl.getTableAlignment()); - assertEquals(STJcTable.INT_START, tbl.getTableAlignment().getValue()); + assertEquals(STJcTable.INT_LEFT, tbl.getTableAlignment().getValue()); tbl.setTableAlignment(TableRowAlign.CENTER); assertEquals(TableRowAlign.CENTER, tbl.getTableAlignment()); assertEquals(STJcTable.INT_CENTER, tbl.getTableAlignment().getValue()); tbl.setTableAlignment(TableRowAlign.RIGHT); assertEquals(TableRowAlign.RIGHT, tbl.getTableAlignment()); + assertEquals(STJcTable.INT_RIGHT, tbl.getTableAlignment().getValue()); + tbl.setTableAlignment(TableRowAlign.END); + assertEquals(TableRowAlign.END, tbl.getTableAlignment()); assertEquals(STJcTable.INT_END, tbl.getTableAlignment().getValue()); tbl.removeTableAlignment(); assertNull(tbl.getTableAlignment()); diff --git a/test-data/document/table-alignment.docx b/test-data/document/table-alignment.docx new file mode 100644 index 0000000000000000000000000000000000000000..76fd85c338a1515c2ba2736953ba8424a9bc9367 GIT binary patch literal 15519 zcmbumbzB`w(m#A~32wpNU4y&36N0K^AuI{d`l9L1hMF9W+kZ*+mz!+=&Q40tFC;$ThkO9~LbwO(@2SY0dZ6#M5 zLwikH7fTCeB`5&MMe;ZjQ;Ca-qsu!05a=NY0PsgupD=3HOOGIY7x>~o^g}k6| zI5*l5%j5wlj9EtLRv@+QrDKPUr68YSx0+#y>294#V9chinpB-%YPmHIHjHPqOZ-b+ zTJov=Ln?0-b&ib$`gyj2x|ju5OFM>4BaniKS+Ya}A53&QSu=o2VGD$bnP>6g zJ18&;XKvFR!DD%l9SG#(kyjx1HBL?GS?HS3kRPPfj+gb(VN`U6(lR?<@{<&%{Q{aZ;+;IRqG5T+HJ1V~n}`J>3p9c!09Vt(d;(+p0;dHTmD z%znCSnV2xUB0ZzcEA$FSGSF#EpM6fYG<{=x>NpOvsbC>1=Oi@#M+Z>ln|)|a!hwy~%CLqQ#d zE+%LHuArX~|J1h42qga4o3>Zp^oQ^(gszRvU#U7nvD<2e9;O|Bkr%y%H7uM!6-2l{ zM(OGdiE-aEMM!m36Uj5RSFi z#97Ng>LsGeOM!jMEW%sbDA^f;%s@EDQk#K_2V=~l4kX~jD(+&s5TfPiQZfRL)g#6+ z@iQx4Or@dOnUz*=gTl|6;%1Qgr7fno$RtI-D$K||S9x790KO;cB;%iHe~pY?#2|7Dm`^1c zRX^AiJX1r_pv@5v!bX>n2QhGP_JDPz+1ozlJ(i?c+YZ4{eK)>z6y>e7kQ2G-+F>We zwYhQ6qq0@#j`@X&i;PUtyRL3SguX4lf6n1KK46(KoaNkJV_2+M-3q^1CUfEeXTB)) zF7%9_8|Jl?_I)k8_wzdr+b6hzEU{Ox-+RS50XCxfTd%kT1^^I$?G^ggc7}i1E#l;5 zd+1RDH>987C9`n8@y$}Nh|ON;5ECHgT~^e+FSf9pK?8qrYmJ1J&-7?*JZLp`E|L~$ zC4_I#DVJjumXFQ`5G!g78HQ;Y?_9uv&C3s)Rubo%z@tUhjD`msrBHw<<}ss_b%C#o zFQ*)#RHV-^3?x-#XEz)`9rXt?f;o1uNS0Hm&yZ~L5U@4@MA;otJ_hBSVNZ3()s8Dz zOKD-*1Q7%S=hw0w3;!76pbzBcl%wJu5@>1euk;d1TsqzFWud>pnM_pIkha+ERph>Gql|V~|bND8T836zeV?MD}2|CA4!n5a8AM`kd3r$D*%8RoWPPYo2Q!FF5(tt_uWD zZnbZT(%L_Ga0%Vea~dyb_d|r05n^cY0s{fwoEO=(XzzAaS0|3TKWXlaXsRd3|F<~+ zf76<_ouS45#TMYkVm2PVnG=~et-t#RJ?&4F|7P(k;=11~J`CTv|Fi#8yZmxDdY%lO z{^Sb!5(K2WxD@irqS?aBGuPrGu;!7j=;-uJ{G^+Gx`^Xug60Kgk}_;qJJkHWRW!`2RCT;(_(entAIK_y6_$Sn`2~63NPhIh^8Zb9p

Lr80HnW@8@)}nO1gR$ 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 literal 0 HcmV?d00001