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:
Option Public
Option Declare
Uselsx "*javacon"
Use "ThumbNail"
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\"
maxX = 100
maxY = 100
thumbnailPrefix = "t_"
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)
Forall fileName In fileList
fileType = Lcase(Strrightback(Cstr(fileName), "."))
If (fileType = "jpeg" Or fileType = "jpg" Or fileType = "gif") _
And (Left$(fileName, 2) <> thumbnailPrefix) Then
fileNameExcludingType = Strleft(fileName, ".")
Set notesEmbeddedObject = curDoc.GetAttachment( fileName )
sourceFilePath = workingDir & fileName
thumbFilePath = workingDir & thumbnailPrefix & fileNameExcludingType & "." & fileType
Call notesEmbeddedObject.ExtractFile(workingDir & fileName)
returnCode = _
thumbnailObject.ThumbnailThis(sourceFilePath, ThumbFilePath , maxX, maxY)
If returnCode = "OK" Then
Set notesEmbeddedObject = _
bodyItem.EmbedObject(EMBED_ATTACHMENT, "",thumbFilePath)
Call curDoc.Save(True, True, True)
End If
Kill sourceFilePath
Kill thumbFilePath
End If
End Forall
End If
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>