Oprettelse af thumbnail-billeder fra LotusScript
Man kan oprette thumbnails i LotusScript ved brug af LS2J i Notes/Domino R6
I denne artikel viser jeg, hvordan man kan bruge LS2J, så det er muligt at lave thumbnail-billeder fra LotusScript.

LotusScript har ikke indbygget nogen metoder til at manipulere med billeder, men det findes der i Java. LS2J (som er en tilgængeligt i Notes/Domino på Windows platformene) gør det muligt at eksponere Java-funktionalitet så den kan bruges i LotusScript.
Til denne artikel har jeg skrevet en agent som checker et dokument når det gemmes, og hvis der er nogen billeder i filbilag, så opretter agenten thumbnail-billeder af disse og hæfter dem på.
Man kan på samme måde lave en agent der virker i Lotus Notes-klienten (mit eksempel er til web). Den centrale del af agenten er linien der kalder metoden der opretter en thumbnail. Metoden (thumbnailObject.ThumbnailThis) modtager fire parametre:
• Filnavn på det billede der skal danne udgangspunkt for thumbnail-billedet.
• Filnavn som thumbnail-billedet skal have.
• Max-bredde på thumbnail-billedet.
• max-højde på thumbnail-billedet.

For at demonstrere koden har jeg oprettet en web-form. Den har et Body-felt og en upload-control, som tillader at web-brugeren uploader et billede. På formen er der i WebQuerySave følgende kommando: @Command([ToolsRunMacro]; "SaveWeb")

Dette er agenten:

'Options Option Public Option Declare Uselsx "*javacon" 'Which lets you use Java from Lotusscript Use "ThumbNail" ' A Java library that holds a function to do Thumbnailing 'Initialize Sub Initialize Dim session As New NotesSession Dim CurDB As NotesDatabase Dim curDoc As NotesDocument Dim fileList As Variant Dim expression As String, serverName As String, thumbnailPrefix As String Dim fileType As String, fileNameExcludingType As String Dim sourceFilePath As String, thumbFilePath As String Dim notesEmbeddedObject As NotesEmbeddedObject Dim bodyItem As NotesRichTextItem Dim js As JAVASESSION Dim thumbnailClass As JAVACLASS Dim thumbnailObject As JavaObject Set js = New JAVASESSION Set thumbnailClass = js.GetClass("ThumbNail") Set thumbnailObject = thumbnailClass.CreateObject Dim workingDir As String Dim maxX As Integer, maxY As Integer Dim returnCode As String workingDir = "c:\temp\" 'Hard coding - you should change this maxX = 100 'Maximum width of thumbnail in pixels maxY = 100 'Maximum height of thumbnail in pixels thumbnailPrefix = "t_" 'The prefix we will use for thumbnails Set curDb = session.CurrentDatabase servername = curDb.Server On Error Goto ErrorHandling expression = "@AttachmentNames" Set curDoc = session.DocumentContext Set bodyItem = curDoc.GetFirstItem("Body") If curDoc.HasEmbedded Then fileList = Evaluate(expression, curDoc) 'Contains an array of attachmentnames Forall fileName In fileList fileType = Lcase(Strrightback(Cstr(fileName), ".")) If (fileType = "jpeg" Or fileType = "jpg" Or fileType = "gif") _ And (Left$(fileName, 2) <> thumbnailPrefix) Then 'The code only works with these image types, and we exclude old thumbnails fileNameExcludingType = Strleft(fileName, ".") Set notesEmbeddedObject = curDoc.GetAttachment( fileName ) 'We get a handle to the file that is to be the source of a thumbnail sourceFilePath = workingDir & fileName 'The file name of the file - on disk thumbFilePath = workingDir & thumbnailPrefix & fileNameExcludingType & "." & fileType 'The file name for the thumbnail Call notesEmbeddedObject.ExtractFile(workingDir & fileName) 'Writing the source file to disk returnCode = _ thumbnailObject.ThumbnailThis(sourceFilePath, ThumbFilePath , maxX, maxY) 'Calling the thumbnailfunction If returnCode = "OK" Then 'If thumbnail creation was OK Set notesEmbeddedObject = _ bodyItem.EmbedObject(EMBED_ATTACHMENT, "",thumbFilePath) 'Attaching the thumbnail Call curDoc.Save(True, True, True) 'We only save if we modify the document End If 'If returnCode = "OK" Then Kill sourceFilePath 'Deleting temporary files Kill thumbFilePath End If 'If fileType = "jpeg" Or fileType = "jpg" Or fileType = "gif" Then End Forall 'Forall fileName In fileList End If 'If curDoc.HasEmbedded Then Exit Sub ErrorHandling: Print " Error (" & Err & ") - line: " & Erl Exit Sub End Sub



Nedenfor er det Java bibliotek som gør det muligt at oprette thumbnails - når vi foretager kaldet thumbnailObject.ThumbnailThis ovenfor.
Man opretter et Java bibliotek i Domino designer ved at åbne Shared Code-> Script Libraries, klikker New Java Library, og så fjernes de hjælpe-kodelinier som klienten selv sætter ind. Og så paster man nedenstående kode ind. Gem biblioteket og kald det "ThumbNail".

import com.sun.image.codec.jpeg.*; import java.awt.*; import java.awt.image.*; import java.io.*; import java.util.*; public class ThumbNail { public String thumbNailThis(String inputFilePath, String outputFilePath, int maxX, int maxY) { try { int thumbHeight; int thumbWidth; // load source image file Image image = Toolkit.getDefaultToolkit().getImage(inputFilePath); MediaTracker mediaTracker = new MediaTracker(new Container()); mediaTracker.addImage(image, 0); mediaTracker.waitForAll(); int imageWidth = image.getWidth(null); int imageHeight = image.getHeight(null); double imageRatio = (double)imageWidth / (double)imageHeight; if (imageRatio<1) { thumbHeight = maxY; thumbWidth = (int)(maxY*imageRatio); } else { thumbWidth = maxX; thumbHeight = (int)(maxX/imageRatio); } resizeImage(image,outputFilePath,thumbWidth,thumbHeight,100); } catch(Exception e) { e.printStackTrace(); } return "OK"; } private void resizeImage(Image pImage, String pstFileName, int piWidth, int piHeight, int piQuality) { try { // draw original image to thumbnail image object and // scale it to the new size on-the-fly BufferedImage thumbImage = new BufferedImage(piWidth, piHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = thumbImage.createGraphics(); graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, _ RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2D.drawImage(pImage, 0, 0, piWidth, piHeight, null); // save thumbnail image to OUTFILE BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(pstFileName)); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(thumbImage); param.setQuality((float)piQuality / 100.0f, false); encoder.setJPEGEncodeParam(param); encoder.encode(thumbImage); out.close(); } catch(Exception e) { e.printStackTrace(); } } }


Jeg er blevet inspireret kraftigt til ovenstående løsning af Min-Chi Huang, der har demonstreret thumbnailing-kode på openntf.org (link: http://www.openntf.org) i projektet Open Notes Picture Database.
Jeg har tidligere brugt LS2J til at pakke zip-funktionalitet ind. Så man fra LotusScript kan oprette zip-filer (Zip from LotusScript in Notes/Domino 6).
Koden i denne artikel er blevet konverteret til HTML ved hjælp af ls2html,
stillet til rådighed af Julian Robichaux fra nsftools.com.
Jeg har brugt den udgave der findes hos Joelitton.net
Convergens: +45 7020 3820

Kontaktinformation

...