This is a (very) small project that builds upon Apache's PDFBox and should allow you to create tables in a fairly simple way. It emerged from the need in another project. Therefore it also may miss some crucial features. Nevertheless there is:
One can also override classes that are responsible for table/cell drawing, i.e. their drawing behaviour can be customized to a pretty high extent.
It is also possible to draw a table over multiple pages (even with the header row being repeated on every new page).
Add this to your
<dependency> <groupId>com.github.vandeseer</groupId> <artifactId>easytable</artifactId> <version>0.6.6</version> </dependency>
Or checkout the repository and install it locally with maven (e.g. for the
mvn clean install -DskipTests -Dgpg.skip -Ddependency-check.skip=true
There is a minimal full working example which should help you getting started.
For a bit more involved tables have a look at this code which is needed for creating a PDF document with the following two tables:
For the next example have a look at the SettingsTest.java:
The last one illustrates the use of vertical text in text cells. The code for it can be found here:
If you run the tests with
mvn clean test there also some PDF documents created which you can find in the
The corresponding sources (in order to understand how to use the code) can be found in the test package.
Since several people asked me to include a way to add hyperlinks within cells I did a bit of research and stumbled across a really nice library named pdfbox-layout. Unfortunately that library will not be developed any further, but it still provides a very powerful API for creating paragraphs with "styled text" (including links as well as markup).
Therefore I created a wrapper cell type (named
ParagraphCell) which allows to append
Note that the easytable API may be a bit different to what you find in the linked documentation. Anyway, in order to get your hands dirty look at this code on how to create such a table:
This is still a bit experimental and there may be changes in the future.
If you want to use this feature nevertheless you need to add pdfbox-layout as a dependency.
In case you are using maven for instance in your
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories> ... <dependency> <groupId>com.github.ralfstuckert.pdfbox-layout</groupId> <artifactId>pdfbox2-layout</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> </exclusion> </exclusions> </dependency>
Please note that you also need to set the
page(...) on the
TableDrawer in case you
are using a
TableDrawer.builder() .page(page) // <-- This is needed! .contentStream(contentStream) .table(table) ... .build() .draw()
Yep, you can customize the cell drawers itself or (depending on your use case) you can just create a custom cell.
For using a customized cell drawer, have a look at CustomCellDrawerTest.
In case you want to create your own type of cell (which shouldn't really be necessary since the
drawing can be completely adapted) you will need to use Lombok's
annotation. Again, just have a look at the code:
Yes, have a look at TableOverSeveralPagesTest.java.
endY(..) in order to restrict the vertical part of the page
where the table should be drawn:
RepeatedHeaderTableDrawer.builder() .table(createTable()) .startX(50) .startY(100F) .endY(50F) // <-- If the table is bigger, a new page is started .build()
Depending on whether you want to repeat the header row or not you
ycoordinate of the end of a drawn table?
Yes. Just use the
.getFinalY() method. Also see FinalYTest.java.
Nope. You will need at least Java 8.
Well, Using it with PDFBox 1.8.9 requires you to check out version 0.0.7 (tagged as such in git) and install it locally, i.e.:
git checkout v0.0.7 mvn clean install
Note though that the API has changed quite a bit in the meantime ...
Yes. Or you can upvote this answer on stackoverflow.