fluid-pdf
Easy PDF generation with HTML & CSS using Chromium or Google Chrome
Installation
build.gradle.kts
:
dependencies {
implementation("io.fluidsonic.pdf:fluid-pdf:0.20.0")
}
Usage
HTML file to PDF file
import io.fluidsonic.pdf.*
import java.nio.file.*
suspend fun main() {
val sourceFile = Path.of("input.html").toAbsolutePath()
val destinationFile = Path.of("output.pdf").toAbsolutePath()
ChromiumPdfGenerator.launch(
binaryFile = Path.of("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome")
).use { generator ->
generator.generate(PdfGenerationSource.HtmlFile(sourceFile))
.writeTo(destinationFile)
}
println("PDF has been generated at $destinationFile")
}
- Use
ChromiumPdfGenerator.launch()
to launch a browser instance for PDF generation. - Use
ChromiumPdfGenerator.lazy()
to launch the browser not immediately but automatically with the first PDF generation. - Use
ChromiumPdfGenerator
's .close()
to shut down the browser when you are done generating PDFs. - Use
PdfGenerator
's .generate()
to create any number of PDFs. - Use
PdfGenerator
interface to hide implementation details (use of Chromium, .close()
) as needed.
HTML string to PDF file
generator.generate(PdfGenerationSource.Html("<strong>Hello world!</strong>"))
.writeTo(PdfGenerationDestination.File(destinationFile))
💡 Relative paths in HTML & CSS won't resolve. Using <base href="…">
to specify the base path should help.
HTML stream to PDF file
val sourceStream: InputStream = …
generator.generate(PdfGenerationSource.HtmlStream(sourceStream))
.writeTo(PdfGenerationDestination.File(destinationFile))
💡 Relative paths in HTML & CSS won't resolve. Using <base href="…">
to specify the base path should help.
PDF generation settings
generator.generate(
source = PdfGenerationSource.Html("<strong>Hello world!</strong>"),
settings = PdfGenerationSettings.default.copy(
encryption = PdfEncryption(
ownerPassword = "secret",
permissions = PdfPermissions.none.copy(
contentExtractionAllowed = true,
contentExtractionForAccessibilityAllowed = true,
printQuality = PdfPermissions.PrintQuality.high,
),
),
includeBackgrounds = false,
metadata = PdfMetadata(
title = "My PDF"
),
pageMargins = PdfMargins.cm(top = 2.0, right = 2.0, bottom = 1.0, left = 2.0),
pageOrientation = PdfOrientation.landscape,
pageSize = PdfSize.A5,
preferCssPageSize = false
)
)
.writeTo(destinationFile)
Output to stream
generator.generate(PdfGenerationSource.Html("<strong>Hello world!</strong>"))
.writeTo(outputStream)
💡 Closing the output stream is the responsibility of the caller. It will not be closed automatically.
TO-DO
Contributions welcome 🙏
- Add unit tests.
- Add KDoc to all public API.
- Check if
.generate()
works well if used from multiple threads and document if that is the case. - Add support for header & footer templates.
License
Apache 2.0