| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 | /*global ActiveXObject, window, console, define, module, jQuery *///jshint unused:false, strict: false/*    PDFObject v2.1.1    https://github.com/pipwerks/PDFObject    Copyright (c) 2008-2018 Philip Hutchison    MIT-style license: http://pipwerks.mit-license.org/    UMD module pattern from https://github.com/umdjs/umd/blob/master/templates/returnExports.js*/(function (root, factory) {    if (typeof define === 'function' && define.amd) {        // AMD. Register as an anonymous module.        define([], factory);    } else if (typeof module === 'object' && module.exports) {        // Node. Does not work with strict CommonJS, but        // only CommonJS-like environments that support module.exports,        // like Node.        module.exports = factory();    } else {        // Browser globals (root is window)        root.PDFObject = factory();  }}(this, function () {    "use strict";    //jshint unused:true    //PDFObject is designed for client-side (browsers), not server-side (node)    //Will choke on undefined navigator and window vars when run on server    //Return boolean false and exit function when running server-side    if(typeof window === "undefined" || typeof navigator === "undefined"){ return false; }    var pdfobjectversion = "2.1.1",        ua = window.navigator.userAgent,        //declare booleans        supportsPDFs,        isIE,        supportsPdfMimeType = (typeof navigator.mimeTypes['application/pdf'] !== "undefined"),        supportsPdfActiveX,        isModernBrowser = (function (){ return (typeof window.Promise !== "undefined"); })(),        isFirefox = (function (){ return (ua.indexOf("irefox") !== -1); } )(),        isFirefoxWithPDFJS = (function (){            //Firefox started shipping PDF.js in Firefox 19.            //If this is Firefox 19 or greater, assume PDF.js is available            if(!isFirefox){ return false; }            //parse userAgent string to get release version ("rv")            //ex: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:57.0) Gecko/20100101 Firefox/57.0            return (parseInt(ua.split("rv:")[1].split(".")[0], 10) > 18);        })(),        isIOS = (function (){ return (/iphone|ipad|ipod/i.test(ua.toLowerCase())); })(),        //declare functions        createAXO,        buildFragmentString,        log,        embedError,        embed,        getTargetElement,        generatePDFJSiframe,        generateEmbedElement;    /* ----------------------------------------------------       Supporting functions       ---------------------------------------------------- */    createAXO = function (type){        var ax;        try {            ax = new ActiveXObject(type);        } catch (e) {            ax = null; //ensure ax remains null        }        return ax;    };    //IE11 still uses ActiveX for Adobe Reader, but IE 11 doesn't expose    //window.ActiveXObject the same way previous versions of IE did    //window.ActiveXObject will evaluate to false in IE 11, but "ActiveXObject" in window evaluates to true    //so check the first one for older IE, and the second for IE11    //FWIW, MS Edge (replacing IE11) does not support ActiveX at all, both will evaluate false    //Constructed as a method (not a prop) to avoid unneccesarry overhead -- will only be evaluated if needed    isIE = function (){ return !!(window.ActiveXObject || "ActiveXObject" in window); };    //If either ActiveX support for "AcroPDF.PDF" or "PDF.PdfCtrl" are found, return true    //Constructed as a method (not a prop) to avoid unneccesarry overhead -- will only be evaluated if needed    supportsPdfActiveX = function (){ return !!(createAXO("AcroPDF.PDF") || createAXO("PDF.PdfCtrl")); };    //Determines whether PDF support is available    supportsPDFs = (        //as of iOS 12, inline PDF rendering is still not supported in Safari or native webview        //3rd-party browsers (eg Chrome, Firefox) use Apple's webview for rendering, and thus the same result as Safari        //Therefore if iOS, we shall assume that PDF support is not available        !isIOS && (            //Modern versions of Firefox come bundled with PDFJS            isFirefoxWithPDFJS ||             //Browsers that still support the original MIME type check            supportsPdfMimeType || (                //Pity the poor souls still using IE                isIE() && supportsPdfActiveX()            )        )    );    //Create a fragment identifier for using PDF Open parameters when embedding PDF    buildFragmentString = function(pdfParams){        var string = "",            prop;        if(pdfParams){            for (prop in pdfParams) {                if (pdfParams.hasOwnProperty(prop)) {                    string += encodeURIComponent(prop) + "=" + encodeURIComponent(pdfParams[prop]) + "&";                }            }            //The string will be empty if no PDF Params found            if(string){                string = "#" + string;                //Remove last ampersand                string = string.slice(0, string.length - 1);            }        }        return string;    };    log = function (msg){        if(typeof console !== "undefined" && console.log){            console.log("[PDFObject] " + msg);        }    };    embedError = function (msg){        log(msg);        return false;    };    getTargetElement = function (targetSelector){        //Default to body for full-browser PDF        var targetNode = document.body;        //If a targetSelector is specified, check to see whether        //it's passing a selector, jQuery object, or an HTML element        if(typeof targetSelector === "string"){            //Is CSS selector            targetNode = document.querySelector(targetSelector);        } else if (typeof jQuery !== "undefined" && targetSelector instanceof jQuery && targetSelector.length) {            //Is jQuery element. Extract HTML node            targetNode = targetSelector.get(0);        } else if (typeof targetSelector.nodeType !== "undefined" && targetSelector.nodeType === 1){            //Is HTML element            targetNode = targetSelector;        }        return targetNode;    };    generatePDFJSiframe = function (targetNode, url, pdfOpenFragment, PDFJS_URL, id){        var fullURL = PDFJS_URL + "?file=" + encodeURIComponent(url) + pdfOpenFragment;        var scrollfix = (isIOS) ? "-webkit-overflow-scrolling: touch; overflow-y: scroll; " : "overflow: hidden; ";        var iframe = "<div style='" + scrollfix + "position: absolute; top: 0; right: 0; bottom: 0; left: 0;'><iframe  " + id + " src='" + fullURL + "' style='border: none; width: 100%; height: 100%;' frameborder='0'></iframe></div>";        targetNode.className += " pdfobject-container";        targetNode.style.position = "relative";        targetNode.style.overflow = "auto";        targetNode.innerHTML = iframe;        return targetNode.getElementsByTagName("iframe")[0];    };    generateEmbedElement = function (targetNode, targetSelector, url, pdfOpenFragment, width, height, id){        var style = "";        if(targetSelector && targetSelector !== document.body){            style = "width: " + width + "; height: " + height + ";";        } else {            style = "position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%;";        }        targetNode.className += " pdfobject-container";        targetNode.innerHTML = "<embed " + id + " class='pdfobject' src='" + url + pdfOpenFragment + "' type='application/pdf' style='overflow: auto; " + style + "'/>";        return targetNode.getElementsByTagName("embed")[0];    };    embed = function(url, targetSelector, options){        //Ensure URL is available. If not, exit now.        if(typeof url !== "string"){ return embedError("URL is not valid"); }        //If targetSelector is not defined, convert to boolean        targetSelector = (typeof targetSelector !== "undefined") ? targetSelector : false;        //Ensure options object is not undefined -- enables easier error checking below        options = (typeof options !== "undefined") ? options : {};        //Get passed options, or set reasonable defaults        var id = (options.id && typeof options.id === "string") ? "id='" + options.id + "'" : "",            page = (options.page) ? options.page : false,            pdfOpenParams = (options.pdfOpenParams) ? options.pdfOpenParams : {},            fallbackLink = (typeof options.fallbackLink !== "undefined") ? options.fallbackLink : true,            width = (options.width) ? options.width : "100%",            height = (options.height) ? options.height : "100%",            assumptionMode = (typeof options.assumptionMode === "boolean") ? options.assumptionMode : true,            forcePDFJS = (typeof options.forcePDFJS === "boolean") ? options.forcePDFJS : false,            PDFJS_URL = (options.PDFJS_URL) ? options.PDFJS_URL : false,            targetNode = getTargetElement(targetSelector),            fallbackHTML = "",            pdfOpenFragment = "",            fallbackHTML_default = "<p>This browser does not support inline PDFs. Please download the PDF to view it: <a href='[url]'>Download PDF</a></p>";        //If target element is specified but is not valid, exit without doing anything        if(!targetNode){ return embedError("Target element cannot be determined"); }        //page option overrides pdfOpenParams, if found        if(page){            pdfOpenParams.page = page;        }        //Stringify optional Adobe params for opening document (as fragment identifier)        pdfOpenFragment = buildFragmentString(pdfOpenParams);        //Do the dance        //If the forcePDFJS option is invoked, skip everything else and embed as directed        if(forcePDFJS && PDFJS_URL){            return generatePDFJSiframe(targetNode, url, pdfOpenFragment, PDFJS_URL, id);        //If traditional support is provided, or if this is a modern browser and not iOS (see comment for supportsPDFs declaration)        } else if(supportsPDFs || (assumptionMode && isModernBrowser && !isIOS)){            return generateEmbedElement(targetNode, targetSelector, url, pdfOpenFragment, width, height, id);        //If everything else has failed and a PDFJS fallback is provided, try to use it        } else if(PDFJS_URL){            return generatePDFJSiframe(targetNode, url, pdfOpenFragment, PDFJS_URL, id);        } else {            //Display the fallback link if available            if(fallbackLink){                fallbackHTML = (typeof fallbackLink === "string") ? fallbackLink : fallbackHTML_default;                targetNode.innerHTML = fallbackHTML.replace(/\[url\]/g, url);            }            return embedError("This browser does not support embedded PDFs");        }    };    return {        embed: function (a,b,c){ return embed(a,b,c); },        pdfobjectversion: (function () { return pdfobjectversion; })(),        supportsPDFs: (function (){ return supportsPDFs; })()    };}));
 |