Showing posts with label PDF. Show all posts
Showing posts with label PDF. Show all posts

Wednesday, April 02, 2025

Generating PDF Documents in Domino Using PD4ML Java Library

Generating PDF documents from web content or structured data is a common requirement in many applications. When working with HCL Domino, we often need to create PDFs from HTML templates, Notes documents, or dynamically generated content. In this article, I'll walk you through using the PD4ML Java library to generate PDFs within a Domino Java Agent.

Why Use PD4ML?

PD4ML is a powerful Java library that allows you to convert HTML and CSS into high-quality PDF documents. It supports:

  • CSS styling
  • Page breaks and headers/footers
  • Embedded images
  • Table of contents and bookmarks
  • Various output formats (A4, Letter, etc.)

This makes it a great choice for generating invoices, reports, or any structured documents from Domino applications.

Setting Up PD4ML in Domino

To use PD4ML in your Domino environment, follow these steps:

1. Download PD4ML

Get the PD4ML JAR from pd4ml.com. You can use the free or commercial version, depending on your needs.

2. Add PD4ML to Your Domino Project

  1. Place the PD4ML JAR file in the jvm/lib/ext directory of your Domino server (if you want it available for all agents) or within your NSF under WEB-INF/lib (if used in an XPages app).
  2. If using a Java agent, attach the JAR to the agent's Build Path (I usually create a dedicated Java library for external JARs).

3. Write a Java Agent to Generate a PDF

Below is just a snippet to get an idea what you need to do in your Domino Java Agent. The example takes an HTML string and converts it into a PDF:

PD4ML pd4ml = new PD4ML();

String html = "TEST <b>Hello, World!</b>";
ByteArrayInputStream bais = new ByteArrayInputStream(html.getBytes());

// read and parse HTML
pd4ml.readHTML(bais);

File pdf = File.createTempFile("result", ".pdf");
FileOutputStream fos = new FileOutputStream(pdf);

// render and write the result as PDF
pd4ml.writePDF(fos);

PD4ML and HCL Notes/Domino

PD4ML claims they provide support for converting HCL Notes documents into PDFs (I have never checked it though), making it an ideal solution for Domino applications.

Using PD4ML in HCL Domino makes PDF generation straightforward. Whether you need to create reports, invoices, or structured documents, this Java library is a flexible and efficient solution. Try it out in your Domino projects and let me know if you run into any issues!

I have previously used iText and Apache PDFBox for generating PDFs in Domino, as well as various external tools that convert HTML files into PDFs. However, I found PD4ML to be the most user-friendly solution due to its seamless integration with HTML and CSS, built-in support for page formatting, and its ability to handle embedded images and styles with minimal effort.


What tools or libraries do you use in your Domino applications to build PDF files?

Monday, December 28, 2009

DXL + XSL -> XFDF -> PDF

We started to use XFDF approach when create PDF file. I have to say that FDF is nothing, XFDF is power :). XFDF approach much easier to use and to debug.

For debugging I used Firefox plug-in XSL Results it works good.

So what steps you have to do if you want to use this approach.

  1. get NotesDocumentCollection of document you want to export to PDF
  2. export it using NotesDXLExporter to dxl file
  3. get NotesXSLTransformer and use it :)
  4. check result

you may have problem if you are not familiar with XSL. There are many good sites where you can read about it.

Here is an example on openntf

Here is my first example of XSL for generation XFDF file. It can help to somebody.





Related articles about creating PDF files

Thursday, December 24, 2009

Use XFDF approach insted of FDF when create PDF file

My fellow just shown me that my approach that I posted on my blog couple weeks ago
how to create PDF using FDF is old one :)
It is shame for me :) that I did not find XFDF approach.

Anywhere from now I would recommend to use XFDF approach when you want to generate PDF file. The idea is similar to FDF but done via real XML. It is much easy to work with it and it is readable :)

Here is simple XFDF file, it demonstrate how it looks.



As you see it is really simple XML file and it will use http://ip/pdf_form.pdf file to show data from XFDF file.

