From 41543e8c66105b5140e7d68a54bfec3df62ef384 Mon Sep 17 00:00:00 2001 From: Keyon U Date: Thu, 21 Feb 2019 17:49:33 +0800 Subject: [PATCH 1/3] Add Bookmark, Replace, Clean supports to headers and footers --- .../templ4docx/cleaner/DocumentCleaner.java | 11 +-- .../templ4docx/extractor/VariableFinder.java | 21 +---- .../meta/DocumentMetaProcessor.java | 43 +---------- .../jsolve/templ4docx/util/ParagraphUtil.java | 68 +++++++++++++++++ .../tests/meta/TestHeaderAndFooter.java | 72 ++++++++++++++++++ .../resources/meta/header-and-footer.docx | Bin 0 -> 15715 bytes 6 files changed, 149 insertions(+), 66 deletions(-) create mode 100644 src/main/java/pl/jsolve/templ4docx/util/ParagraphUtil.java create mode 100644 src/test/java/pl/jsolve/templ4docx/tests/meta/TestHeaderAndFooter.java create mode 100644 src/test/resources/meta/header-and-footer.docx diff --git a/src/main/java/pl/jsolve/templ4docx/cleaner/DocumentCleaner.java b/src/main/java/pl/jsolve/templ4docx/cleaner/DocumentCleaner.java index 2dd6c5c..21611ff 100644 --- a/src/main/java/pl/jsolve/templ4docx/cleaner/DocumentCleaner.java +++ b/src/main/java/pl/jsolve/templ4docx/cleaner/DocumentCleaner.java @@ -3,17 +3,14 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFParagraph; -import org.apache.poi.xwpf.usermodel.XWPFRun; -import org.apache.poi.xwpf.usermodel.XWPFTable; -import org.apache.poi.xwpf.usermodel.XWPFTableCell; -import org.apache.poi.xwpf.usermodel.XWPFTableRow; +import org.apache.poi.xwpf.usermodel.*; import pl.jsolve.sweetener.text.Strings; import pl.jsolve.templ4docx.core.Docx; import pl.jsolve.templ4docx.core.VariablePattern; import pl.jsolve.templ4docx.extractor.KeyExtractor; import pl.jsolve.templ4docx.util.Key; +import pl.jsolve.templ4docx.util.ParagraphUtil; import pl.jsolve.templ4docx.variable.Variables; /** @@ -36,11 +33,9 @@ public DocumentCleaner() { */ public void clean(Docx docx, Variables variables, VariablePattern variablePattern) { List keys = keyExtractor.extractKeys(variables); - for (XWPFParagraph paragraph : docx.getXWPFDocument().getParagraphs()) { + for (XWPFParagraph paragraph : ParagraphUtil.getAllParagraphs(docx.getXWPFDocument(), true)) { clean(paragraph.getRuns(), keys, variablePattern); } - - cleanTables(docx.getXWPFDocument().getTables(), keys, variablePattern); } /** diff --git a/src/main/java/pl/jsolve/templ4docx/extractor/VariableFinder.java b/src/main/java/pl/jsolve/templ4docx/extractor/VariableFinder.java index 11cc09c..906eaba 100644 --- a/src/main/java/pl/jsolve/templ4docx/extractor/VariableFinder.java +++ b/src/main/java/pl/jsolve/templ4docx/extractor/VariableFinder.java @@ -19,6 +19,7 @@ import pl.jsolve.templ4docx.insert.TextInsert; import pl.jsolve.templ4docx.strategy.InsertStrategyChooser; import pl.jsolve.templ4docx.util.Key; +import pl.jsolve.templ4docx.util.ParagraphUtil; import pl.jsolve.templ4docx.variable.Variables; /** @@ -49,28 +50,10 @@ public VariableFinder(Variables variables) { public List find(XWPFDocument document, Variables variables) { List inserts = new ArrayList(); List keys = keyExtractor.extractKeys(variables); - for (XWPFParagraph paragraph : document.getParagraphs()) { + for (XWPFParagraph paragraph : ParagraphUtil.getAllParagraphs(document, true)) { inserts.addAll(find(paragraph, document, null, keys)); } - for (XWPFHeader header : document.getHeaderList()) { - for (XWPFParagraph paragraph : header.getParagraphs()) { - inserts.addAll(find(paragraph, document, null, keys)); - } - - findInTables(inserts, header.getTables(), keys); - } - - for (XWPFFooter footer : document.getFooterList()) { - for (XWPFParagraph paragraph : footer.getParagraphs()) { - inserts.addAll(find(paragraph, document, null, keys)); - } - - findInTables(inserts, footer.getTables(), keys); - } - - findInTables(inserts, document.getTables(), keys); - mergeTableInserts(inserts, variables); return inserts; } diff --git a/src/main/java/pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java b/src/main/java/pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java index ae96d99..5af5350 100644 --- a/src/main/java/pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java +++ b/src/main/java/pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java @@ -11,13 +11,7 @@ import java.util.regex.Pattern; import org.apache.commons.codec.digest.DigestUtils; -import org.apache.poi.xwpf.usermodel.IRunBody; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.apache.poi.xwpf.usermodel.XWPFParagraph; -import org.apache.poi.xwpf.usermodel.XWPFRun; -import org.apache.poi.xwpf.usermodel.XWPFTable; -import org.apache.poi.xwpf.usermodel.XWPFTableCell; -import org.apache.poi.xwpf.usermodel.XWPFTableRow; +import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTMarkupRange; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; @@ -30,6 +24,7 @@ import pl.jsolve.templ4docx.extractor.KeyExtractor; import pl.jsolve.templ4docx.extractor.VariablesExtractor; import pl.jsolve.templ4docx.util.Key; +import pl.jsolve.templ4docx.util.ParagraphUtil; import pl.jsolve.templ4docx.variable.Variables; /** @@ -74,7 +69,7 @@ public void processMetaInformation(Docx docx, Variables variables, VariablePatte List keys = keyExtractor.extractKeys(variables); KeysHolder keysHolder = new KeysHolder(keys); XWPFDocument document = docx.getXWPFDocument(); - List paragraphs = getParagraphs(document); + List paragraphs = ParagraphUtil.getAllParagraphs(document, true); for (XWPFParagraph paragraph : paragraphs) { moveVariablesToSeparateRun(paragraph, keysHolder, variablePattern); markVariablesByBookmarks(paragraph, keysHolder, variablePattern); @@ -82,36 +77,6 @@ public void processMetaInformation(Docx docx, Variables variables, VariablePatte } } - /** - * @param document - * @return All document paragraphs (including paragraphs in nested tables) - */ - protected List getParagraphs(XWPFDocument document) { - List paragraphs = new ArrayList(); - paragraphs.addAll(document.getParagraphs()); - for (XWPFTable table : document.getTables()) { - paragraphs.addAll(getParagraphs(table)); - } - return paragraphs; - } - - /** - * @param table - * @return All table paragraphs (including paragraphs in nested tables) - */ - protected List getParagraphs(XWPFTable table) { - List paragraphs = new ArrayList(); - for (XWPFTableRow row : table.getRows()) { - for (XWPFTableCell cell : row.getTableCells()) { - paragraphs.addAll(cell.getParagraphs()); - for (XWPFTable cellTable : cell.getTables()) { - paragraphs.addAll(getParagraphs(cellTable)); - } - } - } - return paragraphs; - } - /** * Split every variable into separate run. * @@ -394,7 +359,7 @@ protected List getVariableBookmarks(XWPFParagraph paragraph, K */ protected BigInteger getMaxBookmarkId(XWPFDocument document) { BigInteger maxId = new BigInteger("0"); - for (XWPFParagraph paragraph : document.getParagraphs()) { + for (XWPFParagraph paragraph : ParagraphUtil.getAllParagraphs(document, true)) { CTP ctp = paragraph.getCTP(); for (CTBookmark bookmark : ctp.getBookmarkStartList()) { BigInteger id = bookmark.getId(); diff --git a/src/main/java/pl/jsolve/templ4docx/util/ParagraphUtil.java b/src/main/java/pl/jsolve/templ4docx/util/ParagraphUtil.java new file mode 100644 index 0000000..42641df --- /dev/null +++ b/src/main/java/pl/jsolve/templ4docx/util/ParagraphUtil.java @@ -0,0 +1,68 @@ +package pl.jsolve.templ4docx.util; + + +import org.apache.poi.xwpf.usermodel.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class supply some methods for paragraph processing. + * + * @author Keyon + */ + +public class ParagraphUtil { + /** + * Moved from pl.jsolve.templ4docx.meta.DocumentMetaProcessor + * @param table + * @return All table paragraphs + */ + protected static List getParagraphs(XWPFTable table) { + List paragraphs = new ArrayList(); + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + paragraphs.addAll(cell.getParagraphs()); + for (XWPFTable cellTable : cell.getTables()) { + paragraphs.addAll(getParagraphs(cellTable)); + } + } + } + return paragraphs; + } + + /** + * @param document + * @param includeTables if include paragraphs in tables. + * @return All document paragraphs, includes header and footer + */ + public static List getAllParagraphs(XWPFDocument document, boolean includeTables) { + List paragraphs = new ArrayList(); + paragraphs.addAll(document.getParagraphs()); + if (includeTables) { + for (XWPFTable table : document.getTables()) { + paragraphs.addAll(getParagraphs(table)); + } + } + + for (XWPFHeader header : document.getHeaderList()) { + paragraphs.addAll(header.getParagraphs()); + if (includeTables) { + for (XWPFTable table : header.getTables()) { + paragraphs.addAll(getParagraphs(table)); + } + } + } + + for (XWPFFooter footer : document.getFooterList()) { + paragraphs.addAll(footer.getParagraphs()); + if (includeTables) { + for (XWPFTable table : footer.getTables()) { + paragraphs.addAll(getParagraphs(table)); + } + } + } + + return paragraphs; + } +} diff --git a/src/test/java/pl/jsolve/templ4docx/tests/meta/TestHeaderAndFooter.java b/src/test/java/pl/jsolve/templ4docx/tests/meta/TestHeaderAndFooter.java new file mode 100644 index 0000000..8a07140 --- /dev/null +++ b/src/test/java/pl/jsolve/templ4docx/tests/meta/TestHeaderAndFooter.java @@ -0,0 +1,72 @@ +package pl.jsolve.templ4docx.tests.meta; + +import org.junit.Test; +import pl.jsolve.templ4docx.core.Docx; +import pl.jsolve.templ4docx.core.VariablePattern; +import pl.jsolve.templ4docx.variable.TextVariable; +import pl.jsolve.templ4docx.variable.Variables; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.assertEquals; + +/** + * @author Keyon (youngyou[dot]name[at]gmail[dot]com) + * + */ +public class TestHeaderAndFooter extends AbstractMetaTest { + + @Test + public void test() throws IOException { + String templateFileName = "meta/header-and-footer"; + InputStream is = getClass().getClassLoader().getResourceAsStream(templateFileName + ".docx"); + + Docx docx = new Docx(is); + docx.setProcessMetaInformation(true); + docx.setVariablePattern(new VariablePattern("${", "}")); + + Variables var = new Variables(); + var.addTextVariable(new TextVariable("${header01}", "Header")); + var.addTextVariable(new TextVariable("${footer01}", "Footer")); + var.addTextVariable(new TextVariable("${var01}", "Value")); + + docx.fillTemplate(var); + + String tmpPath = System.getProperty("java.io.tmpdir"); + String processedPath = String.format("%s%s%s", tmpPath, File.separator, + templateFileName + "-processed" + ".docx"); + + docx.save(processedPath); + + String text = docx.readTextContent(); + + assertEquals("This is header with two variables: Header, Value.\n" + + "This is test simple template with one variable: Value\n" + + "This is footer with two variables: Footer, Value.", text.trim()); + + is.close(); + + docx = new Docx(processedPath); + docx.setProcessMetaInformation(true); + docx.setVariablePattern(new VariablePattern("${", "}")); + + var = new Variables(); + var.addTextVariable(new TextVariable("${header01}", "Another Header")); + var.addTextVariable(new TextVariable("${footer01}", "Another Footer")); + var.addTextVariable(new TextVariable("${var01}", "Another Value")); + + docx.fillTemplate(var); + + String processedPath2 = String.format("%s%s%s", tmpPath, File.separator, + templateFileName + "-processed2" + ".docx"); + + docx.save(processedPath2); + + text = docx.readTextContent(); + assertEquals("This is header with two variables: Another Header, Another Value.\n" + + "This is test simple template with one variable: Another Value\n" + + "This is footer with two variables: Another Footer, Another Value.", text.trim()); + } +} diff --git a/src/test/resources/meta/header-and-footer.docx b/src/test/resources/meta/header-and-footer.docx new file mode 100644 index 0000000000000000000000000000000000000000..0d6b541754f34ad9a88805290d14e206842658cd GIT binary patch literal 15715 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 P!2`6tJ68<*&;R}(Fw@c` literal 0 HcmV?d00001 From f241015312443f4a751fd533dd93db12525b80fd Mon Sep 17 00:00:00 2001 From: Keyon U Date: Tue, 18 Jun 2019 11:36:13 +0800 Subject: [PATCH 2/3] Fix javadoc errors --- .../pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java | 9 ++++----- .../pl/jsolve/templ4docx/utils/ReflectionHelper.java | 8 +++----- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java b/src/main/java/pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java index 5af5350..75727a2 100644 --- a/src/main/java/pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java +++ b/src/main/java/pl/jsolve/templ4docx/meta/DocumentMetaProcessor.java @@ -81,7 +81,7 @@ public void processMetaInformation(Docx docx, Variables variables, VariablePatte * Split every variable into separate run. * * @param paragraph - * @param keys + * @param keysHolder * @param variablePattern */ protected void moveVariablesToSeparateRun(XWPFParagraph paragraph, KeysHolder keysHolder, @@ -177,7 +177,7 @@ protected void applyRPr(XWPFRun run, CTRPr rPr) { * Every variable in separate run will by marked by bookmark. * * @param paragraph - * @param keys + * @param keysHolder * @param variablePattern */ protected void markVariablesByBookmarks(XWPFParagraph paragraph, KeysHolder keysHolder, @@ -307,7 +307,7 @@ protected List getVariableBookmarks(XWPFRun run, KeysHolder ke /** * Find bookmarks used as meta information for variables into the {@code paragraph}. * - * @param run + * @param paragraph * @param keysHolder * @return */ @@ -420,8 +420,7 @@ protected void alignNodes(XWPFParagraph paragraph, XWPFRun run, CTBookmark bookm * name. All other runs inside variable bookmarks will be removed. * * @param paragraph - * @param keys - * @param variablePattern + * @param keysHolder */ protected void clearVariablesInRunByBookmarks(XWPFParagraph paragraph, KeysHolder keysHolder) { List varBookmarks = getVariableBookmarks(paragraph, keysHolder); diff --git a/src/main/java/pl/jsolve/templ4docx/utils/ReflectionHelper.java b/src/main/java/pl/jsolve/templ4docx/utils/ReflectionHelper.java index 8bc4c2b..a475d8d 100644 --- a/src/main/java/pl/jsolve/templ4docx/utils/ReflectionHelper.java +++ b/src/main/java/pl/jsolve/templ4docx/utils/ReflectionHelper.java @@ -74,8 +74,7 @@ public static void setFieldValueBySetter(Object object, Field field, Object valu * @param object * @param field * @return the field value of an object - * @throws IllegalAccessException - * @throws IllegalArgumentException + * @throws RuntimeException */ public static Object getFieldValue(Object object, Field field) { try { @@ -91,10 +90,9 @@ public static Object getFieldValue(Object object, Field field) { /** * @param object - * @param field + * @param fieldName * @return the field value of an object - * @throws IllegalAccessException - * @throws IllegalArgumentException + * @throws RuntimeException */ public static Object getFieldValue(Object object, String fieldName) { Collection fields = getFields(object); From fd853daf714934fa7da4d3e84994fa6a0f6b931f Mon Sep 17 00:00:00 2001 From: Keyon U Date: Tue, 18 Jun 2019 11:36:35 +0800 Subject: [PATCH 3/3] add missing gradle dependancies --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6e2399c..56e9efc 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,8 @@ dependencies { compile 'org.apache.poi:poi:+' compile 'org.apache.poi:poi-ooxml:+' compile 'org.apache.commons:commons-lang3:+' - + compile 'commons-io:commons-io:2.5' + testCompile 'org.easytesting:fest-assert:+' testCompile 'junit:junit:+' } @@ -22,3 +23,4 @@ task copyToLibs(type: Copy) { into "$buildDir/libs" from configurations.compile, configurations.testCompile } +