/***PDFObjectv2.2.12*https://github.com/pipwerks/PDFObject*@license*Copyright(c)2008-2023PhilipHutchison*MIT-stylelicense:http://pipwerks.mit-license.org/*UMDmodulepatternfromhttps://github.com/umdjs/umd/blob/master/templates/returnExports.js*/(function (root, factory) { if (typeof define === "function" && define.amd) { //AMD.Registerasananonymousmodule.define([],factory);}elseif(typeofmodule==="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";//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-sideif(typeofwindow==="undefined"||window.navigator===undefined||window.navigator.userAgent===undefined||window.navigator.mimeTypes===undefined){returnfalse;}letpdfobjectversion="2.2.12";letnav=window.navigator;letua=window.navigator.userAgent;//Time to jump through hoops -- browser vendors do not make it easy to detect PDF support./* 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. MS Edge does not support ActiveX so this test will evaluate false */letisIE=("ActiveXObject"inwindow);/* There is a coincidental correlation between implementation of window.promises and native PDF support in desktop browsers We use this to assume if the browser supports promises it supports embedded PDFs Is this fragile? Sort of. But browser vendors removed mimetype detection, so we're left to improvise */letisModernBrowser=(window.Promise!==undefined);//Older browsers still expose the mimeTypeletsupportsPdfMimeType=(nav.mimeTypes["application/pdf"]!==undefined);//Safari on iPadOS doesn't report as 'mobile' when requesting desktop site, yet still fails to embed PDFsletisSafariIOSDesktopMode=(nav.platform!==undefined&&nav.platform==="MacIntel"&&nav.maxTouchPoints!==undefined&&nav.maxTouchPoints>1);//Quick test for mobile devices.letisMobileDevice=(isSafariIOSDesktopMode||/Mobi|Tablet|Android|iPad|iPhone/.test(ua));//Safari desktop requires special handling letisSafariDesktop=(!isMobileDevice&&nav.vendor!==undefined&&/Apple/.test(nav.vendor)&&/Safari/.test(ua));//Firefox started shipping PDF.js in Firefox 19. If this is Firefox 19 or greater, assume PDF.js is availableletisFirefoxWithPDFJS=(!isMobileDevice&&/irefox/.test(ua)&&ua.split("rv:").length>1)?(parseInt(ua.split("rv:")[1].split(".")[0],10)>18):false;/* ---------------------------------------------------- Supporting functions ---------------------------------------------------- */letcreateAXO=function(type){varax;try{ax=newActiveXObject(type);}catch(e){ax=null;//ensure ax remains null}returnax;};//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 neededletsupportsPdfActiveX=function(){return!!(createAXO("AcroPDF.PDF")||createAXO("PDF.PdfCtrl"));};//Determines whether PDF support is availableletsupportsPDFs=(//As of Sept 2020 no mobile browsers properly support PDF embeds!isMobileDevice&&(//We're moving into the age of MIME-less browsers. They mostly all support PDF rendering without plugins.isModernBrowser||//Modern versions of Firefox come bundled with PDFJSisFirefoxWithPDFJS||//Browsers that still support the original MIME type checksupportsPdfMimeType||//Pity the poor souls still using IE(isIE&&supportsPdfActiveX())));//Create a fragment identifier for using PDF Open parameters when embedding PDFletbuildURLFragmentString=function(pdfParams){letstring="";letprop;if(pdfParams){for(propinpdfParams){if(pdfParams.hasOwnProperty(prop)){string+=encodeURIComponent(prop)+"="+encodeURIComponent(pdfParams[prop])+"&";}}//The string will be empty if no PDF Params foundif(string){string="#"+string;//Remove last ampersandstring=string.slice(0,string.length-1);}}returnstring;};letembedError=function(msg,suppressConsole){if(!suppressConsole){console.log("[PDFObject] "+msg);}returnfalse;};letemptyNodeContents=function(node){while(node.firstChild){node.removeChild(node.firstChild);}};letgetTargetElement=function(targetSelector){//Default to body for full-browser PDFlettargetNode=document.body;//If a targetSelector is specified, check to see whether//it's passing a selector, jQuery object, or an HTML elementif(typeoftargetSelector==="string"){//Is CSS selectortargetNode=document.querySelector(targetSelector);}elseif(window.jQuery!==undefined&&targetSelectorinstanceofjQuery&&targetSelector.length){//Is jQuery element. Extract HTML nodetargetNode=targetSelector.get(0);}elseif(targetSelector.nodeType!==undefined&&targetSelector.nodeType===1){//Is HTML elementtargetNode=targetSelector;}returntargetNode;};letgeneratePDFObjectMarkup=function(embedType,targetNode,url,pdfOpenFragment,width,height,id,title,omitInlineStyles,customAttribute,PDFJS_URL){//Ensure target element is empty firstemptyNodeContents(targetNode);letsource=url;if(embedType==="pdfjs"){//If PDFJS_URL already contains a ?, assume querystring is in place, and use an ampersand to append PDFJS's file parameterletconnector=(PDFJS_URL.indexOf("?")!==-1)?"&":"?";source=PDFJS_URL+connector+"file="+encodeURIComponent(url)+pdfOpenFragment;}else{source+=pdfOpenFragment;}letel_type=(embedType==="pdfjs"||embedType==="iframe")?"iframe":"embed";letel=document.createElement(el_type);el.className="pdfobject";el.type="application/pdf";el.title=title;el.src=source;if(id){el.id=id;}if(el_type==="iframe"){el.allow="fullscreen";el.frameborder="0";}if(!omitInlineStyles){letstyle=(el_type==="embed")?"overflow: auto;":"border: none;";if(targetNode!==document.body){//assign width and height to target nodestyle+="width: "+width+"; height: "+height+";";}else{//this is a full-page embed, use CSS to fill the viewportstyle+="position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%;";}el.style.cssText=style;}//Allow developer to insert custom attribute on embed/iframe element, but ensure it does not conflict with attributes used by PDFObjectletreservedTokens=["className","type","title","src","style","id","allow","frameborder"];if(customAttribute&&customAttribute.key&&reservedTokens.indexOf(customAttribute.key)===-1){el.setAttribute(customAttribute.key,(typeofcustomAttribute.value!=="undefined")?customAttribute.value:"");}targetNode.classList.add("pdfobject-container");targetNode.appendChild(el);returntargetNode.getElementsByTagName(el_type)[0];};letembed=function(url,targetSelector,options){//If targetSelector is not defined, convert to booleanletselector=targetSelector||false;//Ensure options object is not undefined -- enables easier error checking belowletopt=options||{};//Get passed options, or set reasonable defaultsletid=(typeofopt.id==="string")?opt.id:"";letpage=opt.page||false;letpdfOpenParams=opt.pdfOpenParams||{};letfallbackLink=(typeofopt.fallbackLink==="string"||typeofopt.fallbackLink==="boolean")?opt.fallbackLink:true;letwidth=opt.width||"100%";letheight=opt.height||"100%";lettitle=opt.title||"Embedded PDF";letassumptionMode=(typeofopt.assumptionMode==="boolean")?opt.assumptionMode:true;letforcePDFJS=(typeofopt.forcePDFJS==="boolean")?opt.forcePDFJS:false;letsupportRedirect=(typeofopt.supportRedirect==="boolean")?opt.supportRedirect:false;letomitInlineStyles=(typeofopt.omitInlineStyles==="boolean")?opt.omitInlineStyles:false;letsuppressConsole=(typeofopt.suppressConsole==="boolean")?opt.suppressConsole:false;letforceIframe=(typeofopt.forceIframe==="boolean")?opt.forceIframe:false;letPDFJS_URL=opt.PDFJS_URL||false;lettargetNode=getTargetElement(selector);letfallbackHTML="";letpdfOpenFragment="";letcustomAttribute=opt.customAttribute||{};letfallbackHTML_default="<p>This browser does not support inline PDFs. Please download the PDF to view it: <a href='[url]'>Download PDF</a></p>";//Ensure URL is available. If not, exit now.if(typeofurl!=="string"){returnembedError("URL is not valid",suppressConsole);}//If target element is specified but is not valid, exit without doing anythingif(!targetNode){returnembedError("Target element cannot be determined",suppressConsole);}//page option overrides pdfOpenParams, if foundif(page){pdfOpenParams.page=page;}//Stringify optional Adobe params for opening document (as fragment identifier)pdfOpenFragment=buildURLFragmentString(pdfOpenParams);// --== Do the dance: Embed attempt #1 ==--//If the forcePDFJS option is invoked, skip everything else and embed as directedif(forcePDFJS&&PDFJS_URL){returngeneratePDFObjectMarkup("pdfjs",targetNode,url,pdfOpenFragment,width,height,id,title,omitInlineStyles,customAttribute,PDFJS_URL);}// --== Embed attempt #2 ==--//Embed PDF if traditional support is provided, or if this developer is willing to roll with assumption//that modern desktop (not mobile) browsers natively support PDFs if(supportsPDFs||(assumptionMode&&!isMobileDevice)){//Should we use <embed> or <iframe>? In most cases <embed>. //Allow developer to force <iframe>, if desired//There is an edge case where Safari does not respect 302 redirect requests for PDF files when using <embed> element.//Redirect appears to work fine when using <iframe> instead of <embed> (Addresses issue #210)//Forcing Safari desktop to use iframe due to freezing bug in macOS 11 (Big Sur)letembedtype=(forceIframe||supportRedirect||isSafariDesktop)?"iframe":"embed";returngeneratePDFObjectMarkup(embedtype,targetNode,url,pdfOpenFragment,width,height,id,title,omitInlineStyles,customAttribute);}// --== Embed attempt #3 ==--//If everything else has failed and a PDFJS fallback is provided, try to use itif(PDFJS_URL){returngeneratePDFObjectMarkup("pdfjs",targetNode,url,pdfOpenFragment,width,height,id,title,omitInlineStyles,customAttribute,PDFJS_URL);}// --== PDF embed not supported! Use fallback ==-- //Display the fallback link if availableif(fallbackLink){fallbackHTML=(typeoffallbackLink==="string")?fallbackLink:fallbackHTML_default;targetNode.innerHTML=fallbackHTML.replace(/\[url\]/g,url);}returnembedError("This browser does not support embedded PDFs",suppressConsole);};return{embed:function(a,b,c){returnembed(a,b,c);},pdfobjectversion:(function(){returnpdfobjectversion;})(),supportsPDFs:(function(){returnsupportsPDFs;})()};}));