Converting Lotus Notes Domino Web pages to PDF files with a Java agent

SearchDomino.com Hall of Famer Michael Marcavage explains how to create a Java agent that lets Lotus Notes Domino users convert Web pages to PDF documents with the push of a Web form button.

Want to provide your Lotus Notes Domino users with the ability to convert Web pages to PDF documents on the fly?

Place the code below into a Java agent.

More related information from SearchDomino.com:
Creating Microsoft Word documents from Lotus Notes

Creating PDF documents from Lotus Notes

Converting Web pages to images using Java

Java for Lotus Notes and Domino advice

Java Reference Center

Called via a JavaScript button on a Web form, this agent parses the URL used to call the agent and returns the key that it is looking for. It then copies the document to a Lotus Notes Domino database that is wide open and calls the document via a URL. Finally, it converts it to a PDF file.

You will need to create a shareable Web folder so that the PDF file has somewhere to land. From there, you just need to call the PDF document to present it to the Lotus Notes user.

You also need to buy a Jar file from http://pd4ml.com/ and add it to your Java agent to make this work.

There may be better methods to accomplish this task, but this is a quick-and-dirty technique I successfully implemented in a rush situation.

Here is the code that resides in the Javascript Button:

var getDBPath = "/" + form.DBPath.value; 
var varURL = getDBPath + '/webCreatePDF?
OpenAgent&pQuoteNumber=' + 
form.quoteNumber.value;

window.open(varURL, '_blank', "menubar=yes,
width=900,height=600, scrollbars=yes,
resizable=yes, top=4, left=4");

Here is the code for the Java agent:

import lotus.domino.*;
import java.awt.Dimension;
import java.awt.Insets;
import java.io.File;
import java.io.*;
import java.net.*;
import java.util.*;

import org.zefer.pd4ml.PD4Constants;
import org.zefer.pd4ml.PD4ML;
import org.zefer.pd4ml.PD4PageMark;

public class JavaAgent extends AgentBase 
    {
 public void NotesMain() 
        {
          lotus.domino.Database lnDB = null;
          lotus.domino.Document lnDoc = null;
          Document doc = null;
          Database dbDump = null;
          String strURLValue = null;
          String strGetQuoteNumber = null;

  try
               {
Session session = getSession();
AgentContext agentContext = 
session.getAgentContext();
lnDB = agentContext.getCurrentDatabase();
doc = agentContext.getDocumentContext( );
dbDump = session.getDatabase
(lnDB.getServer(), "Sales\qaSPDump.nsf");
                 
//Parse URL from web form
                 strURLValue = 
doc.getItemValueString("Query_String_Decoded");
                 Hashtable ht = 
parseQueryString(strURLValue);
                 strGetQuoteNumber = 
(String) ht.get( "pQuoteNumber" );

//Get Hook on Doc
                 View lnView = lnDB.getView
("wLKQuoteNumber");
                 lnDoc = lnView.getDocumentByKey
(strGetQuoteNumber, false);
                 lnDoc.copyToDatabase(dbDump);

                 String htmlFileName = 
"http://<Your Domain>/Sales/qaSPDump.nsf/wPDF/" 
+ strGetQuoteNumber + "?OpenDocument";
File pdfFile = new File("<server name or 
IP>\Temp\" + strGetQuoteNumber + ".pdf");
 Converter converter = new Converter();
converter.generatePDF(htmlFileName, pdfFile, 
PD4Constants.A4, null, null);

               } catch(Exception e) 
                           {
  e.printStackTrace();
                   }
        }

public static Hashtable 
parseQueryString(String queryString) {
  StringTokenizer tokens = 
new StringTokenizer(queryString, "&");
  Hashtable params = new Hashtable();

  while (tokens.hasMoreTokens()) 
             {
               String token = tokens.nextToken();
               int equalIdx = token.indexOf('=');
               if (equalIdx != -1 && !token.
equalsIgnoreCase("OpenAgent")) 
                  {
                    String name = token.
substring(0, equalIdx);
                    String value = token.
substring(equalIdx + 1);
                    params.put(name, value);
                   }
              }
return params;
}

 }


//Converter Class
import java.awt.Dimension;
import java.awt.Insets;
import java.io.File;

import org.zefer.pd4ml.PD4Constants;
import org.zefer.pd4ml.PD4ML;
import org.zefer.pd4ml.PD4PageMark;

public class Converter
{
public void generatePDF(String inputHTMLFileName, 
File outputPDFFile, Dimension format, 
String fontsDir, String headerBody) throws Exception 
    {
java.io.FileOutputStream fos = new 
java.io.FileOutputStream(outputPDFFile);
PD4ML pd4ml = new PD4ML();
pd4ml.setPageInsets(new Insets(20, 10, 10, 10));
pd4ml.setHtmlWidth(950);
//pd4ml.setPageSize(pd4ml.changePage
Orientation(format));
          pd4ml.setPageSize(format);

if (fontsDir != null && fontsDir.length() > 0)
             {
pd4ml.useTTF( fontsDir, true );
     }
     
if (headerBody != null && 
headerBody.length() > 0 )
             {
PD4PageMark header = new PD4PageMark();
header.setAreaHeight( -1 ); 
header.setHtmlTemplate( headerBody );
pd4ml.setPageHeader( header );
     }
     
pd4ml.enableDebugInfo();
//pd4ml.render("file:" + inputHTMLFileName, fos);
          pd4ml.render("url:" + inputHTMLFileName, fos);
 }
}

Do you have comments on this tip? Let us know.

This tip was submitted to the SearchDomino.com tip library by member Michael Marcavage. Please let others know how useful it is via the rating scale below. Do you have a useful Lotus Notes, Domino, Workplace or WebSphere tip or code snippet to share? Submit it to our monthly tip contest and you could win a prize.

This was first published in August 2007

Dig deeper on Java for Lotus Notes Domino

0 comments

Oldest 

Forgot Password?

No problem! Submit your e-mail address below. We'll send you an email containing your password.

Your password has been sent to:

SearchWinIT

Search400

  • iSeries tutorials

    Search400.com's tutorials provide in-depth information on the iSeries. Our iSeries tutorials address areas you need to know about...

  • V6R1 upgrade planning checklist

    When upgrading to V6R1, make sure your software will be supported, your programs will function and the correct PTFs have been ...

  • Connecting multiple iSeries systems through DDM

    Working with databases over multiple iSeries systems can be simple when remotely connecting logical partitions with distributed ...

SearchEnterpriseLinux

SearchVirtualDataCentre.co.uk

Close