2 Replies Latest reply on Jul 29, 2009 6:19 AM by Brent Lamborn

    detecting Acrobat Reader

    Brent Lamborn

      I'm detecting Acrobat Reader in Flex using ExternalInterface and Javascript. Is there a better ( more reliable) way? I'd think flash player would already know this info?

        • 1. Re: detecting Acrobat Reader
          EgorKDie

          If you are running in AIR (Doesn't sound like it if you are using ExternalInterface), you can use,

           

          HTML.pdfCapability

           

          to determine the Reader status.

           

          There is no particularly nice way of doing this from the Flash Player, so you may be out of luck...

           

          As an aside, how are you currently doing this?

          • 2. Re: detecting Acrobat Reader
            Brent Lamborn Level 2

            Nope I'm not using AIR, it's a browser app.  I do it by including this JS in my HTML wrapper:

             

            // initialize a variable to test for JavaScript 1.1.
            // which is necessary for the window.location.replace method
            var javascriptVersion1_1 = false;
            
            // initialize global variables
            var detectableWithVB = false;
            var pluginFound = false;
             
             
            function goURL(daURL) {
                 // if the browser can do it, use replace to preserve back button
                 if(javascriptVersion1_1) {
                      window.location.replace(daURL);
                 } else {
                      window.location = daURL;
                 }
                 return;
            }
             
            function redirectCheck(pluginFound, redirectURL, redirectIfFound) {
                 // check for redirection
                 if( redirectURL && ((pluginFound && redirectIfFound) || 
                      (!pluginFound && !redirectIfFound)) ) {
                      // go away
                      goURL(redirectURL);
                      return pluginFound;
                 } else {
                      // stay here and return result of plugin detection
                      return pluginFound;
                 }        
            }
             
            function canDetectPlugins() {
                 if( detectableWithVB || (navigator.plugins && navigator.plugins.length > 0) ) {
                      return true;
                 } else {
                      return false;
                 }
            }
             
            function detectPDF(redirectURL, redirectIfFound) {
                 pluginFound = detectPlugin('Adobe','Acrobat'); 
                 // if not found, try to detect with VisualBasic
                 if(!pluginFound && detectableWithVB) {
                      pluginFound = detectActiveXControl('PDF.PdfCtrl.5');
                 }
                 // check for redirection
                 return redirectCheck(pluginFound, redirectURL, redirectIfFound);
            }
             
            function detectFlash(redirectURL, redirectIfFound) {
                 pluginFound = detectPlugin('Shockwave','Flash'); 
                 // if not found, try to detect with VisualBasic
                 if(!pluginFound && detectableWithVB) {
                      pluginFound = detectActiveXControl('ShockwaveFlash.ShockwaveFlash.1');
                 }
                 // check for redirection
                 return redirectCheck(pluginFound, redirectURL, redirectIfFound);
            }
             
            function detectDirector(redirectURL, redirectIfFound) { 
                 pluginFound = detectPlugin('Shockwave','Director'); 
                 // if not found, try to detect with VisualBasic
                 if(!pluginFound && detectableWithVB) {
                      pluginFound = detectActiveXControl('SWCtl.SWCtl.1');
                 }
                 // check for redirection
                 return redirectCheck(pluginFound, redirectURL, redirectIfFound);
            }
             
            function detectQuickTime(redirectURL, redirectIfFound) {
                 pluginFound = detectPlugin('QuickTime');
                 // if not found, try to detect with VisualBasic
                 if(!pluginFound && detectableWithVB) {
                      pluginFound = detectQuickTimeActiveXControl();
                 }
                 return redirectCheck(pluginFound, redirectURL, redirectIfFound);
            }
             
            function detectReal(redirectURL, redirectIfFound) {
                 pluginFound = detectPlugin('RealPlayer');
                 // if not found, try to detect with VisualBasic
                 if(!pluginFound && detectableWithVB) {
                      pluginFound = (detectActiveXControl('rmocx.RealPlayer G2 Control') ||
                                        detectActiveXControl('RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)') ||
                                        detectActiveXControl('RealVideo.RealVideo(tm) ActiveX Control (32-bit)'));
                 }        
                 return redirectCheck(pluginFound, redirectURL, redirectIfFound);
            }
             
            function detectWindowsMedia(redirectURL, redirectIfFound) {
                 pluginFound = detectPlugin('Windows Media');
                 // if not found, try to detect with VisualBasic
                 if(!pluginFound && detectableWithVB) {
                      pluginFound = detectActiveXControl('MediaPlayer.MediaPlayer.1');
                 }
                 return redirectCheck(pluginFound, redirectURL, redirectIfFound);
            }
             
            function detectPlugin() {
                 // allow for multiple checks in a single pass
                 var daPlugins = detectPlugin.arguments;
                 // consider pluginFound to be false until proven true
                 var pluginFound = false;
                 // if plugins array is there and not fake
                 if (navigator.plugins && navigator.plugins.length > 0) {
                      var pluginsArrayLength = navigator.plugins.length;
                      // for each plugin...
                      for (pluginsArrayCounter=0; pluginsArrayCounter < pluginsArrayLength; pluginsArrayCounter++ ) {
                           // loop through all desired names and check each against the current plugin name
                           var numFound = 0;
                           for(namesCounter=0; namesCounter < daPlugins.length; namesCounter++) {
                                // if desired plugin name is found in either plugin name or description
                                if( (navigator.plugins[pluginsArrayCounter].name.indexOf(daPlugins[namesCounter]) >= 0) || 
                                     (navigator.plugins[pluginsArrayCounter].description.indexOf(daPlugins[namesCounter]) >= 0) ) {
                                     // this name was found
                                     numFound++;
                                }   
                           }
                           // now that we have checked all the required names against this one plugin,
                           // if the number we found matches the total number provided then we were successful
                           if(numFound == daPlugins.length) {
                                pluginFound = true;
                                // if we've found the plugin, we can stop looking through at the rest of the plugins
                                break;
                           }
                      }
                 }
                 return pluginFound;
            } // detectPlugin
             
             
            // Here we write out the VBScript block for MSIE Windows
            if ((navigator.userAgent.indexOf('MSIE') != -1) && (navigator.userAgent.indexOf('Win') != -1)) {
                 document.writeln('<script language="VBscript">');
             
                 document.writeln('\'do a one-time test for a version of VBScript that can handle this code');
                 document.writeln('detectableWithVB = False');
                 document.writeln('If ScriptEngineMajorVersion >= 2 then');
                 document.writeln('  detectableWithVB = True');
                 document.writeln('End If');
             
                 document.writeln('\'this next function will detect most plugins');
                 document.writeln('Function detectActiveXControl(activeXControlName)');
                 document.writeln('  on error resume next');
                 document.writeln('  detectActiveXControl = False');
                 document.writeln('  If detectableWithVB Then');
                 document.writeln('     detectActiveXControl = IsObject(CreateObject(activeXControlName))');
                 document.writeln('  End If');
                 document.writeln('End Function');
             
                 document.writeln('\'and the following function handles QuickTime');
                 document.writeln('Function detectQuickTimeActiveXControl()');
                 document.writeln('  on error resume next');
                 document.writeln('  detectQuickTimeActiveXControl = False');
                 document.writeln('  If detectableWithVB Then');
                 document.writeln('    detectQuickTimeActiveXControl = False');
                 document.writeln('    hasQuickTimeChecker = false');
                 document.writeln('    Set hasQuickTimeChecker = CreateObject("QuickTimeCheckObject.QuickTimeCheck.1")');
                 document.writeln('    If IsObject(hasQuickTimeChecker) Then');
                 document.writeln('      If hasQuickTimeChecker.IsQuickTimeAvailable(0) Then ');
                 document.writeln('        detectQuickTimeActiveXControl = True');
                 document.writeln('      End If');
                 document.writeln('    End If');
                 document.writeln('  End If');
                 document.writeln('End Function');
             
                 document.writeln('</scr' + 'ipt>');
            }
            

             

            Then in my Flex app, I call this:

             

            hasAcrobat = ExternalInterface.call('detectPDF'); 
            

             

            It works well actually. When I posted the question, I thought it wasn't returning the correct value all the time, but then realized the user had Acrobat installed but it wasn't the browser plug-in it was a stand alone version. I belive this script can only detect the browser plug-in.