rem Demonstration of using the Java Advanced Imaging API from within PeopleCode ; rem We'll use this jpeg and write some text on it ; Local string &sSourceFileName = "E:\pt846\bin\client\winx86\peoplesoft.jpg"; If Not FileExists(&sSourceFileName, %FilePath_Absolute) Then Error ("Can't find file " | &sSourceFileName); End-If; rem This is the file name for where we'll save the newly created image ; Local string &sTargetFileName = "c:\temp\new_image.jpeg"; rem The text that we'll actually write onto the image and it's location; Local string &sTextToWrite = "Grey Sparling Solutions"; Local integer &x = 5; Local integer &y = 10; Local integer &iFontSize = 12; rem A few things that we'll use below because of all of the reflection that we're doing. ; Local JavaObject &jCls = GetJavaClass("java.lang.Class"); Local JavaObject &jImageIOClass = &jCls.forName("javax.imageio.ImageIO"); Local JavaObject &jIOFileClass = &jCls.forName("java.io.File"); Local JavaObject &jRenderedImageClass = &jCls.forName("java.awt.image.RenderedImage"); Local JavaObject &jStringClass = &jCls.forName("java.lang.String"); Local JavaObject &jInt = GetJavaClass("java.lang.Integer").TYPE; rem This class has a lot of static helper methods that are useful when working with images ; Local JavaObject &jImageIO = GetJavaClass("javax.imageio.ImageIO"); rem Use in memory buffering instead of disk based buffering; &jImageIO.setUseCache( False); rem This triggers the stupid "more than 1 overload matches" PeopleTools error, so we have to; rem do it the hard way. ; rem Local JavaObject &jBufImage = &jImageIO.read(CreateJavaObject("java.io.File", &sSourceFileName)); Local JavaObject &jReadArgTypes = CreateJavaObject("java.lang.Class[]", &jIOFileClass); Local JavaObject &jReadMethod = &jImageIOClass.getDeclaredMethod("read", &jReadArgTypes); Local JavaObject &jReadArgs = CreateJavaObject("java.lang.Object[]", CreateJavaObject("java.io.File", &sSourceFileName)); Local JavaObject &jBufImage = &jReadMethod.invoke(&jImageIO, &jReadArgs); If &jBufImage = Null Then Error (&sSourceFileName | " is not a recognized image file type"); End-If; rem Unfortunately, the PeopleCode engine now believes that &jBufImage is of ; rem type java.lang.Object, because that's what the invoke method returns. ; rem So, we can't invoke any of it's own methods directly from PeopleCode ; rem Local JavaObject &jGraphics = &jBufImage.createGraphics(); Local JavaObject &jGraphics = &jBufImage.getClass().getDeclaredMethod("createGraphics", Null).invoke(&jBufImage, Null); Local JavaObject &jFontClass = GetJavaClass("java.awt.Font"); Local integer &iStyle = &jFontClass.BOLD + &jFontClass.ITALIC; Local JavaObject &jFont = CreateJavaObject("java.awt.Font", "Dialog", &iStyle, &iFontSize); rem Continued ripple effect from being forced into the reflection side of the world; rem &jGraphics.setFont(&jFont); &jGraphics.getClass().getDeclaredMethod("setFont", CreateJavaObject("java.lang.Class[]", &jFont.getClass())).invoke(&jGraphics, CreateJavaObject("java.lang.Object[]", &jFont)); rem &jGraphics.setColor(GetJavaClass("java.awt.Color").RED); Local JavaObject &jColor = GetJavaClass("java.awt.Color").RED; &jGraphics.getClass().getDeclaredMethod("setColor", CreateJavaObject("java.lang.Class[]", &jColor.getClass())).invoke(&jGraphics, CreateJavaObject("java.lang.Object[]", &jColor)); rem &jGraphics.drawString(&sTextToWrite, &x, &y); Local JavaObject &jDrawStringParms = CreateJavaObject("java.lang.Class[]", &jStringClass, &jInt, &jInt); &jGraphics.getClass().getDeclaredMethod("drawString", &jDrawStringParms).invoke(&jGraphics, CreateJavaObject("java.lang.Object[]", &sTextToWrite, &x, &y)); rem &jImageIO.write(&jBufImage, "jpeg", CreateJavaObject("java.io.File", &sTargetFileName)); Local JavaObject &jWriteArgTypes = CreateJavaObject("java.lang.Class[]", &jRenderedImageClass, &jStringClass, &jIOFileClass); Local JavaObject &jWriteMethod = &jImageIOClass.getDeclaredMethod("write", &jWriteArgTypes); &jWriteMethod.invoke(&jImageIO, CreateJavaObject("java.lang.Object[]", &jBufImage, "jpeg", CreateJavaObject("java.io.File", &sTargetFileName)));