Tuesday, December 10, 2013

Open PDF's stored in a rich text item from lotus script.

I have an application which stores PDF's as embedded files in a rich text item. I want to write some lotus script code which detach the PDF to a temporary directory and then launch the os default reader for PDF's to view the file. Ok the first part to detach the file is very easy and strait forward.

 Set rtitem=dokument.Getfirstitem("Body")
 Forall obj In rtitem.Embeddedobjects
  fileName=Environ("TEMP")+"\"+obj.Source
  Call obj.extractFile(fileName)
 End ForAll

Hm now we have the attachment in the temp directory, but how can we launch this attachment? My first guess was to use shell(fileName). But Notes quits this with an "illegal function call" error. I have tried many ways to call the shell function, but could not get it to work. So i have searched for another solution and found out, that the easiest way to workaround this problem is to use the Windows Scripting host to execute the PDF file.

  Set objShell = CreateObject("WScript.Shell")
  returnValue = objShell.Run(fileName, 3, false)

This works very well for all other file types your windows system recognize too. You can find a detailed description of the WScript.Shell function on MSDN

5 comments:

  1. If you got only one attachment in document, you can use separate Form with Auto launch set to -First attachment-
    No need for Windows-specific scripts.
    Here is an example how to open attachment after promp:
    Dim ws As New NotesUIWorkspace
    Dim ns As New NotesSession
    Dim db As NotesDatabase
    Set db = ns.CurrentDatabase
    Set coll = ws.PickListCollection(3,False,"",db.FilePath,"($docswithattachments)","Choose doc to open","Open attachment")
    If coll.Count > 0 Then
    Dim doc As NotesDocument
    Set doc = coll.GetFirstDocument
    If Not doc Is Nothing Then
    doc.Form ="OpenAttachment" 'Form with autolaunch set to First attachment
    Call ws.EditDocument(False, doc)
    End If
    End If

    ReplyDelete
  2. Thank you for this very interesting idea.

    ReplyDelete
    Replies
    1. We have succesfully used that for a while and it works well. There was a problem with Symantec virus scanner which added fields to document and saved it without asking.
      Fortunately there is fix(2641800) for that:
      http://www.symantec.com/business/support/index?page=content&pmv=print&impressions=&viewlocale=en_US&id=TECH103087

      Delete
  3. I've not tried it with a PDF, but the below code works with Excel. It does require that you know the default application to create the object with.

    Set objExcel = CreateObject( "Excel.Application" )
    objExcel.Visible = False

    objExcel.Workbooks.Open strTemplateFilename, , True

    Cheers,
    Brian

    ReplyDelete
  4. Thank you Brian for your input, but your way to open the excel sheet has one big problem, that it will not work if excel is not installed on the computer. Today many computers have installed other spreadsheet applications like Libreoffice Calc. With your approach you will get an error, but with mine or Olli's way it will work on such computes too.

    ReplyDelete

ad