diff --git a/build.gradle b/build.gradle index 49e3ea88..ff2ebfa2 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ plugins { } group 'com.docutools' -version = '1.8.0' +version = '2.0.0' java { toolchain { diff --git a/src/main/java/com/docutools/jocument/impl/word/CustomWordPlaceholderData.java b/src/main/java/com/docutools/jocument/impl/word/CustomWordPlaceholderData.java index bc577b21..9bac43dc 100644 --- a/src/main/java/com/docutools/jocument/impl/word/CustomWordPlaceholderData.java +++ b/src/main/java/com/docutools/jocument/impl/word/CustomWordPlaceholderData.java @@ -6,8 +6,8 @@ import java.util.Locale; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.poi.xwpf.usermodel.IBody; import org.apache.poi.xwpf.usermodel.IBodyElement; -import org.apache.poi.xwpf.usermodel.XWPFDocument; public abstract class CustomWordPlaceholderData implements PlaceholderData { private static final Logger logger = LogManager.getLogger(); @@ -19,16 +19,18 @@ public PlaceholderType getType() { @Override public void transform(Object placeholder, Locale locale, GenerationOptions options) { - if (!(placeholder instanceof IBodyElement element)) { + if (placeholder instanceof IBodyElement element) { + if (element.getPart() instanceof IBody bodyPart) { + transform(element, bodyPart, locale, options); + } else { + logger.error("Parent of {} is not an instance of IBody", placeholder); + throw new IllegalArgumentException("Only children of IBody objects accepted."); + } + } else { logger.error("{} is not an instance of IBodyElement", placeholder); throw new IllegalArgumentException("Only IBodyElements accepted."); } - - var document = element.getBody().getXWPFDocument(); - - transform(element, document, locale, options); } - protected abstract void transform(IBodyElement placeholder, XWPFDocument document, Locale locale, GenerationOptions options); - + protected abstract void transform(IBodyElement placeholder, IBody part, Locale locale, GenerationOptions options); } diff --git a/src/main/java/com/docutools/jocument/impl/word/placeholders/ImagePlaceholderData.java b/src/main/java/com/docutools/jocument/impl/word/placeholders/ImagePlaceholderData.java index f0b7689b..5bf23fe5 100644 --- a/src/main/java/com/docutools/jocument/impl/word/placeholders/ImagePlaceholderData.java +++ b/src/main/java/com/docutools/jocument/impl/word/placeholders/ImagePlaceholderData.java @@ -10,8 +10,8 @@ import java.util.Locale; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.poi.xwpf.usermodel.IBody; import org.apache.poi.xwpf.usermodel.IBodyElement; -import org.apache.poi.xwpf.usermodel.XWPFDocument; public class ImagePlaceholderData extends CustomWordPlaceholderData { private static final Logger logger = LogManager.getLogger(); @@ -31,10 +31,10 @@ public ImagePlaceholderData withMaxWidth(int maxWidth) { } @Override - protected void transform(IBodyElement placeholder, XWPFDocument document, Locale locale, GenerationOptions options) { + protected void transform(IBodyElement placeholder, IBody part, Locale locale, GenerationOptions options) { Path path = applyOptions(options); try { - var paragraph = document.insertNewParagraph(WordUtilities.openCursor(placeholder).orElseThrow()); + var paragraph = part.insertNewParagraph(WordUtilities.openCursor(placeholder).orElseThrow()); WordImageUtils.insertImage(paragraph, path, options.imageStrategy()); WordUtilities.removeIfExists(placeholder); } finally { diff --git a/src/test/java/com/docutools/jocument/impl/word/WordGeneratorTest.java b/src/test/java/com/docutools/jocument/impl/word/WordGeneratorTest.java index c98e82a0..cfcc9196 100644 --- a/src/test/java/com/docutools/jocument/impl/word/WordGeneratorTest.java +++ b/src/test/java/com/docutools/jocument/impl/word/WordGeneratorTest.java @@ -512,4 +512,20 @@ void dynamicAccess() throws InterruptedException, IOException { assertThat(documentWrapper.bodyElement(0).asParagraph().run(0).text(), equalTo(SampleModelData.ENTERPRISE.name())); } + @Test + void pictureInHeader() throws InterruptedException, IOException { + // Arrange + Template template = Template.fromClassPath("/templates/word/PictureInHeader.docx") + .orElseThrow(); + PlaceholderResolver resolver = new ReflectionResolver(SampleModelData.PICARD); + + // Act + Document document = template.startGeneration(resolver); + document.blockUntilCompletion(60000L); // 1 minute + + // Assert + assertThat(document.completed(), is(true)); + xwpfDocument = TestUtils.getXWPFDocumentFromDocument(document); + assertThat(xwpfDocument.getHeaderArray(0).getAllPictures(), hasSize(1)); + } } \ No newline at end of file diff --git a/src/test/java/com/docutools/jocument/localisation/CustomTranslationsTests.java b/src/test/java/com/docutools/jocument/localisation/CustomTranslationsTests.java index 2c5d03ba..d5fffdcf 100644 --- a/src/test/java/com/docutools/jocument/localisation/CustomTranslationsTests.java +++ b/src/test/java/com/docutools/jocument/localisation/CustomTranslationsTests.java @@ -15,6 +15,7 @@ import com.docutools.jocument.sample.model.SampleModelData; import java.util.Locale; import java.util.Optional; +import org.apache.poi.xwpf.usermodel.IBody; import org.apache.poi.xwpf.usermodel.IBodyElement; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; @@ -103,7 +104,7 @@ public CustomTranslatedPlaceholder() { } @Override - protected void transform(IBodyElement placeholder, XWPFDocument document, Locale locale, GenerationOptions options) { + protected void transform(IBodyElement placeholder, IBody part, Locale locale, GenerationOptions options) { if (placeholder instanceof XWPFParagraph paragraph) { var translatedText = options.translate(paragraph.getText(), locale).orElse(""); WordUtilities.replaceText(paragraph, translatedText); diff --git a/src/test/java/com/docutools/jocument/sample/placeholders/QuotePlaceholder.java b/src/test/java/com/docutools/jocument/sample/placeholders/QuotePlaceholder.java index 713bd946..2f24aefa 100644 --- a/src/test/java/com/docutools/jocument/sample/placeholders/QuotePlaceholder.java +++ b/src/test/java/com/docutools/jocument/sample/placeholders/QuotePlaceholder.java @@ -4,13 +4,13 @@ import com.docutools.jocument.impl.word.CustomWordPlaceholderData; import com.docutools.jocument.impl.word.WordUtilities; import java.util.Locale; +import org.apache.poi.xwpf.usermodel.IBody; import org.apache.poi.xwpf.usermodel.IBodyElement; -import org.apache.poi.xwpf.usermodel.XWPFDocument; public class QuotePlaceholder extends CustomWordPlaceholderData { @Override - protected void transform(IBodyElement placeholder, XWPFDocument document, Locale locale, GenerationOptions options) { - var paragraph = document.insertNewParagraph(WordUtilities.openCursor(placeholder).orElseThrow()); + protected void transform(IBodyElement placeholder, IBody part, Locale locale, GenerationOptions options) { + var paragraph = part.insertNewParagraph(WordUtilities.openCursor(placeholder).orElseThrow()); paragraph.createRun().setText("Live your life not celebrating victories, but overcoming defeats."); WordUtilities.removeIfExists(placeholder); } diff --git a/src/test/resources/templates/word/PictureInHeader.docx b/src/test/resources/templates/word/PictureInHeader.docx new file mode 100644 index 00000000..d32e0a9b Binary files /dev/null and b/src/test/resources/templates/word/PictureInHeader.docx differ