B4J Question HTML to PDF

Tim Chapman

Active Member
Licensed User
Longtime User
I need to print an HTML web page to a pdf file with no human involvement. Completely in code. I spent a great deal of trying with the posts I found on the the forum with no luck.
Perplexity AI gave me the code below to do so but I can't even get to the first step which is finding the jar files. Any have some ideas of how to proceed or a better approach?

Code:
To implement the ConvertHTMLToPDF method in your B4J application, you'll need to add a Java HTML-to-PDF conversion library to your project. Here's a complete implementation using the Flying Saucer library with iText:
Adding Required Libraries

First, add these JAR files to your project:

text
#AdditionalJar: core-renderer.jar
#AdditionalJar: itext.jar
#AdditionalJar: xml-apis-xerces.jar

Method Implementation

Add this method to your code:

text
Sub ConvertHTMLToPDF(htmlFilePath As String, pdfFilePath As String) As Boolean
  Try
    ' Create Java objects
    Dim htmlFile As JavaObject
    htmlFile.InitializeNewInstance("java.io.File", Array(htmlFilePath))
    
    Dim pdfFile As JavaObject
    pdfFile.InitializeNewInstance("java.io.File", Array(pdfFilePath))
    
    ' Set up the renderer
    Dim renderer As JavaObject
    renderer.InitializeNewInstance("org.xhtmlrenderer.pdf.ITextRenderer", Null)
    
    ' Get the URI from the HTML file
    Dim uri As JavaObject = htmlFile.RunMethod("toURI", Null)
    Dim url As String = uri.RunMethod("toString", Null)
    
    ' Set document
    renderer.RunMethod("setDocument", Array(url))
    
    ' Create the PDF output stream
    Dim os As JavaObject
    os.InitializeNewInstance("java.io.FileOutputStream", Array(pdfFile))
    
    ' Layout and create PDF
    renderer.RunMethod("layout", Null)
    renderer.RunMethod("createPDF", Array(os))
    os.RunMethod("close", Null)
    
    LogAction("HTML successfully converted to PDF: " & pdfFilePath)
    Return True
  Catch
    LogAction("Error converting HTML to PDF: " & LastException.Message)
    Log("Error converting HTML to PDF: " & LastException.Message)
    Return False
  End Try
End Sub

Alternative Using iText Directly

If you prefer a simpler approach with just iText (for basic conversion):

text
Sub ConvertHTMLToPDF(htmlFilePath As String, pdfFilePath As String) As Boolean
  Try
    ' Read HTML content
    Dim htmlContent As String = File.ReadString(File.GetFileParent(htmlFilePath), File.GetName(htmlFilePath))
    
    ' Create document and writer
    Dim document As JavaObject
    document.InitializeNewInstance("com.itextpdf.text.Document", Null)
    
    Dim outputStream As JavaObject
    outputStream.InitializeNewInstance("java.io.FileOutputStream", Array(pdfFilePath))
    
    Dim writer As JavaObject = document.RunMethodJO("getInstance", Array(document, outputStream))
    
    document.RunMethod("open", Null)
    
    Dim htmlWorker As JavaObject
    htmlWorker.InitializeNewInstance("com.itextpdf.text.html.simpleparser.HTMLWorker", Array(document))
    
    Dim stringReader As JavaObject
    stringReader.InitializeNewInstance("java.io.StringReader", Array(htmlContent))
    
    htmlWorker.RunMethod("parse", Array(stringReader))
    document.RunMethod("close", Null)
    
    LogAction("HTML successfully converted to PDF: " & pdfFilePath)
    Return True
  Catch
    LogAction("Error converting HTML to PDF: " & LastException.Message)
    Log("Error converting HTML to PDF: " & LastException.Message)
    Return False
  End Try
End Sub

Usage in Your Print Function

Update your print function to use this conversion method:

text
Sub PrintInvoice(filePath As String)
  Try
    Dim pdfFile As String = filePath.Replace(".html", ".pdf")
    If ConvertHTMLToPDF(filePath, pdfFile) Then
      Dim desktop As JavaObject
      desktop.InitializeStatic("java.awt.Desktop")
      Dim dt As JavaObject = desktop.RunMethod("getDesktop", Null)
      Dim fileObj As JavaObject
      fileObj.InitializeNewInstance("java.io.File", Array(pdfFile))
      dt.RunMethod("print", Array(fileObj))
    End If
  Catch
    Log("Printing error: " & LastException)
  End Try
End Sub

This implementation should resolve your issue by converting HTML invoices to PDF before printing them, avoiding the "No application is associated with the specified file" error.
 

DonManfred

Expert
Licensed User
Longtime User
Upvote 0

Tim Chapman

Active Member
Licensed User
Longtime User
I got this to work. Code is attached in zip file.
The jar files must be the versions shown in the code.
They are all here for you to download. www.arrowantennas.com/jarfiles.zip

HTML must be XHTML compliant.

An example of the XHTML compliant HTML is also attached in Invoice 2228.zip.
 

Attachments

  • HTML2PDF.zip
    2.5 KB · Views: 34
  • Invoice 2228.zip
    1.6 KB · Views: 38
Upvote 0
Solution
Top