You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TestXWPFParagraph.java 34KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. /* ====================================================================
  2. Licensed to the Apache Software Foundation (ASF) under one or more
  3. contributor license agreements. See the NOTICE file distributed with
  4. this work for additional information regarding copyright ownership.
  5. The ASF licenses this file to You under the Apache License, Version 2.0
  6. (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. ==================================================================== */
  15. package org.apache.poi.xwpf.usermodel;
  16. import static org.junit.jupiter.api.Assertions.assertEquals;
  17. import static org.junit.jupiter.api.Assertions.assertFalse;
  18. import static org.junit.jupiter.api.Assertions.assertNotNull;
  19. import static org.junit.jupiter.api.Assertions.assertNull;
  20. import static org.junit.jupiter.api.Assertions.assertTrue;
  21. import java.io.IOException;
  22. import java.math.BigInteger;
  23. import java.util.List;
  24. import org.apache.poi.util.StringUtil;
  25. import org.apache.poi.xwpf.XWPFTestDataSamples;
  26. import org.junit.jupiter.api.Test;
  27. import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture;
  28. import org.openxmlformats.schemas.drawingml.x2006.picture.PicDocument;
  29. import org.openxmlformats.schemas.drawingml.x2006.picture.impl.PicDocumentImpl;
  30. import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STOnOff1;
  31. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
  32. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
  33. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
  34. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
  35. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
  36. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
  37. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPBdr;
  38. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
  39. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
  40. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
  41. import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTextAlignment;
  42. import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
  43. import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
  44. import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule;
  45. import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment;
  46. /**
  47. * Tests for XWPF Paragraphs
  48. */
  49. public final class TestXWPFParagraph {
  50. /**
  51. * Check that we get the right paragraph from the header
  52. */
  53. @Test
  54. void testHeaderParagraph() throws IOException {
  55. try (XWPFDocument xml = XWPFTestDataSamples.openSampleDocument("ThreeColHead.docx")) {
  56. XWPFHeader hdr = xml.getHeaderFooterPolicy().getDefaultHeader();
  57. assertNotNull(hdr);
  58. List<XWPFParagraph> ps = hdr.getParagraphs();
  59. assertEquals(1, ps.size());
  60. XWPFParagraph p = ps.get(0);
  61. assertEquals(5, p.getCTP().sizeOfRArray());
  62. assertEquals("First header column!\tMid header\tRight header!", p.getText());
  63. }
  64. }
  65. /**
  66. * Check that we get the right paragraphs from the document
  67. */
  68. @Test
  69. void testDocumentParagraph() throws IOException {
  70. try (XWPFDocument xml = XWPFTestDataSamples.openSampleDocument("ThreeColHead.docx")) {
  71. List<XWPFParagraph> ps = xml.getParagraphs();
  72. assertEquals(10, ps.size());
  73. assertFalse(ps.get(0).isEmpty());
  74. assertEquals(
  75. "This is a sample word document. It has two pages. It has a three column heading, but no footer.",
  76. ps.get(0).getText());
  77. assertTrue(ps.get(1).isEmpty());
  78. assertEquals("", ps.get(1).getText());
  79. assertFalse(ps.get(2).isEmpty());
  80. assertEquals("HEADING TEXT", ps.get(2).getText());
  81. assertTrue(ps.get(3).isEmpty());
  82. assertEquals("", ps.get(3).getText());
  83. assertFalse(ps.get(4).isEmpty());
  84. assertEquals("More on page one", ps.get(4).getText());
  85. }
  86. }
  87. @Test
  88. void testSetGetBorderTop() throws IOException {
  89. //new clean instance of paragraph
  90. try (XWPFDocument doc = new XWPFDocument()) {
  91. XWPFParagraph p = doc.createParagraph();
  92. assertEquals(STBorder.NONE.intValue(), p.getBorderTop().getValue());
  93. CTP ctp = p.getCTP();
  94. CTPPr ppr = ctp.getPPr() == null ? ctp.addNewPPr() : ctp.getPPr();
  95. CTPBdr bdr = ppr.addNewPBdr();
  96. CTBorder borderTop = bdr.addNewTop();
  97. borderTop.setVal(STBorder.DOUBLE);
  98. bdr.setTop(borderTop);
  99. assertEquals(Borders.DOUBLE, p.getBorderTop());
  100. p.setBorderTop(Borders.SINGLE);
  101. assertEquals(STBorder.SINGLE, borderTop.getVal());
  102. }
  103. }
  104. @Test
  105. void testSetGetAlignment() throws IOException {
  106. //new clean instance of paragraph
  107. try (XWPFDocument doc = new XWPFDocument()) {
  108. XWPFParagraph p = doc.createParagraph();
  109. assertEquals(STJc.LEFT.intValue(), p.getAlignment().getValue());
  110. CTP ctp = p.getCTP();
  111. CTPPr ppr = ctp.getPPr() == null ? ctp.addNewPPr() : ctp.getPPr();
  112. CTJc align = ppr.addNewJc();
  113. align.setVal(STJc.CENTER);
  114. assertEquals(ParagraphAlignment.CENTER, p.getAlignment());
  115. p.setAlignment(ParagraphAlignment.BOTH);
  116. assertEquals(STJc.BOTH, ppr.getJc().getVal());
  117. }
  118. }
  119. @Test
  120. void testSetGetSpacing() throws IOException {
  121. try (XWPFDocument doc = new XWPFDocument()) {
  122. XWPFParagraph p = doc.createParagraph();
  123. CTP ctp = p.getCTP();
  124. CTPPr ppr = ctp.getPPr() == null ? ctp.addNewPPr() : ctp.getPPr();
  125. assertEquals(-1, p.getSpacingBefore());
  126. assertEquals(-1, p.getSpacingAfter());
  127. assertEquals(-1, p.getSpacingBetween(), 0.1);
  128. assertEquals(LineSpacingRule.AUTO, p.getSpacingLineRule());
  129. CTSpacing spacing = ppr.addNewSpacing();
  130. spacing.setAfter(new BigInteger("10"));
  131. assertEquals(10, p.getSpacingAfter());
  132. spacing.setBefore(new BigInteger("10"));
  133. assertEquals(10, p.getSpacingBefore());
  134. p.setSpacingAfter(100);
  135. assertEquals("100", spacing.xgetAfter().getStringValue());
  136. p.setSpacingBefore(100);
  137. assertEquals("100", spacing.xgetBefore().getStringValue());
  138. p.setSpacingBetween(.25, LineSpacingRule.EXACT);
  139. assertEquals(.25, p.getSpacingBetween(), 0.01);
  140. assertEquals(LineSpacingRule.EXACT, p.getSpacingLineRule());
  141. p.setSpacingBetween(1.25, LineSpacingRule.AUTO);
  142. assertEquals(1.25, p.getSpacingBetween(), 0.01);
  143. assertEquals(LineSpacingRule.AUTO, p.getSpacingLineRule());
  144. p.setSpacingBetween(.5, LineSpacingRule.AT_LEAST);
  145. assertEquals(.5, p.getSpacingBetween(), 0.01);
  146. assertEquals(LineSpacingRule.AT_LEAST, p.getSpacingLineRule());
  147. p.setSpacingBetween(1.15);
  148. assertEquals(1.15, p.getSpacingBetween(), 0.01);
  149. assertEquals(LineSpacingRule.AUTO, p.getSpacingLineRule());
  150. }
  151. }
  152. @Test
  153. void testSetGetSpacingLineRule() throws IOException {
  154. try (XWPFDocument doc = new XWPFDocument()) {
  155. XWPFParagraph p = doc.createParagraph();
  156. CTP ctp = p.getCTP();
  157. CTPPr ppr = ctp.getPPr() == null ? ctp.addNewPPr() : ctp.getPPr();
  158. assertEquals(STLineSpacingRule.INT_AUTO, p.getSpacingLineRule().getValue());
  159. CTSpacing spacing = ppr.addNewSpacing();
  160. spacing.setLineRule(STLineSpacingRule.AT_LEAST);
  161. assertEquals(LineSpacingRule.AT_LEAST, p.getSpacingLineRule());
  162. p.setSpacingAfter(100);
  163. assertEquals("100", spacing.xgetAfter().getStringValue());
  164. }
  165. }
  166. @Test
  167. void testSetGetIndentationChars() throws IOException {
  168. try (XWPFDocument doc = new XWPFDocument()) {
  169. XWPFParagraph p = doc.createParagraph();
  170. assertEquals(-1, p.getIndentationLeftChars());
  171. assertEquals(-1, p.getIndentationRightChars());
  172. // set 1.5 characters
  173. p.setIndentationLeftChars(150);
  174. assertEquals(150, p.getIndentationLeftChars());
  175. p.setIndentationRightChars(250);
  176. assertEquals(250, p.getIndentationRightChars());
  177. }
  178. }
  179. @Test
  180. void testSetGetIndentation() throws IOException {
  181. try (XWPFDocument doc = new XWPFDocument()) {
  182. XWPFParagraph p = doc.createParagraph();
  183. assertEquals(-1, p.getIndentationLeft());
  184. CTP ctp = p.getCTP();
  185. CTPPr ppr = ctp.getPPr() == null ? ctp.addNewPPr() : ctp.getPPr();
  186. assertEquals(-1, p.getIndentationLeft());
  187. CTInd ind = ppr.addNewInd();
  188. ind.setLeft(new BigInteger("10"));
  189. assertEquals(10, p.getIndentationLeft());
  190. p.setIndentationLeft(100);
  191. assertEquals("100", ind.xgetLeft().getStringValue());
  192. }
  193. }
  194. @Test
  195. void testSetGetVerticalAlignment() throws IOException {
  196. //new clean instance of paragraph
  197. try (XWPFDocument doc = new XWPFDocument()) {
  198. XWPFParagraph p = doc.createParagraph();
  199. CTP ctp = p.getCTP();
  200. CTPPr ppr = ctp.getPPr() == null ? ctp.addNewPPr() : ctp.getPPr();
  201. CTTextAlignment txtAlign = ppr.addNewTextAlignment();
  202. txtAlign.setVal(STTextAlignment.CENTER);
  203. assertEquals(TextAlignment.CENTER, p.getVerticalAlignment());
  204. p.setVerticalAlignment(TextAlignment.BOTTOM);
  205. assertEquals(STTextAlignment.BOTTOM, ppr.getTextAlignment().getVal());
  206. }
  207. }
  208. @Test
  209. void testSetGetWordWrap() throws IOException {
  210. try (XWPFDocument doc = new XWPFDocument()) {
  211. XWPFParagraph p = doc.createParagraph();
  212. CTP ctp = p.getCTP();
  213. CTPPr ppr = ctp.getPPr() == null ? ctp.addNewPPr() : ctp.getPPr();
  214. CTOnOff wordWrap = ppr.addNewWordWrap();
  215. wordWrap.setVal(STOnOff1.OFF);
  216. assertFalse(p.isWordWrap());
  217. p.setWordWrapped(true);
  218. assertEquals("on", ppr.getWordWrap().getVal());
  219. }
  220. }
  221. @Test
  222. void testSetGetPageBreak() throws IOException {
  223. try (XWPFDocument doc = new XWPFDocument()) {
  224. XWPFParagraph p = doc.createParagraph();
  225. CTP ctp = p.getCTP();
  226. CTPPr ppr = ctp.getPPr() == null ? ctp.addNewPPr() : ctp.getPPr();
  227. CTOnOff pageBreak = ppr.addNewPageBreakBefore();
  228. pageBreak.setVal(STOnOff1.OFF);
  229. assertFalse(p.isPageBreak());
  230. p.setPageBreak(true);
  231. assertEquals("on", ppr.getPageBreakBefore().getVal());
  232. }
  233. }
  234. @Test
  235. void testBookmarks() throws IOException {
  236. try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("bookmarks.docx")) {
  237. XWPFParagraph paragraph = doc.getParagraphs().get(0);
  238. assertEquals("Sample Word Document", paragraph.getText());
  239. assertEquals(1, paragraph.getCTP().sizeOfBookmarkStartArray());
  240. assertEquals(0, paragraph.getCTP().sizeOfBookmarkEndArray());
  241. CTBookmark ctBookmark = paragraph.getCTP().getBookmarkStartArray(0);
  242. assertEquals("poi", ctBookmark.getName());
  243. for (CTBookmark bookmark : paragraph.getCTP().getBookmarkStartList()) {
  244. assertEquals("poi", bookmark.getName());
  245. }
  246. }
  247. }
  248. @Test
  249. void testGetSetNumID() throws IOException {
  250. try (XWPFDocument doc = new XWPFDocument()) {
  251. XWPFParagraph p = doc.createParagraph();
  252. p.setNumID(new BigInteger("10"));
  253. assertEquals("10", p.getNumID().toString());
  254. }
  255. }
  256. @Test
  257. void testGetSetILvl() throws IOException {
  258. try (XWPFDocument doc = new XWPFDocument()) {
  259. XWPFParagraph p = doc.createParagraph();
  260. p.setNumILvl(new BigInteger("1"));
  261. assertEquals("1", p.getNumIlvl().toString());
  262. }
  263. }
  264. @Test
  265. void testAddingRuns() throws IOException {
  266. try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("sample.docx")) {
  267. XWPFParagraph p = doc.getParagraphs().get(0);
  268. assertEquals(2, p.getRuns().size());
  269. assertEquals(2, p.getIRuns().size());
  270. XWPFRun r = p.createRun();
  271. assertEquals(3, p.getRuns().size());
  272. assertEquals(2, p.getRuns().indexOf(r));
  273. assertEquals(3, p.getIRuns().size());
  274. assertEquals(2, p.getIRuns().indexOf(r));
  275. XWPFRun r2 = p.insertNewRun(1);
  276. assertEquals(4, p.getRuns().size());
  277. assertEquals(1, p.getRuns().indexOf(r2));
  278. assertEquals(3, p.getRuns().indexOf(r));
  279. assertEquals(4, p.getIRuns().size());
  280. assertEquals(1, p.getIRuns().indexOf(r2));
  281. assertEquals(3, p.getIRuns().indexOf(r));
  282. }
  283. }
  284. @Test
  285. void testCreateNewRuns() throws IOException {
  286. try (XWPFDocument doc = new XWPFDocument()) {
  287. XWPFParagraph p = doc.createParagraph();
  288. XWPFHyperlinkRun h = p.createHyperlinkRun("http://poi.apache.org");
  289. XWPFFieldRun fieldRun = p.createFieldRun();
  290. XWPFRun r = p.createRun();
  291. assertEquals(3, p.getRuns().size());
  292. assertEquals(0, p.getRuns().indexOf(h));
  293. assertEquals(1, p.getRuns().indexOf(fieldRun));
  294. assertEquals(2, p.getRuns().indexOf(r));
  295. assertEquals(3, p.getIRuns().size());
  296. assertEquals(0, p.getIRuns().indexOf(h));
  297. assertEquals(1, p.getIRuns().indexOf(fieldRun));
  298. assertEquals(2, p.getIRuns().indexOf(r));
  299. }
  300. }
  301. @Test
  302. void testInsertNewRuns() throws IOException {
  303. try (XWPFDocument doc = new XWPFDocument()) {
  304. XWPFParagraph p = doc.createParagraph();
  305. XWPFRun r = p.createRun();
  306. assertEquals(1, p.getRuns().size());
  307. assertEquals(0, p.getRuns().indexOf(r));
  308. XWPFHyperlinkRun h = p.insertNewHyperlinkRun(0, "http://poi.apache.org");
  309. assertEquals(2, p.getRuns().size());
  310. assertEquals(0, p.getRuns().indexOf(h));
  311. assertEquals(1, p.getRuns().indexOf(r));
  312. XWPFFieldRun fieldRun2 = p.insertNewFieldRun(2);
  313. assertEquals(3, p.getRuns().size());
  314. assertEquals(2, p.getRuns().indexOf(fieldRun2));
  315. }
  316. }
  317. @Test
  318. void testRemoveRuns() throws IOException {
  319. try (XWPFDocument doc = new XWPFDocument()) {
  320. XWPFParagraph p = doc.createParagraph();
  321. XWPFRun r = p.createRun();
  322. p.createRun();
  323. XWPFHyperlinkRun hyperlinkRun = p
  324. .createHyperlinkRun("http://poi.apache.org");
  325. XWPFFieldRun fieldRun = p.createFieldRun();
  326. assertEquals(4, p.getRuns().size());
  327. assertEquals(2, p.getRuns().indexOf(hyperlinkRun));
  328. assertEquals(3, p.getRuns().indexOf(fieldRun));
  329. p.removeRun(2);
  330. assertEquals(3, p.getRuns().size());
  331. assertEquals(-1, p.getRuns().indexOf(hyperlinkRun));
  332. assertEquals(2, p.getRuns().indexOf(fieldRun));
  333. p.removeRun(0);
  334. assertEquals(2, p.getRuns().size());
  335. assertEquals(-1, p.getRuns().indexOf(r));
  336. assertEquals(1, p.getRuns().indexOf(fieldRun));
  337. p.removeRun(1);
  338. assertEquals(1, p.getRuns().size());
  339. assertEquals(-1, p.getRuns().indexOf(fieldRun));
  340. }
  341. }
  342. @Test
  343. void testRemoveAndInsertRunsWithOtherIRunElement()
  344. throws IOException {
  345. XWPFDocument doc = new XWPFDocument();
  346. XWPFParagraph p = doc.createParagraph();
  347. p.createRun();
  348. // add other run element
  349. p.getCTP().addNewSdt();
  350. // add two CTR in hyperlink
  351. XWPFHyperlinkRun hyperlinkRun = p
  352. .createHyperlinkRun("http://poi.apache.org");
  353. hyperlinkRun.getCTHyperlink().addNewR();
  354. p.createFieldRun();
  355. XWPFDocument doc2 = XWPFTestDataSamples.writeOutAndReadBack(doc);
  356. XWPFParagraph paragraph = doc2.getParagraphArray(0);
  357. assertEquals(4, paragraph.getRuns().size());
  358. assertEquals(5, paragraph.getIRuns().size());
  359. assertTrue(paragraph.getRuns().get(1) instanceof XWPFHyperlinkRun);
  360. assertTrue(paragraph.getRuns().get(2) instanceof XWPFHyperlinkRun);
  361. assertTrue(paragraph.getRuns().get(3) instanceof XWPFFieldRun);
  362. assertTrue(paragraph.getIRuns().get(1) instanceof XWPFSDT);
  363. assertTrue(paragraph.getIRuns().get(2) instanceof XWPFHyperlinkRun);
  364. paragraph.removeRun(1);
  365. assertEquals(3, paragraph.getRuns().size());
  366. assertTrue(paragraph.getRuns().get(1) instanceof XWPFHyperlinkRun);
  367. assertTrue(paragraph.getRuns().get(2) instanceof XWPFFieldRun);
  368. assertTrue(paragraph.getIRuns().get(1) instanceof XWPFSDT);
  369. assertTrue(paragraph.getIRuns().get(2) instanceof XWPFHyperlinkRun);
  370. paragraph.removeRun(1);
  371. assertEquals(2, paragraph.getRuns().size());
  372. assertTrue(paragraph.getRuns().get(1) instanceof XWPFFieldRun);
  373. assertTrue(paragraph.getIRuns().get(1) instanceof XWPFSDT);
  374. assertTrue(paragraph.getIRuns().get(2) instanceof XWPFFieldRun);
  375. paragraph.removeRun(0);
  376. assertEquals(1, paragraph.getRuns().size());
  377. assertTrue(paragraph.getRuns().get(0) instanceof XWPFFieldRun);
  378. assertTrue(paragraph.getIRuns().get(0) instanceof XWPFSDT);
  379. assertTrue(paragraph.getIRuns().get(1) instanceof XWPFFieldRun);
  380. XWPFRun newRun = paragraph.insertNewRun(0);
  381. assertEquals(2, paragraph.getRuns().size());
  382. assertEquals(3, paragraph.getIRuns().size());
  383. assertEquals(0, paragraph.getRuns().indexOf(newRun));
  384. doc.close();
  385. doc2.close();
  386. }
  387. @Test
  388. void testPictures() throws IOException {
  389. try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("VariousPictures.docx")) {
  390. assertEquals(7, doc.getParagraphs().size());
  391. XWPFParagraph p;
  392. XWPFRun r;
  393. // Text paragraphs
  394. assertEquals("Sheet with various pictures", doc.getParagraphs().get(0).getText());
  395. assertEquals("(jpeg, png, wmf, emf and pict) ", doc.getParagraphs().get(1).getText());
  396. // Spacer ones
  397. assertEquals("", doc.getParagraphs().get(2).getText());
  398. assertEquals("", doc.getParagraphs().get(3).getText());
  399. assertEquals("", doc.getParagraphs().get(4).getText());
  400. // Image one
  401. p = doc.getParagraphs().get(5);
  402. assertEquals(6, p.getRuns().size());
  403. r = p.getRuns().get(0);
  404. assertEquals("", r.toString());
  405. assertEquals(1, r.getEmbeddedPictures().size());
  406. assertNotNull(r.getEmbeddedPictures().get(0).getPictureData());
  407. assertEquals("image1.wmf", r.getEmbeddedPictures().get(0).getPictureData().getFileName());
  408. r = p.getRuns().get(1);
  409. assertEquals("", r.toString());
  410. assertEquals(1, r.getEmbeddedPictures().size());
  411. assertNotNull(r.getEmbeddedPictures().get(0).getPictureData());
  412. assertEquals("image2.png", r.getEmbeddedPictures().get(0).getPictureData().getFileName());
  413. r = p.getRuns().get(2);
  414. assertEquals("", r.toString());
  415. assertEquals(1, r.getEmbeddedPictures().size());
  416. assertNotNull(r.getEmbeddedPictures().get(0).getPictureData());
  417. assertEquals("image3.emf", r.getEmbeddedPictures().get(0).getPictureData().getFileName());
  418. r = p.getRuns().get(3);
  419. assertEquals("", r.toString());
  420. assertEquals(1, r.getEmbeddedPictures().size());
  421. assertNotNull(r.getEmbeddedPictures().get(0).getPictureData());
  422. assertEquals("image4.emf", r.getEmbeddedPictures().get(0).getPictureData().getFileName());
  423. r = p.getRuns().get(4);
  424. assertEquals("", r.toString());
  425. assertEquals(1, r.getEmbeddedPictures().size());
  426. assertNotNull(r.getEmbeddedPictures().get(0).getPictureData());
  427. assertEquals("image5.jpeg", r.getEmbeddedPictures().get(0).getPictureData().getFileName());
  428. r = p.getRuns().get(5);
  429. assertEquals(" ", r.toString());
  430. assertEquals(0, r.getEmbeddedPictures().size());
  431. // Final spacer
  432. assertEquals("", doc.getParagraphs().get(6).getText());
  433. // Look in detail at one
  434. r = p.getRuns().get(4);
  435. XWPFPicture pict = r.getEmbeddedPictures().get(0);
  436. CTPicture picture = pict.getCTPicture();
  437. assertEquals("rId8", picture.getBlipFill().getBlip().getEmbed());
  438. // Ensure that the ooxml compiler finds everything we need
  439. r.getCTR().getDrawingArray(0);
  440. r.getCTR().getDrawingArray(0).getInlineArray(0);
  441. r.getCTR().getDrawingArray(0).getInlineArray(0).getGraphic();
  442. r.getCTR().getDrawingArray(0).getInlineArray(0).getGraphic().getGraphicData();
  443. PicDocument pd = new PicDocumentImpl(null);
  444. assertTrue(pd.isNil());
  445. }
  446. }
  447. @Test
  448. void testTika792() throws Exception {
  449. //This test forces the loading of CTMoveBookmark and
  450. //CTMoveBookmarkImpl into ooxml-lite.
  451. try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Tika-792.docx")) {
  452. XWPFParagraph paragraph = doc.getParagraphs().get(0);
  453. assertEquals("", paragraph.getText());
  454. paragraph = doc.getParagraphs().get(1);
  455. assertEquals("b", paragraph.getText());
  456. }
  457. }
  458. @Test
  459. void testSettersGetters() throws IOException {
  460. try (XWPFDocument doc = new XWPFDocument()) {
  461. XWPFParagraph p = doc.createParagraph();
  462. assertTrue(p.isEmpty());
  463. assertFalse(p.removeRun(0));
  464. p.setBorderTop(Borders.BABY_PACIFIER);
  465. p.setBorderBetween(Borders.BABY_PACIFIER);
  466. p.setBorderBottom(Borders.BABY_RATTLE);
  467. assertNotNull(p.getIRuns());
  468. assertEquals(0, p.getIRuns().size());
  469. assertFalse(p.isEmpty());
  470. assertNull(p.getStyleID());
  471. assertNull(p.getStyle());
  472. assertNull(p.getNumID());
  473. p.setNumID(BigInteger.valueOf(12));
  474. assertEquals(BigInteger.valueOf(12), p.getNumID());
  475. p.setNumID(BigInteger.valueOf(13));
  476. assertEquals(BigInteger.valueOf(13), p.getNumID());
  477. assertNull(p.getNumFmt());
  478. assertNull(p.getNumIlvl());
  479. assertEquals("", p.getParagraphText());
  480. assertEquals("", p.getPictureText());
  481. assertEquals("", p.getFootnoteText());
  482. p.setBorderBetween(Borders.NONE);
  483. assertEquals(Borders.NONE, p.getBorderBetween());
  484. p.setBorderBetween(Borders.BASIC_BLACK_DASHES);
  485. assertEquals(Borders.BASIC_BLACK_DASHES, p.getBorderBetween());
  486. p.setBorderBottom(Borders.NONE);
  487. assertEquals(Borders.NONE, p.getBorderBottom());
  488. p.setBorderBottom(Borders.BABY_RATTLE);
  489. assertEquals(Borders.BABY_RATTLE, p.getBorderBottom());
  490. p.setBorderLeft(Borders.NONE);
  491. assertEquals(Borders.NONE, p.getBorderLeft());
  492. p.setBorderLeft(Borders.BASIC_WHITE_SQUARES);
  493. assertEquals(Borders.BASIC_WHITE_SQUARES, p.getBorderLeft());
  494. p.setBorderRight(Borders.NONE);
  495. assertEquals(Borders.NONE, p.getBorderRight());
  496. p.setBorderRight(Borders.BASIC_WHITE_DASHES);
  497. assertEquals(Borders.BASIC_WHITE_DASHES, p.getBorderRight());
  498. p.setBorderBottom(Borders.NONE);
  499. assertEquals(Borders.NONE, p.getBorderBottom());
  500. p.setBorderBottom(Borders.BASIC_WHITE_DOTS);
  501. assertEquals(Borders.BASIC_WHITE_DOTS, p.getBorderBottom());
  502. assertFalse(p.isPageBreak());
  503. p.setPageBreak(true);
  504. assertTrue(p.isPageBreak());
  505. p.setPageBreak(false);
  506. assertFalse(p.isPageBreak());
  507. assertFalse(p.isKeepNext());
  508. p.setKeepNext(true);
  509. assertTrue(p.isKeepNext());
  510. p.setKeepNext(false);
  511. assertFalse(p.isKeepNext());
  512. assertEquals(-1, p.getSpacingAfter());
  513. p.setSpacingAfter(12);
  514. assertEquals(12, p.getSpacingAfter());
  515. assertEquals(-1, p.getSpacingAfterLines());
  516. p.setSpacingAfterLines(14);
  517. assertEquals(14, p.getSpacingAfterLines());
  518. assertEquals(-1, p.getSpacingBefore());
  519. p.setSpacingBefore(16);
  520. assertEquals(16, p.getSpacingBefore());
  521. assertEquals(-1, p.getSpacingBeforeLines());
  522. p.setSpacingBeforeLines(18);
  523. assertEquals(18, p.getSpacingBeforeLines());
  524. assertEquals(LineSpacingRule.AUTO, p.getSpacingLineRule());
  525. p.setSpacingLineRule(LineSpacingRule.EXACT);
  526. assertEquals(LineSpacingRule.EXACT, p.getSpacingLineRule());
  527. assertEquals(-1, p.getIndentationLeft());
  528. p.setIndentationLeft(21);
  529. assertEquals(21, p.getIndentationLeft());
  530. assertEquals(-1, p.getIndentationRight());
  531. p.setIndentationRight(25);
  532. assertEquals(25, p.getIndentationRight());
  533. assertEquals(-1, p.getIndentationHanging());
  534. p.setIndentationHanging(25);
  535. assertEquals(25, p.getIndentationHanging());
  536. assertEquals(-1, p.getIndentationFirstLine());
  537. p.setIndentationFirstLine(25);
  538. assertEquals(25, p.getIndentationFirstLine());
  539. assertFalse(p.isWordWrap());
  540. p.setWordWrapped(true);
  541. assertTrue(p.isWordWrap());
  542. p.setWordWrapped(false);
  543. assertFalse(p.isWordWrap());
  544. assertNull(p.getStyle());
  545. p.setStyle("testStyle");
  546. assertEquals("testStyle", p.getStyle());
  547. p.addRun(CTR.Factory.newInstance());
  548. //assertTrue(p.removeRun(0));
  549. assertNotNull(p.getBody());
  550. assertEquals(BodyElementType.PARAGRAPH, p.getElementType());
  551. assertEquals(BodyType.DOCUMENT, p.getPartType());
  552. }
  553. }
  554. @Test
  555. void testSearchTextNotFound() throws IOException {
  556. try (XWPFDocument doc = new XWPFDocument()) {
  557. XWPFParagraph p = doc.createParagraph();
  558. assertNull(p.searchText("test", new PositionInParagraph()));
  559. assertEquals("", p.getText());
  560. }
  561. }
  562. @Test
  563. void testSearchTextFound() throws IOException {
  564. try (XWPFDocument xml = XWPFTestDataSamples.openSampleDocument("ThreeColHead.docx")) {
  565. List<XWPFParagraph> ps = xml.getParagraphs();
  566. assertEquals(10, ps.size());
  567. XWPFParagraph p = ps.get(0);
  568. TextSegment segment = p.searchText("sample word document", new PositionInParagraph());
  569. assertNotNull(segment);
  570. assertEquals("sample word document", p.getText(segment));
  571. assertTrue(p.removeRun(0));
  572. }
  573. }
  574. @Test
  575. void testFieldRuns() throws IOException {
  576. try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("FldSimple.docx")) {
  577. List<XWPFParagraph> ps = doc.getParagraphs();
  578. assertEquals(1, ps.size());
  579. XWPFParagraph p = ps.get(0);
  580. assertEquals(1, p.getRuns().size());
  581. assertEquals(1, p.getIRuns().size());
  582. XWPFRun r = p.getRuns().get(0);
  583. assertEquals(XWPFFieldRun.class, r.getClass());
  584. XWPFFieldRun fr = (XWPFFieldRun) r;
  585. assertEquals(" FILENAME \\* MERGEFORMAT ", fr.getFieldInstruction());
  586. assertEquals("FldSimple.docx", fr.text());
  587. assertEquals("FldSimple.docx", p.getText());
  588. }
  589. }
  590. @SuppressWarnings("deprecation")
  591. @Test
  592. void testRuns() throws IOException {
  593. try (XWPFDocument doc = new XWPFDocument()) {
  594. XWPFParagraph p = doc.createParagraph();
  595. CTR run = CTR.Factory.newInstance();
  596. XWPFRun r = new XWPFRun(run, doc.createParagraph());
  597. p.addRun(r);
  598. p.addRun(r);
  599. assertNotNull(p.getRun(run));
  600. assertNull(p.getRun(null));
  601. }
  602. }
  603. @Test
  604. void test58067() throws IOException {
  605. try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("58067.docx")) {
  606. StringBuilder str = new StringBuilder();
  607. for (XWPFParagraph par : doc.getParagraphs()) {
  608. str.append(par.getText()).append("\n");
  609. }
  610. assertEquals("This is a test.\n\n\n\n3\n4\n5\n\n\n\nThis is a whole paragraph where one word is deleted.\n", str.toString());
  611. }
  612. }
  613. @Test
  614. void test61787() throws IOException {
  615. try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("61787.docx")) {
  616. StringBuilder str = new StringBuilder();
  617. for (XWPFParagraph par : doc.getParagraphs()) {
  618. str.append(par.getText()).append("\n");
  619. }
  620. String s = str.toString();
  621. assertTrue(StringUtil.isNotBlank(s), "Having text: \n" + s + "\nTrimmed length: " + s.trim().length());
  622. }
  623. }
  624. /**
  625. * Tests for numbered lists
  626. *
  627. * See also https://github.com/jimklo/apache-poi-sample/blob/master/src/main/java/com/sri/jklo/StyledDocument.java
  628. * for someone else trying a similar thing
  629. */
  630. @Test
  631. void testNumberedLists() throws Exception {
  632. try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("ComplexNumberedLists.docx")) {
  633. XWPFParagraph p;
  634. p = doc.getParagraphArray(0);
  635. assertEquals("This is a document with numbered lists", p.getText());
  636. assertNull(p.getNumID());
  637. assertNull(p.getNumIlvl());
  638. assertNull(p.getNumStartOverride());
  639. p = doc.getParagraphArray(1);
  640. assertEquals("Entry #1", p.getText());
  641. assertEquals(BigInteger.valueOf(1), p.getNumID());
  642. assertEquals(BigInteger.valueOf(0), p.getNumIlvl());
  643. assertNull(p.getNumStartOverride());
  644. p = doc.getParagraphArray(2);
  645. assertEquals("Entry #2, with children", p.getText());
  646. assertEquals(BigInteger.valueOf(1), p.getNumID());
  647. assertEquals(BigInteger.valueOf(0), p.getNumIlvl());
  648. assertNull(p.getNumStartOverride());
  649. p = doc.getParagraphArray(3);
  650. assertEquals("2-a", p.getText());
  651. assertEquals(BigInteger.valueOf(1), p.getNumID());
  652. assertEquals(BigInteger.valueOf(1), p.getNumIlvl());
  653. assertNull(p.getNumStartOverride());
  654. p = doc.getParagraphArray(4);
  655. assertEquals("2-b", p.getText());
  656. assertEquals(BigInteger.valueOf(1), p.getNumID());
  657. assertEquals(BigInteger.valueOf(1), p.getNumIlvl());
  658. assertNull(p.getNumStartOverride());
  659. p = doc.getParagraphArray(5);
  660. assertEquals("2-c", p.getText());
  661. assertEquals(BigInteger.valueOf(1), p.getNumID());
  662. assertEquals(BigInteger.valueOf(1), p.getNumIlvl());
  663. assertNull(p.getNumStartOverride());
  664. p = doc.getParagraphArray(6);
  665. assertEquals("Entry #3", p.getText());
  666. assertEquals(BigInteger.valueOf(1), p.getNumID());
  667. assertEquals(BigInteger.valueOf(0), p.getNumIlvl());
  668. assertNull(p.getNumStartOverride());
  669. p = doc.getParagraphArray(7);
  670. assertEquals("Entry #4", p.getText());
  671. assertEquals(BigInteger.valueOf(1), p.getNumID());
  672. assertEquals(BigInteger.valueOf(0), p.getNumIlvl());
  673. assertNull(p.getNumStartOverride());
  674. // New list
  675. p = doc.getParagraphArray(8);
  676. assertEquals("Restarted to 1 from 5", p.getText());
  677. assertEquals(BigInteger.valueOf(2), p.getNumID());
  678. assertEquals(BigInteger.valueOf(0), p.getNumIlvl());
  679. assertNull(p.getNumStartOverride());
  680. p = doc.getParagraphArray(9);
  681. assertEquals("Restarted @ 2", p.getText());
  682. assertEquals(BigInteger.valueOf(2), p.getNumID());
  683. assertEquals(BigInteger.valueOf(0), p.getNumIlvl());
  684. assertNull(p.getNumStartOverride());
  685. p = doc.getParagraphArray(10);
  686. assertEquals("Restarted @ 3", p.getText());
  687. assertEquals(BigInteger.valueOf(2), p.getNumID());
  688. assertEquals(BigInteger.valueOf(0), p.getNumIlvl());
  689. assertNull(p.getNumStartOverride());
  690. // New list starting at 10
  691. p = doc.getParagraphArray(11);
  692. assertEquals("Jump to new list at 10", p.getText());
  693. assertEquals(BigInteger.valueOf(6), p.getNumID());
  694. assertEquals(BigInteger.valueOf(0), p.getNumIlvl());
  695. // TODO Why isn't this seen as 10?
  696. assertNull(p.getNumStartOverride());
  697. // TODO Shouldn't we use XWPFNumbering or similar here?
  698. // TODO Make it easier to change
  699. }
  700. }
  701. }