A Java library that interacts with Gotenberg's different modules to convert a variety of document formats to PDF files.
To incorporate jotenberg
into your project, follow the snippets below for Apache Maven and Gradle dependencies.
<dependency>
<groupId>dev.inaka</groupId>
<artifactId>jotenberg</artifactId>
<version>1.1.0</version>
</dependency>
implementation group: 'dev.inaka', name: 'jotenberg', version: '1.1.0'
Before attempting to use Jotenberg
, be sure you install Docker if you have not already done
so.
Once the docker Daemon is up and running, you can start a default Docker container of Gotenberg as follows:
docker run --rm -p 8090:8090 gotenberg/gotenberg:8 gotenberg --api-port=8090
After that, you need to download the latest Jotenberg
JAR library from the
GitHub Releases page and add it to your Java project classpath
.
Create an instance of Jotenberg
class and pass your Gotenberg
endpoint
url as a constructor parameter.
Jotenberg client = new Jotenberg("http://localhost:8090/");
Jotenberg
client comes with a convert
method that calls one of
Chromium's routes to convert html
and markdown
files, or
a url
to a CloseableHttpResponse
that contains the HttpEntity
which holds the content of the converted PDF file.
convert
expects three parameters; the first parameter represents what will be converted (i.e. url
, html
,
or markdown
files), the second one is a ChromiumPageProperties
parameter, and the third is a ChromiumOptions
parameter.
CloseableHttpResponse response = client.convert("https://gotenberg.dev/", pageProperties, options);
The only requirement is that the file name should be index.html
.
File file = new File("path/to/index.html");
CloseableHttpResponse response = client.convert(file, pageProperties, options);
This route accepts an index.html
file plus markdown files.
List<File> files = new ArrayList<>();
files.
add(new File("path/to/index.html"));
files.
add(new File("path/to/markdown.md"));
CloseableHttpResponse response = client.convert(files, pageProperties, options);
Jotenberg
client provides a convertWithLibreOffice
method which interacts
with LibreOffice to convert different types of documents such
as .docx
, .epub
, .eps
, and so on. You can find the list of all file
extensions here.
List<File> files = new ArrayList<>();
files.
add(new File("path/to/file.docx"));
files.
add(new File("path/to/file.xlsx"));
CloseableHttpResponse response = client.convertWithLibreOffice(files, pageProperties, options);
Similarly, Jotenberg
client provides a convertWithPdfEngines
method which interacts
with PDF Engines to convert PDF files to a specific format (
i.e. PDF/A-1a
, PDF/A-2b
, PDF/A-3b
)).
The supported formats can be found in PdfFormat
.
List<File> files = new ArrayList<>();
files.
add(new File("path/to/first.pdf"));
files.
add(new File("path/to/second.pdf"));
PageProperties pageProperties = new PageProperties.Builder()
.addPdfFormat(PdfFormat.A_3B.format())
.build();
CloseableHttpResponse response = client.convertWithPdfEngines(files, pageProperties, options);
Additionally, you can also use merge
method to alphabetically merge the PDF files.
List<File> files = new ArrayList<>();
files.
add(new File("path/to/first.pdf"));
files.
add(new File("path/to/second.pdf"));
CloseableHttpResponse response = client.merge(files, pageProperties, options);
The following is a short snippet of how to use the library.
import dev.inaka.Jotenberg;
import dev.inaka.chromium.ChromiumPageProperties;
import org.apache.commons.io.FileUtils;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
try (var client = new Jotenberg("http://localhost:80/")) {
var url = "https://gotenberg.dev/";
var properties = new PageProperties.Builder()
.addMarginTop(1.0f)
.addMarginLeft(0.5f)
.addMarginBottom(1.0f)
.addMarginTop(0.5f)
.addPrintBackground(true)
.build();
var response = client.convert(url, properties);
var projectDir = Paths.get("").toAbsolutePath().normalize();
var tempDir = Files.createTempDirectory(projectDir, "temp_");
var tempFile = Files.createTempFile(tempDir, "PDF_", ".pdf").toFile();
var pdfContent = response.getEntity().getContent();
FileUtils.copyInputStreamToFile(pdfContent, tempFile);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}