Now I am looking for 'opposite way'. Let's say I'm opened PDF file using XFDF approach and add some values to this PDF file. How I can get export this data back then to XFDF file? Does anybody have such experience?

Related articles about creating PDF files

Sunday, December 13, 2009

Create PDF / FDF in Lotus Notes using LS

I had task where I should create PDF file from template and fill fields by values from documents
So what did I do?

I spoke with my colleagues :-) they recommended to use FDF Toolkit For Windows, instead of iText approach that I used before, and I have to say that it is very cool approach, it is much better at least for me. Instead of generation new PDF file we just export data to FDF file and link it with PDF template and that's all, so our FDF will show data using PDF form/template. -> No Java required and now no non-supported libraries.

Here is an instruction how to do this:
  • register FDFACX.DLL (in order to do that, I copied FdfTk.dll and FDFACX.DLL to windows\system32, but I believe there is better way)
 regsvr32 C:\WINDOWS\system32\FDFACX.dll  
  • example of code now (it is from Adobe)

Using the FDF tooklit in LotusScript

 Sub Initialize  
 '  
 ' Set up for using the FDF Toolkit for ActiveX  
 '  
 Dim FdfAcX As Variant  
 Dim outputFDF As Variant  
 Dim sPdfFileName As String, sFdfFileName As String, sFilePath As String  
 Set FdfAcX = CreateObject("FdfApp.FdfApp")  
 Set outputFDF = FdfAcX.FDFCreate()  
 '  
 ' % REM  
 '  
 ' Change these paths to reflect your server environment  
 ' Ideally, you could use a Lotus Notes profile document to store this  
 ' information.  
 '  
 ' Below are the three options for storing the PDF that was discussed in  
 ' the documentation for this application.  
 '  
 ' Option 1 : UNC Directory Share  
 ' This option oddly asks if you would like to save on close.  
 '  
 ' sPdfFileName = "\\Mage\domdata\domino\html\pdf\panarama.pdf"  
 '  
 ' Option 2 : Store in a Lotus Notes Page element  
 '  
 sPdfFileName = "http://mage/pdf/panarama.nsf/PDFs/$file/panarama.pdf"  
 '  
 ' Option 3 : Store in the Domino HTML directory  
 '  
 ' REM %  
 '  
 ' sPdfFileName = "http://mage/pdf/panarama.pdf"  
 sFilePath = "d:\domdata\domino\html\pdf\tmp\"  
 '  
 ' Set up for getting Lotus Notes information  
 '  
 Dim session As New NotesSession  
 Dim contextDoc As NotesDocument  
 Dim dateTime As NotesDateTime  
 Dim tempNumber As Single  
 Dim rounded As Integer  
 Dim fileName As String  
 Set contextDoc = session.documentContext  
 '  
 8 Integrating Adobe Acrobat FDF  
 with Lotus Domino  
 ' This will create a random number between 0 and 100.  
 ' The number will give  
 ' us a good chance of not temporarily having the same file name in the tmp  
 ' directory at the same time. The file will briefly be in the tmp  
 ' directory,  
 ' attached to the Notes document and then deleted.  
 '  
 Randomize  
 temp = Rnd  
 rounded = Round((temp * 100), 0)  
 fileName = Cstr(rounded)  
 sFdfFileName = sFilePath & fileName & ".fdf"  
 '  
 ' FDFSetValue will set the value you pass it. See page 139 of the  
 ' FDF Toolkit Overview and Reference.  
 '  
 outputFDF.FDFSetValue "FirstName", contextDoc.FirstName(0), False  
 outputFDF.FDFSetValue "MidInit", contextDoc.MidInit(0), False  
 outputFDF.FDFSetValue "LastName", contextDoc.LastName(0), False  
 '  
 ' Get the value of the date fields. The DateOnly property  
 ' returns a string.  
 '  
 Set dateTime = New NotesDateTime( contextDoc.HireDate(0) )  
 outputFDF.FDFSetValue "HireDate", dateTime.DateOnly, False  
 Set dateTime = New NotesDateTime( contextDoc.ModDate(0) )  
 outputFDF.FDFSetValue "ModDate", dateTime.DateOnly, False  
 '  
 outputFDF.FDFSetValue "Address1", contextDoc.Address1(0), False  
 outputFDF.FDFSetValue "Address2", contextDoc.Address2(0), False  
 outputFDF.FDFSetValue "City", contextDoc.City(0), False  
 outputFDF.FDFSetValue "State", contextDoc.State(0), False  
 outputFDF.FDFSetValue "ZipCode", contextDoc.ZipCode(0), False  
 outputFDF.FDFSetValue "Country", contextDoc.Country(0), False  
 '  
 outputFDF.FDFSetValue "MAddress1", contextDoc.MAddress1(0), False  
 outputFDF.FDFSetValue "MAddress2", contextDoc.MAddress2(0), False  
 outputFDF.FDFSetValue "MCity", contextDoc.MCity(0), False  
 outputFDF.FDFSetValue "MState", contextDoc.MState(0), False  
 outputFDF.FDFSetValue "MZipCode", contextDoc.MZipCode(0), False  
 '  
 outputFDF.FDFSetValue "HomePhone", contextDoc.HomePhone(0), False  
 outputFDF.FDFSetValue "WorkPhone", contextDoc.WorkPhone(0), False  
 '  
 outputFDF.FDFSetValue "Emer1Contact", contextDoc.Emer1Contact(0), False  
 outputFDF.FDFSetValue "Emer1Phone", contextDoc.Emer1Phone(0), False  
 outputFDF.FDFSetValue "Emer2Contact", contextDoc.Emer2Contact(0), False  
 outputFDF.FDFSetValue "Emer2Phone", contextDoc.Emer2Phone(0), False  
 '  
 ' Tell it which file we're writing to and do a save.  
 '  
 outputFDF.FDFSetFile sPdfFileName  
 outputFDF.FDFSaveToFile sFdfFileName  
 '  
 ' Always close your open FDF files.  
 '  
 outputFDF.FDFClose  
 ADOBE FDF TOOLKIT  
 User Guide  
 9  
 '  
 ' This will attach the FDF file we just closed to our Notes document  
 ' and then delete it from the tmp directory.  
 '  
 Call MoveFdfToAttachment(contextDoc, sFdfFileName)  
 End Sub  
 Public Function MoveFdfToAttachment(doc As NotesDocument, fileName As  
 String) As Integer  
 '// move each attachment to a rich text field.  
 Dim attachItem As New NotesRichTextItem(doc, "fdfAttachment")  
 Dim attachObj As notesEmbeddedObject, newObjName As String  
 Call attachItem.EmbedObject(EMBED_ATTACHMENT, "", fileName, "")  
 Kill fileName  
 MoveFdfToAttachment = True  
 End Function  

Related articles about creating PDF files

Tuesday, May 06, 2008

How to create PDF from Lotus Notes

I want to show you one of the way how we can create PDF documents from Lotus Notes. I propose to use this package com.lowagie.text
You can download iText®, a JAVA-PDF library
Read more here Generate PDF files from Java applications dynamically

Here is an example that create PDF document.
import lotus.domino.*;
import java.io.FileOutputStream;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Chapter;
import com.lowagie.text.Font;
import com.lowagie.text.List;
import com.lowagie.text.Table;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfWriter;

public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
//create document's object
Document document = new Document();
try {
//create a document
PdfWriter.getInstance(document, new FileOutputStream("c:\\CreatePDFInlotus.pdf"));
//open doc for r/w
document.open();
//add text
document.add(new Paragraph ("Create PDF in Lotus "));
//if error
} catch (DocumentException de) {
System.err.println(de.getMessage()); }

document.close();

} catch(Exception e) {
e.printStackTrace();
}
}
}
Download Project: convert_2_pdf example

Related articles about creating PDF files