Implemented OpenHtmlToPdfHtmlToPdfConverter to convert HTML to PDF

This commit is contained in:
dankito 2024-12-01 23:00:06 +01:00
parent 8c4614fe9c
commit 6a9ed9078e
6 changed files with 150 additions and 0 deletions

View File

@ -23,6 +23,9 @@ pdfboxTextExtractor=0.6.1
angusMailVersion=2.0.3
openHtmlToPdfVersion=1.1.22
jsoupVersion=1.18.1
klfVersion=1.6.2
lokiLogAppenderVersion=0.5.5
# only used for tests

View File

@ -0,0 +1,49 @@
plugins {
kotlin("jvm")
}
kotlin {
jvmToolchain(11)
}
java {
withSourcesJar()
}
val openHtmlToPdfVersion: String by project
val jsoupVersion: String by project
val klfVersion: String by project
val assertKVersion: String by project
val logbackVersion: String by project
dependencies {
implementation("io.github.openhtmltopdf:openhtmltopdf-pdfbox:$openHtmlToPdfVersion")
implementation("io.github.openhtmltopdf:openhtmltopdf-slf4j:$openHtmlToPdfVersion")
implementation("org.jsoup:jsoup:$jsoupVersion")
implementation("net.codinux.log:klf:$klfVersion")
testImplementation(kotlin("test"))
testImplementation("com.willowtreeapps.assertk:assertk:$assertKVersion")
testImplementation("ch.qos.logback:logback-classic:$logbackVersion")
}
tasks.test {
useJUnitPlatform()
}
ext["customArtifactId"] = "invoice-creator"
apply(from = "../gradle/scripts/publish-codinux-repo.gradle.kts")

View File

@ -0,0 +1,40 @@
package net.codinux.invoicing.pdf
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder
import org.jsoup.Jsoup
import org.jsoup.helper.W3CDom
import org.jsoup.nodes.Document
import java.io.File
import java.nio.file.FileSystems
open class OpenHtmlToPdfHtmlToPdfConverter {
open fun renderHtml(htmlFile: File, outputFile: File) =
renderHtml(htmlFile.readText(), outputFile)
open fun renderHtml(html: String, outputFile: File) {
val doc = createWellFormedHtml(html)
xhtmlToPdf(doc, outputFile)
}
protected open fun xhtmlToPdf(doc: Document, outputPdf: File) {
outputPdf.outputStream().use { output ->
val baseUri = FileSystems.getDefault().getPath("/src/main/resources")
.toUri().toString()
val builder = PdfRendererBuilder()
builder.useFastMode()
builder.toStream(output)
builder.withW3cDocument(W3CDom().fromJsoup(doc), baseUri)
builder.run()
}
}
protected open fun createWellFormedHtml(html: String): Document =
Jsoup.parse(html, Charsets.UTF_8.name()).apply {
this.outputSettings().syntax(Document.OutputSettings.Syntax.xml)
}
}

View File

@ -0,0 +1,24 @@
package net.codinux.invoicing.pdf
import java.io.InputStream
import java.net.URL
object ResourceUtil {
fun getResourceUrl(resourcePath: String): URL? =
javaClass.classLoader.getResource(resourcePath)
fun getResourceAsStream(resourcePath: String): InputStream =
javaClass.classLoader.getResourceAsStream(resourcePath)!!
fun getResourceBytes(resourcePath: String): ByteArray =
getResourceAsStream(resourcePath).use {
it.readBytes()
}
fun getResourceAsText(resourcePath: String): String =
getResourceAsStream(resourcePath).use { inputStream ->
inputStream.reader().use { it.readText() }
}
}

View File

@ -0,0 +1,32 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
the key "bySecond" into the logger context. This value will be
available to all subsequent configuration elements. -->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<root level="ALL">
<appender-ref ref="STDOUT"/>
</root>
<!-- Apache FOP will flood otherwise the log so that test run crashes -->
<logger name="org.apache.fop" level="INFO">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="org.apache.xmlgraphics.image.loader.spi.ImageImplRegistry" level="INFO">
<appender-ref ref="STDOUT"/>
</logger>
</configuration>

View File

@ -28,4 +28,6 @@ rootProject.name = "eInvoicing"
include("e-invoice-domain")
include("invoice-creator")
include("e-invoice-api")