Giter VIP home page Giter VIP logo

docx-stamper's Introduction

docx-stamper

Build Status

docx-stamper is a Java template engine for docx documents. You create a template .docx document with your favorite word processor and feed it to a DocxStamper instance to create a document based on the template at runtime. Example code:

MyContext context = ...;                 // your own POJO against which expressions found in the template
                                         // will be resolved
InputStream template = ...;              // InputStream to your .docx template file
OutputStream out = ...;                  // OutputStream in which to write the resulting .docx document
DocxStamper stamper = new DocxStamper();
stamper.stamp(template, context, out);
out.close();

Replacing Expressions in a .docx Template

The main feature of docx-stamper is replacement of expressions within the text of the template document. Simply add expressions like ${person.name} or ${person.name.equals("Homer") ? "Duff" : "Budweiser"} in the text of your .docx template and provide a context object against which the expression can be resolved. docx-stamper will try to keep the original formatting of the text in the template intact. You can use the full feature set of Spring Expression Language.

The value an expression resolves to may be of the following types:

Type of expression value Effect
java.lang.Object The expression is replaced by the String representation of the object (String.valueOf()).
java.lang.String The expression is replaced with the String value.
java.util.Date The expression is replaced by a formatted Date string (by default "dd.MM.yyyy"). You can change the format string by registering your own DateResolver.
org.wickedsource.docxstamper...Image The expression is replaced with an inline image.

If an expression cannot be resolved successfully, it will be skipped (meaning the expression stays in the document as it was in the template). To support more than the above types you can implement your own TypeResolver. To register your own TypeResolver with docx-stamper, use the following code:

DocxStamper stamper = ...;              
ITypeResolver typeResolver = ...;              // instance of your own ITypeResolver implementation
Class<?> type ...;                             // class of expression values your resolver handles
stamper.getTypeResolverRegistry()
    .registerTypeResolver(type, typeResolver);

Conditional Display and Repeating of Elements

Besides replacing expressions, docx-stamper can process comments on paragraphs of text in the template .docx document and do manipulations on the template based on these comments. By default, you can use the following expressions in comments:

Expression in .docx comment Effect
displayParagraphIf(boolean) The commented paragraph is only displayed in the resulting .docx document if the boolean condition resolves to true.
displayTableRowIf(boolean) The table row surrounding the commented paragraph is only displayed in the resulting .docx document if the boolean condition resolves to true.
displayTableIf(boolean) The whole table surrounding the commented paragraph is only displayed in the resulting .docx document if the boolean condition resolves to true.
repeatTableRow(List<Object>) The table row surrounding the commented paragraph is copied once for each object in the passed-in list. Expressions found in the cells of the table row are evaluated against the object from the list.
replaceWordWith(expression) Replaces the commented word (must be a single word!) with the value of the given expression.

If a comment cannot be processed, by default an exception will be thrown. Successfully processed comments are removed from the document. You can add support to more expressions in comments by implementing your own ICommentProcessor. To register you comment processor to docx-stamper, use the following code:

DocxStamper stamper = ...;              
ICommentProcessor commentProcessor = ...;      // instance of your own ICommentProcessor implementation
Class<?> interfaceClass = ...;                 // class of the interface that defines the methods that are
                                               // exposed into the expression language
stamper.getCommentProcessorRegistry()
    .registerCommentProcessor(interfaceClass, commentProcessor);

For an in-depth description of how to create a comment processor, see the javadoc of ICommentProcessor.

Conditional Display and Repeating of Elements in Headers or Footers

The docx file format does not allow comments in Headers or Footers of a document. To be able to conditionally display content in a header or footer, simply surround the expression you would put in a comment with "#{}" and put it at the beginning of the paragraph you want to manipulate. The expression will be evaluated as it would be in a comment.

Error Handling

By default DocxStamper fails with an UnresolvedExpressionException if an expression within the document or within the comments cannot be resolved successfully. If you want to change this behavior, you can do the following:

DocxStamper stamper = ...;
stamper.setFailOnUnresolvedExpression(false);

Sample Code

The source code contains a set of tests show how to use the features. If you want to run them yourself, clone the repository and run the tests in the main package with the system property -DkeepOutputFile=true so that the resulting .docx documents will not be cleaned up so you can view them. The resulting files will be stored in your local temp folder (watch the logging output for the exact location of the files).

If you want to have a look at the .docx templates used in the tests, have a look at the resources subfolder in the test folder.

Maven coordinates

To include docx-stamper in your project, you can use the following maven coordinates in your dependency management system:

<dependency>
    <groupId>org.wickedsource</groupId>
    <artifactId>docx-stamper</artifactId>
    <version>1.0.10</version>
</dependency>

Changelog

Contribute

If you have an issue or created a comment processor or type resolver that you think deserves to be part of the default distribution, feel free to open an issue or - even better - a pull request with your contribution.

Frequently Asked Questions

See the Frequently Asked Questions wiki page for some answers to recurring questions.

docx-stamper's People

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.