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; })()
- };
- }));
|