PDF Embedder - Version 2.5.4

Version Description

Added French translation thanks to Thierry Gaillou of JDFitForme. Uses newer version of pdf.js library for rendering PDFs.

Download this release

Release Info

Developer danlester
Plugin Icon 128x128 PDF Embedder
Version 2.5.4
Comparing to
See all releases

Code changes from version 2.5 to 2.5.4

css/pdfemb-embed-pdf.css CHANGED
@@ -134,7 +134,7 @@ div.pdfemb-toolbar-bottom {
134
  padding-top: 1px;
135
  }
136
 
137
- div.pdfemb-toolbar button {
138
  background-color: hsla(0,0%,0%,.12);
139
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
140
  background-clip: padding-box;
134
  padding-top: 1px;
135
  }
136
 
137
+ div.pdfemb-toolbar button, div.pdfemb-toolbar button[disabled] {
138
  background-color: hsla(0,0%,0%,.12);
139
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
140
  background-clip: padding-box;
js/all-pdfemb-basic.min.js CHANGED
@@ -1,24 +1,24 @@
1
- function pdfembGetPDF(c,a){a(c,!1)}function pdfembWantMobile(c,a,e,b){return!1}function pdfembMakeMobile(c,a,e){}function pdfembAddMoreToolbar(c,a,e){}function pdfembPremiumJumpToTop(c){};jQuery(document).ready(function(c){c.fn.pdfEmbedder=function(){this.each(function(a,e){var b=c(e);b.append(c("<div></div>",{"class":"pdfemb-loadingmsg"}).append(document.createTextNode(pdfemb_trans.objectL10n.loading)));"on"==b.data("disablerightclick")&&b.bind("contextmenu",function(a){a.preventDefault()});var h=function(a,f){b.empty().append(c("<div></div>",{"class":"pdfemb-inner-div"}).append(c("<canvas></canvas>",{"class":"pdfemb-the-canvas"})));b.data("pdfDoc",a);var d=b.data("toolbar");"bottom"!=
2
- d&&c.fn.pdfEmbedder.addToolbar(b,!0,"on"==b.data("toolbar-fixed"),f);"top"!=d&&c.fn.pdfEmbedder.addToolbar(b,!1,"on"==b.data("toolbar-fixed"),f);b.on("pdfembGotopage",function(a,f){f>b.data("pdfDoc").numPages||0>=f||b.data("pagenum")==f||(b.data("pagenum",f),c.fn.pdfEmbedder.queueRenderPage(b,f),pdfembPremiumJumpToTop(b))});b.on("pdfembGotoHash",function(a,f){if(f.dest){dest=f.dest;var d;"string"===typeof dest?(destString=dest,d=b.data("pdfDoc").getDestination(dest)):d=Promise.resolve(dest);d.then(function(a){a instanceof
3
- Array&&!(1>a.length)&&b.data("pdfDoc").getPageIndex(a[0]).then(function(a){a+=1;a>b.data("pdfDoc").numPages||0>=a||b.data("pagenum")==a||(b.data("pagenum",a),c.fn.pdfEmbedder.queueRenderPage(b,a),pdfembPremiumJumpToTop(b))})})}});b.on("pdfembGotoAction",function(a,f){var d=b.data("pagenum"),e=d;switch(f){case "GoBack":--e;break;case "GoForward":++e;break;case "NextPage":++e;break;case "PrevPage":--e;break;case "LastPage":e=b.data("pdfDoc").numPages;break;case "FirstPage":e=1}e==d||e>b.data("pdfDoc").numPages||
4
- 0>=e||(b.data("pagenum",e),c.fn.pdfEmbedder.queueRenderPage(b,e))});b.data("pageCount",a.numPages);(!b.data("pagenum")||1>b.data("pagenum")||b.data("pagenum")>a.numPages)&&b.data("pagenum",1);b.data("showIsSecure",f);b.data("pageNumPending",null);b.data("zoom",100);c.fn.pdfEmbedder.renderPage(b,b.data("pagenum"));b.find("span.pdfemb-page-count").text(a.numPages);d=new pdfembGrabToPan({element:b.find("div.pdfemb-inner-div")[0]});b.data("grabtopan",d);c(window).resize(function(){setTimeout(function(){c.fn.pdfEmbedder.queueRenderPage(b,
5
- b.data("pagenum"))},100)})},d=function(a,f){PDFJS.getDocument(a).then(function(a){h(a,f)},function(a){var f=document.createTextNode(a.message);"UnexpectedResponseException"==a.name&&0==a.status&&(f=c("<span></span>").append(document.createTextNode(pdfemb_trans.objectL10n.domainerror+" ")).append(c('<a href="https://wp-pdf.com/troubleshooting/#unexpected" target="_blank">'+pdfemb_trans.objectL10n.clickhereinfo+"</a>")));b.empty().append(c("<div></div>",{"class":"pdfemb-errormsg"}).append(f))})};if(b.data("pdfDoc"))h(b.data("pdfDoc"),
6
- b.data("showIsSecure"));else{var f=b.attr("data-pdf-url");pdfembGetPDF(f,d)}});return this};c.fn.pdfEmbedder.annotationsLayerFactory="undefined"!=typeof pdfembPremiumAnnotationsLayerFactory?new pdfembPremiumAnnotationsLayerFactory:{createAnnotationsLayerBuilder:function(a,c){return null}};c.fn.pdfEmbedder.checkForResize=function(a){var e=c(window).height(),b=c(window).width(),h=a.data("checked-window-height"),d=a.data("checked-window-width");if(!h||!d)a.data("checked-window-height",e),a.data("checked-window-width",
7
- b);else if(h!=e||d!=b)c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum")),a.data("checked-window-height",e),a.data("checked-window-width",b);"true"!=a.data("fullScreenClosed")&&setTimeout(function(){c.fn.pdfEmbedder.checkForResize(a)},1E3)};c.fn.pdfEmbedder.renderPage=function(a,e,b){a.data("pageRendering",!0);a.data("pdfDoc").getPage(e).then(function(h){var d=a.find(".pdfemb-the-canvas"),f=null,r=null,u=null,v=null;b&&(u=d.width(),v=d.height(),r=d[0].getContext("2d"),f=r.getImageData(0,0,u,v));
8
- var n,g=h.getViewport(1),l=g.width,m=g.height;if(0>=l||0>=m)a.empty().append(document.createTextNode(pdfemb_trans.objectL10n.widthheightinvalid));else{var q=a.parent().width(),g=l,p=m;if("max"==a.data("width"))g=q;else if("auto"==a.data("width"))g=l;else if(g=parseInt(a.data("width"),10),isNaN(g)||0>=g)g=q;0>=g&&(g=l);g>q&&0<q&&(g=q);n=g/l;var p=m*n,w=a.find("div.pdfemb-toolbar-fixed"),t=(q=pdfembWantMobile(c,a,g,k))?0:w.length,k=parseInt(a.data("height"),10);if(isNaN(k)||0>=k||k>p)k="auto"==a.data("height")?
9
- a.parent().height()-t*w.height():p;var g=Math.floor(g),p=Math.floor(p),x=100,l=g,m=p,y=0,z=0;q||(x=a.data("zoom"),l=g*x/100,m=p*x/100,l<g&&(y=(g-l)/2),m<k&&(z=(k-m)/2));var A=h.getViewport(n*x/100);g!=a.width()&&a.width(g);a.height()!=k&&a.height(k+t*w.height());n=a.find("div.pdfemb-inner-div");var x=n[0].scrollLeft,B=n[0].scrollTop;n.width(g);n.height(k);w=w.filter(".pdfemb-toolbar-top");0<t&&n.css("top",w.height());d[0].width=l;d[0].height=m;d.css("width",l);d.css("height",m);d.css("left",y).css("top",
10
- z);(l>g||m>p||m>k)&&!q?(k=a.data("fromZoom"),t=a.data("toZoom"),0<k&&0<t&&(y=B+p/2,n.scrollLeft((x+g/2)*t/k-g/2),n.scrollTop(y*t/k-p/2)),a.data("grabtopan").activate()):("on"==a.data("fullScreen")?a.data("grabtopan").activate():a.data("grabtopan").deactivate(),a.find("div.pdfemb-inner-div").scrollLeft(0).scrollTop(0));a.data("fromZoom",0).data("toZoom",0);pdfembMakeMobile(c,q,a);b?(a.data("pagenum",e),a.data("pageRendering",!1),d=c("<canvas>").attr("width",f.width).attr("height",f.height)[0],d.getContext("2d").putImageData(f,
11
- 0,0),r.scale(l/u,m/v),r.drawImage(d,0,0)):(f={canvasContext:d[0].getContext("2d"),viewport:A},h.render(f).promise.then(function(){a.data("pagenum",e);a.data("pageRendering",!1);a.find("div.pdfemb-toolbar .pdfemb-page-num").each(function(a,b){var f=c(b);f.is("span")?f.text(e):f.val(e)});e<a.data("pageCount")?a.find(".pdfemb-next").removeAttr("disabled").removeClass("pdfemb-btndisabled"):a.find(".pdfemb-next").attr("disabled","disabled").addClass("pdfemb-btndisabled");1<e?a.find(".pdfemb-prev").removeAttr("disabled").removeClass("pdfemb-btndisabled"):
12
- a.find(".pdfemb-prev").attr("disabled","disabled").addClass("pdfemb-btndisabled");var b=c.fn.pdfEmbedder.annotationsLayerFactory.createAnnotationsLayerBuilder(a.find("div.pdfemb-inner-div")[0],h);null!=b&&(a.find("div.pdfembAnnotationLayer").remove(),b.setupAnnotations(A,a.data("newwindow")));null!==a.data("pageNumPending")&&(c.fn.pdfEmbedder.renderPage(a,a.data("pageNumPending")),a.data("pageNumPending",null))}))}})};c.fn.pdfEmbedder.queueRenderPage=function(a,e,b){a.data("pageRendering")?a.data("pageNumPending",
13
- e):c.fn.pdfEmbedder.renderPage(a,e,b)};c.fn.pdfEmbedder.goFullScreen=function(a){a=c('<div class="pdfemb-fs-window"></div>');c(document.body).append(a)};c.fn.pdfEmbedder.changeZoom=function(a,e){var b=a.data("zoom"),h=b+e;a.data("zoom",h);a.find("span.pdfemb-zoom").text(h+"%");c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum"));a.data("fromZoom",b).data("toZoom",h)};c.fn.pdfEmbedder.magnifyZoom=function(a,e){var b=a.data("zoom"),h=Math.floor(b*e);20>h&&(h=20);500<h&&(h=500);a.data("zoom",h);a.find("span.pdfemb-zoom").text(h+
14
- "%");c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum"),!0);a.data("fromZoom",b).data("toZoom",h)};c.fn.pdfEmbedder.addToolbar=function(a,e,b,h){var d=c("<div></div>",{"class":"pdfemb-toolbar pdfemb-toolbar"+(b?"-fixed":"-hover")+" "+(e?" pdfemb-toolbar-top":"pdfemb-toolbar-bottom")}),f=c('<button class="pdfemb-prev" title="'+pdfemb_trans.objectL10n.prev+'"></button>');d.append(f);var r=c('<button class="pdfemb-next" title="'+pdfemb_trans.objectL10n.next+'"></button>');d.append(r);d.append(c('<div class="pdfemb-page-area">'+
15
- pdfemb_trans.objectL10n.page+' <span class="pdfemb-page-num">0</span> / <span class="pdfemb-page-count"></span></div>'));var u=c('<button class="pdfemb-zoomout" title="'+pdfemb_trans.objectL10n.zoomout+'"></button>');d.append(u);var v=c('<button class="pdfemb-zoomin" title="'+pdfemb_trans.objectL10n.zoomin+'"></button>');d.append(v);d.append(c("<div>"+pdfemb_trans.objectL10n.zoom+' <span class="pdfemb-zoom">100%</span></div>'));h&&d.append(c("<div>"+pdfemb_trans.objectL10n.secure+"</div>"));e?a.prepend(d):
16
- a.append(d);f.on("click",function(b){1>=a.data("pagenum")||(a.data("pagenum",a.data("pagenum")-1),c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum")),pdfembPremiumJumpToTop(a))});r.on("click",function(b){a.data("pagenum")>=a.data("pdfDoc").numPages||(a.data("pagenum",a.data("pagenum")+1),c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum")),pdfembPremiumJumpToTop(a))});v.on("click",function(b){500<=a.data("zoom")||c.fn.pdfEmbedder.changeZoom(a,10)});u.on("click",function(b){20>=a.data("zoom")||
17
- c.fn.pdfEmbedder.changeZoom(a,-10)});pdfembAddMoreToolbar(c,d,a);b||(a.on("mouseenter",function(b){b=a.find("div.pdfemb-toolbar-hover");!0!==b.data("no-hover")&&b.show()}),a.on("mouseleave",function(b){a.find("div.pdfemb-toolbar-hover").hide()}));pdfemb_trans.poweredby&&d.append(c("<div></div>",{"class":"pdfemb-poweredby"}).append(c('<a href="https://wp-pdf.com/?utm_source=Poweredby&utm_medium=freemium&utm_campaign=Freemium" target="_blank">wp-pdf.com</a>')))};PDFJS.workerSrc=pdfemb_trans.worker_src;
18
- PDFJS.cMapUrl=pdfemb_trans.cmap_url;PDFJS.cMapPacked=!0;c(".pdfemb-viewer").pdfEmbedder()});var pdfembGrabToPan=function(){function c(a){this.element=a.element;this.document=a.element.ownerDocument;"function"===typeof a.ignoreTarget&&(this.ignoreTarget=a.ignoreTarget);this.onActiveChanged=a.onActiveChanged;this.activate=this.activate.bind(this);this.deactivate=this.deactivate.bind(this);this.toggle=this.toggle.bind(this);this._onmousedown=this._onmousedown.bind(this);this._onmousemove=this._onmousemove.bind(this);this._onmousewheel=this._onmousewheel.bind(this);this._endPan=this._endPan.bind(this);
19
  (this.overlay=document.createElement("div")).className="grab-to-pan-grabbing"}c.prototype={CSS_CLASS_GRAB:"grab-to-pan-grab",activate:function(){if(!this.active&&(this.active=!0,this.element.addEventListener("mousedown",this._onmousedown,!0),this.element.addEventListener("DOMMouseScroll",this._onmousewheel),this.element.addEventListener("mousewheel",this._onmousewheel),this.element.classList.add(this.CSS_CLASS_GRAB),this.onActiveChanged))this.onActiveChanged(!0)},deactivate:function(){if(this.active&&
20
  (this.active=!1,this.element.removeEventListener("mousedown",this._onmousedown,!0),this._endPan(),this.element.classList.remove(this.CSS_CLASS_GRAB),this.onActiveChanged))this.onActiveChanged(!1)},toggle:function(){this.active?this.deactivate():this.activate()},ignoreTarget:function(b){return b[a]("a[href], a[href] *, input, textarea, button, button *, select, option")},_onmousedown:function(a){if(0===a.button&&!this.ignoreTarget(a.target)){this.scrollLeftStart=this.element.scrollLeft;this.scrollTopStart=
21
  this.element.scrollTop;this.clientXStart=a.clientX;this.clientYStart=a.clientY;this.document.addEventListener("mousemove",this._onmousemove,!0);this.document.addEventListener("mouseup",this._endPan,!0);this.element.addEventListener("scroll",this._endPan,!0);a.preventDefault();a.stopPropagation();this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING);var b=document.activeElement;b&&!b.contains(a.target)&&b.blur()}},_onmousemove:function(a){this.element.removeEventListener("scroll",this._endPan,
22
- !0);var b;b="buttons"in a&&e?!(a.buttons|1):h||d?0===a.which:void 0;b?this._endPan():(b=a.clientX-this.clientXStart,this.element.scrollTop=this.scrollTopStart-(a.clientY-this.clientYStart),this.element.scrollLeft=this.scrollLeftStart-b,this.overlay.parentNode||document.body.appendChild(this.overlay))},_onmousewheel:function(a){this.element.removeEventListener("scroll",this._endPan,!0);a="DOMMouseScroll"===a.type?-a.detail:a.wheelDelta/40;this.scrollLeftStart=this.element.scrollLeft;this.scrollTopStart=
23
  this.element.scrollTop;this.element.scrollTop=this.scrollTopStart-40*a;this.overlay.parentNode||document.body.appendChild(this.overlay)},_endPan:function(){this.element.removeEventListener("scroll",this._endPan,!0);this.document.removeEventListener("mousemove",this._onmousemove,!0);this.document.removeEventListener("mouseup",this._endPan,!0);this.overlay.parentNode&&this.overlay.parentNode.removeChild(this.overlay)}};var a;["webkitM","mozM","msM","oM","m"].some(function(b){b+="atches";b in document.documentElement&&
24
- (a=b);b+="Selector";b in document.documentElement&&(a=b);return a});var e=!document.documentMode||9<document.documentMode,b=window.chrome,h=b&&(b.webstore||b.app),d=/Apple/.test(navigator.vendor)&&/Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);return c}();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var pdfembGrabToPan=function(){function c(a){this.element=a.element;this.document=a.element.ownerDocument;"function"===typeof a.ignoreTarget&&(this.ignoreTarget=a.ignoreTarget);this.onActiveChanged=a.onActiveChanged;this.activate=this.activate.bind(this);this.deactivate=this.deactivate.bind(this);this.toggle=this.toggle.bind(this);this._onmousedown=this._onmousedown.bind(this);this._onmousemove=this._onmousemove.bind(this);this._onmousewheel=this._onmousewheel.bind(this);this._endPan=this._endPan.bind(this);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  (this.overlay=document.createElement("div")).className="grab-to-pan-grabbing"}c.prototype={CSS_CLASS_GRAB:"grab-to-pan-grab",activate:function(){if(!this.active&&(this.active=!0,this.element.addEventListener("mousedown",this._onmousedown,!0),this.element.addEventListener("DOMMouseScroll",this._onmousewheel),this.element.addEventListener("mousewheel",this._onmousewheel),this.element.classList.add(this.CSS_CLASS_GRAB),this.onActiveChanged))this.onActiveChanged(!0)},deactivate:function(){if(this.active&&
3
  (this.active=!1,this.element.removeEventListener("mousedown",this._onmousedown,!0),this._endPan(),this.element.classList.remove(this.CSS_CLASS_GRAB),this.onActiveChanged))this.onActiveChanged(!1)},toggle:function(){this.active?this.deactivate():this.activate()},ignoreTarget:function(b){return b[a]("a[href], a[href] *, input, textarea, button, button *, select, option")},_onmousedown:function(a){if(0===a.button&&!this.ignoreTarget(a.target)){this.scrollLeftStart=this.element.scrollLeft;this.scrollTopStart=
4
  this.element.scrollTop;this.clientXStart=a.clientX;this.clientYStart=a.clientY;this.document.addEventListener("mousemove",this._onmousemove,!0);this.document.addEventListener("mouseup",this._endPan,!0);this.element.addEventListener("scroll",this._endPan,!0);a.preventDefault();a.stopPropagation();this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING);var b=document.activeElement;b&&!b.contains(a.target)&&b.blur()}},_onmousemove:function(a){this.element.removeEventListener("scroll",this._endPan,
5
+ !0);var b;b="buttons"in a&&f?!(a.buttons|1):e||d?0===a.which:void 0;b?this._endPan():(b=a.clientX-this.clientXStart,this.element.scrollTop=this.scrollTopStart-(a.clientY-this.clientYStart),this.element.scrollLeft=this.scrollLeftStart-b,this.overlay.parentNode||document.body.appendChild(this.overlay))},_onmousewheel:function(a){this.element.removeEventListener("scroll",this._endPan,!0);a="DOMMouseScroll"===a.type?-a.detail:a.wheelDelta/40;this.scrollLeftStart=this.element.scrollLeft;this.scrollTopStart=
6
  this.element.scrollTop;this.element.scrollTop=this.scrollTopStart-40*a;this.overlay.parentNode||document.body.appendChild(this.overlay)},_endPan:function(){this.element.removeEventListener("scroll",this._endPan,!0);this.document.removeEventListener("mousemove",this._onmousemove,!0);this.document.removeEventListener("mouseup",this._endPan,!0);this.overlay.parentNode&&this.overlay.parentNode.removeChild(this.overlay)}};var a;["webkitM","mozM","msM","oM","m"].some(function(b){b+="atches";b in document.documentElement&&
7
+ (a=b);b+="Selector";b in document.documentElement&&(a=b);return a});var f=!document.documentMode||9<document.documentMode,b=window.chrome,e=b&&(b.webstore||b.app),d=/Apple/.test(navigator.vendor)&&/Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);return c}();function pdfembGetPDF(c,a){a(c,!1)}function pdfembWantMobile(c,a,f,b){return!1}function pdfembMakeMobile(c,a,f){}function pdfembAddMoreToolbar(c,a,f){}function pdfembPremiumJumpToTop(c){};jQuery(document).ready(function(c){c.fn.pdfEmbedder=function(){this.each(function(a,f){var b=c(f);b.append(c("<div></div>",{"class":"pdfemb-loadingmsg"}).append(document.createTextNode(pdfemb_trans.objectL10n.loading)));"on"==b.data("disablerightclick")&&b.bind("contextmenu",function(a){a.preventDefault()});var e=function(a,d){b.empty().append(c("<div></div>",{"class":"pdfemb-inner-div"}).append(c("<canvas></canvas>",{"class":"pdfemb-the-canvas"})));b.data("pdfDoc",a);var f=b.data("toolbar");"bottom"!=
8
+ f&&c.fn.pdfEmbedder.addToolbar(b,!0,"on"==b.data("toolbar-fixed"),d);"top"!=f&&c.fn.pdfEmbedder.addToolbar(b,!1,"on"==b.data("toolbar-fixed"),d);b.on("pdfembGotopage",function(a,g){g>b.data("pdfDoc").numPages||0>=g||b.data("pagenum")==g||(b.data("pagenum",g),c.fn.pdfEmbedder.queueRenderPage(b,g),pdfembPremiumJumpToTop(b))});b.on("pdfembGotoHash",function(a,g){if(g.dest){dest=g.dest;var d;"string"===typeof dest?(destString=dest,d=b.data("pdfDoc").getDestination(dest)):d=Promise.resolve(dest);d.then(function(a){a instanceof
9
+ Array&&!(1>a.length)&&b.data("pdfDoc").getPageIndex(a[0]).then(function(a){a+=1;a>b.data("pdfDoc").numPages||0>=a||b.data("pagenum")==a||(b.data("pagenum",a),c.fn.pdfEmbedder.queueRenderPage(b,a),pdfembPremiumJumpToTop(b))})})}});b.on("pdfembGotoAction",function(a,d){var f=b.data("pagenum"),e=f;switch(d){case "GoBack":--e;break;case "GoForward":++e;break;case "NextPage":++e;break;case "PrevPage":--e;break;case "LastPage":e=b.data("pdfDoc").numPages;break;case "FirstPage":e=1}e==f||e>b.data("pdfDoc").numPages||
10
+ 0>=e||(b.data("pagenum",e),c.fn.pdfEmbedder.queueRenderPage(b,e))});b.data("pageCount",a.numPages);(!b.data("pagenum")||1>b.data("pagenum")||b.data("pagenum")>a.numPages)&&b.data("pagenum",1);b.data("showIsSecure",d);b.data("pageNumPending",null);b.data("zoom",100);c.fn.pdfEmbedder.renderPage(b,b.data("pagenum"));b.find("span.pdfemb-page-count").text(a.numPages);f=new pdfembGrabToPan({element:b.find("div.pdfemb-inner-div")[0]});b.data("grabtopan",f);c(window).resize(function(){setTimeout(function(){c.fn.pdfEmbedder.queueRenderPage(b,
11
+ b.data("pagenum"))},100)})},d=function(a,d){null===a?b.empty().append(c("<div></div>",{"class":"pdfemb-errormsg"}).append(msgnode=c("<span></span>").append(document.createTextNode("Failed to load and decrypt PDF")))):PDFJS.getDocument(a).then(function(a){e(a,d)},function(a){var d=document.createTextNode(a.message);"UnexpectedResponseException"==a.name&&0==a.status&&(d=c("<span></span>").append(document.createTextNode(pdfemb_trans.objectL10n.domainerror+" ")).append(c('<a href="https://wp-pdf.com/troubleshooting/#unexpected" target="_blank">'+
12
+ pdfemb_trans.objectL10n.clickhereinfo+"</a>")));b.empty().append(c("<div></div>",{"class":"pdfemb-errormsg"}).append(d))})};if(b.data("pdfDoc"))e(b.data("pdfDoc"),b.data("showIsSecure"));else{var m=b.attr("data-pdf-url");pdfembGetPDF(m,d)}});return this};c.fn.pdfEmbedder.annotationsLayerFactory="undefined"!=typeof pdfembPremiumAnnotationsLayerFactory?new pdfembPremiumAnnotationsLayerFactory:{createAnnotationsLayerBuilder:function(a,c){return null}};c.fn.pdfEmbedder.checkForResize=function(a){var f=
13
+ c(window).height(),b=c(window).width(),e=a.data("checked-window-height"),d=a.data("checked-window-width");if(!e||!d)a.data("checked-window-height",f),a.data("checked-window-width",b);else if(e!=f||d!=b)c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum")),a.data("checked-window-height",f),a.data("checked-window-width",b);"true"!=a.data("fullScreenClosed")&&setTimeout(function(){c.fn.pdfEmbedder.checkForResize(a)},1E3)};c.fn.pdfEmbedder.renderPage=function(a,f,b){a.data("pageRendering",!0);a.data("pdfDoc").getPage(f).then(function(e){var d=
14
+ a.find(".pdfemb-the-canvas"),m=null,r=null,u=null,v=null;b&&(u=d.width(),v=d.height(),r=d[0].getContext("2d"),m=r.getImageData(0,0,u,v));var n,g=e.getViewport(1),k=g.width,l=g.height;if(0>=k||0>=l)a.empty().append(document.createTextNode(pdfemb_trans.objectL10n.widthheightinvalid));else{var q=a.parent().width(),g=k,p=l;if("max"==a.data("width"))g=q;else if("auto"==a.data("width"))g=k;else if(g=parseInt(a.data("width"),10),isNaN(g)||0>=g)g=q;0>=g&&(g=k);g>q&&0<q&&(g=q);n=g/k;var p=l*n,w=a.find("div.pdfemb-toolbar-fixed"),
15
+ t=(q=pdfembWantMobile(c,a,g,h))?0:w.length,h=parseInt(a.data("height"),10);if(isNaN(h)||0>=h||h>p)h="auto"==a.data("height")?a.parent().height()-t*w.height():p;var g=Math.floor(g),p=Math.floor(p),x=100,k=g,l=p,y=0,z=0;q||(x=a.data("zoom"),k=g*x/100,l=p*x/100,k<g&&(y=(g-k)/2),l<h&&(z=(h-l)/2));var A=e.getViewport(n*x/100);g!=a.width()&&a.width(g);a.height()!=h&&a.height(h+t*w.height());n=a.find("div.pdfemb-inner-div");var x=n[0].scrollLeft,B=n[0].scrollTop;n.width(g);n.height(h);w=w.filter(".pdfemb-toolbar-top");
16
+ 0<t&&n.css("top",w.height());d[0].width=k;d[0].height=l;d.css("width",k);d.css("height",l);d.css("left",y).css("top",z);(k>g||l>p||l>h)&&!q?(h=a.data("fromZoom"),t=a.data("toZoom"),0<h&&0<t&&(y=B+p/2,n.scrollLeft((x+g/2)*t/h-g/2),n.scrollTop(y*t/h-p/2)),a.data("grabtopan").activate()):("on"==a.data("fullScreen")?a.data("grabtopan").activate():a.data("grabtopan").deactivate(),a.find("div.pdfemb-inner-div").scrollLeft(0).scrollTop(0));a.data("fromZoom",0).data("toZoom",0);pdfembMakeMobile(c,q,a);b?
17
+ (a.data("pagenum",f),a.data("pageRendering",!1),d=c("<canvas>").attr("width",m.width).attr("height",m.height)[0],d.getContext("2d").putImageData(m,0,0),r.scale(k/u,l/v),r.drawImage(d,0,0)):(m={canvasContext:d[0].getContext("2d"),viewport:A},e.render(m).promise.then(function(){a.data("pagenum",f);a.data("pageRendering",!1);a.find("div.pdfemb-toolbar .pdfemb-page-num").each(function(a,b){var d=c(b);d.is("span")?d.text(f):d.val(f)});f<a.data("pageCount")?a.find(".pdfemb-next").removeAttr("disabled").removeClass("pdfemb-btndisabled"):
18
+ a.find(".pdfemb-next").attr("disabled","disabled").addClass("pdfemb-btndisabled");1<f?a.find(".pdfemb-prev").removeAttr("disabled").removeClass("pdfemb-btndisabled"):a.find(".pdfemb-prev").attr("disabled","disabled").addClass("pdfemb-btndisabled");var b=c.fn.pdfEmbedder.annotationsLayerFactory.createAnnotationsLayerBuilder(a.find("div.pdfemb-inner-div")[0],e);null!=b&&(a.find("div.pdfembAnnotationLayer").remove(),b.setupAnnotations(A,a.data("newwindow")));null!==a.data("pageNumPending")&&(c.fn.pdfEmbedder.renderPage(a,
19
+ a.data("pageNumPending")),a.data("pageNumPending",null))}))}})};c.fn.pdfEmbedder.queueRenderPage=function(a,f,b){a.data("pageRendering")?a.data("pageNumPending",f):c.fn.pdfEmbedder.renderPage(a,f,b)};c.fn.pdfEmbedder.goFullScreen=function(a){a=c('<div class="pdfemb-fs-window"></div>');c(document.body).append(a)};c.fn.pdfEmbedder.changeZoom=function(a,f){var b=a.data("zoom"),e=b+f;a.data("zoom",e);a.find("span.pdfemb-zoom").text(e+"%");c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum"));a.data("fromZoom",
20
+ b).data("toZoom",e)};c.fn.pdfEmbedder.magnifyZoom=function(a,f){var b=a.data("zoom"),e=Math.floor(b*f);20>e&&(e=20);500<e&&(e=500);a.data("zoom",e);a.find("span.pdfemb-zoom").text(e+"%");c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum"),!0);a.data("fromZoom",b).data("toZoom",e)};c.fn.pdfEmbedder.addToolbar=function(a,f,b,e){var d=c("<div></div>",{"class":"pdfemb-toolbar pdfemb-toolbar"+(b?"-fixed":"-hover")+" "+(f?" pdfemb-toolbar-top":"pdfemb-toolbar-bottom")}),m=c('<button class="pdfemb-prev" title="'+
21
+ pdfemb_trans.objectL10n.prev+'"></button>');d.append(m);var r=c('<button class="pdfemb-next" title="'+pdfemb_trans.objectL10n.next+'"></button>');d.append(r);d.append(c('<div class="pdfemb-page-area">'+pdfemb_trans.objectL10n.page+' <span class="pdfemb-page-num">0</span> / <span class="pdfemb-page-count"></span></div>'));var u=c('<button class="pdfemb-zoomout" title="'+pdfemb_trans.objectL10n.zoomout+'"></button>');d.append(u);var v=c('<button class="pdfemb-zoomin" title="'+pdfemb_trans.objectL10n.zoomin+
22
+ '"></button>');d.append(v);d.append(c("<div>"+pdfemb_trans.objectL10n.zoom+' <span class="pdfemb-zoom">100%</span></div>'));e&&d.append(c("<div>"+pdfemb_trans.objectL10n.secure+"</div>"));f?a.prepend(d):a.append(d);m.on("click",function(b){1>=a.data("pagenum")||(a.data("pagenum",a.data("pagenum")-1),c.fn.pdfEmbedder.queueRenderPage(a,a.data("pagenum")),pdfembPremiumJumpToTop(a))});r.on("click",function(b){a.data("pagenum")>=a.data("pdfDoc").numPages||(a.data("pagenum",a.data("pagenum")+1),c.fn.pdfEmbedder.queueRenderPage(a,
23
+ a.data("pagenum")),pdfembPremiumJumpToTop(a))});v.on("click",function(b){500<=a.data("zoom")||c.fn.pdfEmbedder.changeZoom(a,10)});u.on("click",function(b){20>=a.data("zoom")||c.fn.pdfEmbedder.changeZoom(a,-10)});pdfembAddMoreToolbar(c,d,a);b||(a.on("mouseenter",function(b){b=a.find("div.pdfemb-toolbar-hover");!0!==b.data("no-hover")&&b.show()}),a.on("mouseleave",function(b){a.find("div.pdfemb-toolbar-hover").hide()}));pdfemb_trans.poweredby&&d.append(c("<div></div>",{"class":"pdfemb-poweredby"}).append(c('<a href="https://wp-pdf.com/?utm_source=Poweredby&utm_medium=freemium&utm_campaign=Freemium" target="_blank">wp-pdf.com</a>')))};
24
+ PDFJS.workerSrc=pdfemb_trans.worker_src;PDFJS.cMapUrl=pdfemb_trans.cmap_url;PDFJS.cMapPacked=!0;c(".pdfemb-viewer").pdfEmbedder()});
js/pdfemb-embed-pdf.js CHANGED
@@ -3,11 +3,11 @@
3
  jQuery(document).ready(function ($) {
4
 
5
  $.fn.pdfEmbedder = function() {
6
-
7
  this.each(function(index, rawDivContainer) {
8
-
9
  var divContainer = $(rawDivContainer);
10
-
11
  divContainer.append($('<div></div>', {'class': 'pdfemb-loadingmsg'}).append(document.createTextNode(pdfemb_trans.objectL10n.loading)));
12
 
13
  // Disable right click?
@@ -151,13 +151,19 @@ jQuery(document).ready(function ($) {
151
  }, 100);
152
  });
153
  };
154
-
155
  var callback = function(pdf, showIsSecure) {
156
-
157
  /**
158
  * Asynchronously downloads PDF.
159
  */
160
-
 
 
 
 
 
 
161
  PDFJS.getDocument(pdf).then(
162
  function(pdfDoc_) {
163
  initPdfDoc(pdfDoc_, showIsSecure)
@@ -172,7 +178,7 @@ jQuery(document).ready(function ($) {
172
  divContainer.empty().append($('<div></div>', {'class': 'pdfemb-errormsg'}).append(msgnode));
173
  }
174
  );
175
-
176
  };
177
 
178
  if (divContainer.data('pdfDoc')) {
@@ -185,7 +191,7 @@ jQuery(document).ready(function ($) {
185
  });
186
 
187
  return this;
188
-
189
  };
190
 
191
 
@@ -610,7 +616,7 @@ jQuery(document).ready(function ($) {
610
  }
611
  };
612
 
613
- // Apply plugin to relevant divs/};
614
 
615
  PDFJS.workerSrc = pdfemb_trans.worker_src;
616
  PDFJS.cMapUrl = pdfemb_trans.cmap_url;
3
  jQuery(document).ready(function ($) {
4
 
5
  $.fn.pdfEmbedder = function() {
6
+
7
  this.each(function(index, rawDivContainer) {
8
+
9
  var divContainer = $(rawDivContainer);
10
+
11
  divContainer.append($('<div></div>', {'class': 'pdfemb-loadingmsg'}).append(document.createTextNode(pdfemb_trans.objectL10n.loading)));
12
 
13
  // Disable right click?
151
  }, 100);
152
  });
153
  };
154
+
155
  var callback = function(pdf, showIsSecure) {
156
+
157
  /**
158
  * Asynchronously downloads PDF.
159
  */
160
+
161
+ if (pdf === null) {
162
+ divContainer.empty().append($('<div></div>', {'class': 'pdfemb-errormsg'}).append(msgnode = $('<span></span>').append(
163
+ document.createTextNode('Failed to load and decrypt PDF'))));
164
+ return;
165
+ }
166
+
167
  PDFJS.getDocument(pdf).then(
168
  function(pdfDoc_) {
169
  initPdfDoc(pdfDoc_, showIsSecure)
178
  divContainer.empty().append($('<div></div>', {'class': 'pdfemb-errormsg'}).append(msgnode));
179
  }
180
  );
181
+
182
  };
183
 
184
  if (divContainer.data('pdfDoc')) {
191
  });
192
 
193
  return this;
194
+
195
  };
196
 
197
 
616
  }
617
  };
618
 
619
+ // Apply plugin to relevant divs
620
 
621
  PDFJS.workerSrc = pdfemb_trans.worker_src;
622
  PDFJS.cMapUrl = pdfemb_trans.cmap_url;
js/pdfjs/compatibility.min.js CHANGED
@@ -1,5 +1,5 @@
1
  "undefined"===typeof PDFJS&&(("undefined"!==typeof window?window:this).PDFJS={});
2
- (function(){function a(a,d){return new b(this.slice(a,d))}function c(a,b){2>arguments.length&&(b=0);for(var c=0,g=a.length;c<g;++c,++b)this[b]=a[c]&255}function b(b){var d,e,g;if("number"===typeof b)for(d=[],e=0;e<b;++e)d[e]=0;else if("slice"in b)d=b.slice(0);else for(d=[],e=0,g=b.length;e<g;++e)d[e]=b[e];d.subarray=a;d.buffer=d;d.byteLength=d.length;d.set=c;"object"===typeof b&&b.buffer&&(d.buffer=b.buffer);return d}"undefined"!==typeof Uint8Array?("undefined"===typeof Uint8Array.prototype.subarray&&
3
  (Uint8Array.prototype.subarray=function(b,a){return new Uint8Array(this.slice(b,a))},Float32Array.prototype.subarray=function(b,a){return new Float32Array(this.slice(b,a))}),"undefined"===typeof Float64Array&&(window.Float64Array=Float32Array)):(window.Uint8Array=b,window.Int8Array=b,window.Uint32Array=b,window.Int32Array=b,window.Uint16Array=b,window.Float32Array=b,window.Float64Array=b)})();(function(){window.URL||(window.URL=window.webkitURL)})();
4
  (function(){if("undefined"!==typeof Object.defineProperty){var a=!0;try{Object.defineProperty(new Image,"id",{value:"test"});var c=function(){};c.prototype={get id(){}};Object.defineProperty(new c,"id",{value:"",configurable:!0,enumerable:!0,writable:!1})}catch(b){a=!1}if(a)return}Object.defineProperty=function(b,a,c){delete b[a];"get"in c&&b.__defineGetter__(a,c.get);"set"in c&&b.__defineSetter__(a,c.set);"value"in c&&(b.__defineSetter__(a,function(b){this.__defineGetter__(a,function(){return b});
5
  return b}),b[a]=c.value)}})();
1
  "undefined"===typeof PDFJS&&(("undefined"!==typeof window?window:this).PDFJS={});
2
+ (function(){function a(a,d){return new b(this.slice(a,d))}function c(b,a){2>arguments.length&&(a=0);for(var c=0,g=b.length;c<g;++c,++a)this[a]=b[c]&255}function b(b){var d,e,g;if("number"===typeof b)for(d=[],e=0;e<b;++e)d[e]=0;else if("slice"in b)d=b.slice(0);else for(d=[],e=0,g=b.length;e<g;++e)d[e]=b[e];d.subarray=a;d.buffer=d;d.byteLength=d.length;d.set=c;"object"===typeof b&&b.buffer&&(d.buffer=b.buffer);return d}"undefined"!==typeof Uint8Array?("undefined"===typeof Uint8Array.prototype.subarray&&
3
  (Uint8Array.prototype.subarray=function(b,a){return new Uint8Array(this.slice(b,a))},Float32Array.prototype.subarray=function(b,a){return new Float32Array(this.slice(b,a))}),"undefined"===typeof Float64Array&&(window.Float64Array=Float32Array)):(window.Uint8Array=b,window.Int8Array=b,window.Uint32Array=b,window.Int32Array=b,window.Uint16Array=b,window.Float32Array=b,window.Float64Array=b)})();(function(){window.URL||(window.URL=window.webkitURL)})();
4
  (function(){if("undefined"!==typeof Object.defineProperty){var a=!0;try{Object.defineProperty(new Image,"id",{value:"test"});var c=function(){};c.prototype={get id(){}};Object.defineProperty(new c,"id",{value:"",configurable:!0,enumerable:!0,writable:!1})}catch(b){a=!1}if(a)return}Object.defineProperty=function(b,a,c){delete b[a];"get"in c&&b.__defineGetter__(a,c.get);"set"in c&&b.__defineSetter__(a,c.set);"value"in c&&(b.__defineSetter__(a,function(b){this.__defineGetter__(a,function(){return b});
5
  return b}),b[a]=c.value)}})();
js/pdfjs/pdf.js CHANGED
@@ -28,8 +28,8 @@ factory((root.pdfjsDistBuildPdf = {}));
28
  // Use strict in our context only - users might not want it
29
  'use strict';
30
 
31
- var pdfjsVersion = '1.4.93';
32
- var pdfjsBuild = '05917b6';
33
 
34
  var pdfjsFilePath =
35
  typeof document !== 'undefined' && document.currentScript ?
@@ -699,6 +699,55 @@ function stringToBytes(str) {
699
  return bytes;
700
  }
701
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
702
  function string32(value) {
703
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
704
  (value >> 8) & 0xff, value & 0xff);
@@ -2483,6 +2532,8 @@ exports.UnexpectedResponseException = UnexpectedResponseException;
2483
  exports.UnknownErrorException = UnknownErrorException;
2484
  exports.Util = Util;
2485
  exports.XRefParseException = XRefParseException;
 
 
2486
  exports.assert = assert;
2487
  exports.bytesToString = bytesToString;
2488
  exports.combineUrl = combineUrl;
@@ -7656,15 +7707,19 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
7656
  }
7657
  }
7658
 
7659
- if (simpleFillText && !accent) {
7660
- // common case
7661
- ctx.fillText(character, scaledX, scaledY);
7662
- } else {
7663
- this.paintChar(character, scaledX, scaledY);
7664
- if (accent) {
7665
- scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
7666
- scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
7667
- this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
 
 
 
 
7668
  }
7669
  }
7670
 
28
  // Use strict in our context only - users might not want it
29
  'use strict';
30
 
31
+ var pdfjsVersion = '1.4.129';
32
+ var pdfjsBuild = '4065a21';
33
 
34
  var pdfjsFilePath =
35
  typeof document !== 'undefined' && document.currentScript ?
699
  return bytes;
700
  }
701
 
702
+ /**
703
+ * Gets length of the array (Array, Uint8Array, or string) in bytes.
704
+ * @param {Array|Uint8Array|string} arr
705
+ * @returns {number}
706
+ */
707
+ function arrayByteLength(arr) {
708
+ if (arr.length !== undefined) {
709
+ return arr.length;
710
+ }
711
+ assert(arr.byteLength !== undefined);
712
+ return arr.byteLength;
713
+ }
714
+
715
+ /**
716
+ * Combines array items (arrays) into single Uint8Array object.
717
+ * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string).
718
+ * @returns {Uint8Array}
719
+ */
720
+ function arraysToBytes(arr) {
721
+ // Shortcut: if first and only item is Uint8Array, return it.
722
+ if (arr.length === 1 && (arr[0] instanceof Uint8Array)) {
723
+ return arr[0];
724
+ }
725
+ var resultLength = 0;
726
+ var i, ii = arr.length;
727
+ var item, itemLength ;
728
+ for (i = 0; i < ii; i++) {
729
+ item = arr[i];
730
+ itemLength = arrayByteLength(item);
731
+ resultLength += itemLength;
732
+ }
733
+ var pos = 0;
734
+ var data = new Uint8Array(resultLength);
735
+ for (i = 0; i < ii; i++) {
736
+ item = arr[i];
737
+ if (!(item instanceof Uint8Array)) {
738
+ if (typeof item === 'string') {
739
+ item = stringToBytes(item);
740
+ } else {
741
+ item = new Uint8Array(item);
742
+ }
743
+ }
744
+ itemLength = item.byteLength;
745
+ data.set(item, pos);
746
+ pos += itemLength;
747
+ }
748
+ return data;
749
+ }
750
+
751
  function string32(value) {
752
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
753
  (value >> 8) & 0xff, value & 0xff);
2532
  exports.UnknownErrorException = UnknownErrorException;
2533
  exports.Util = Util;
2534
  exports.XRefParseException = XRefParseException;
2535
+ exports.arrayByteLength = arrayByteLength;
2536
+ exports.arraysToBytes = arraysToBytes;
2537
  exports.assert = assert;
2538
  exports.bytesToString = bytesToString;
2539
  exports.combineUrl = combineUrl;
7707
  }
7708
  }
7709
 
7710
+ // Only attempt to draw the glyph if it is actually in the embedded font
7711
+ // file or if there isn't a font file so the fallback font is shown.
7712
+ if (glyph.isInFont || font.missingFile) {
7713
+ if (simpleFillText && !accent) {
7714
+ // common case
7715
+ ctx.fillText(character, scaledX, scaledY);
7716
+ } else {
7717
+ this.paintChar(character, scaledX, scaledY);
7718
+ if (accent) {
7719
+ scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
7720
+ scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
7721
+ this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
7722
+ }
7723
  }
7724
  }
7725
 
js/pdfjs/pdf.min.js CHANGED
@@ -28,8 +28,8 @@ factory((root.pdfjsDistBuildPdf = {}));
28
  // Use strict in our context only - users might not want it
29
  'use strict';
30
 
31
- var pdfjsVersion = '1.4.93';
32
- var pdfjsBuild = '05917b6';
33
 
34
  var pdfjsFilePath =
35
  typeof document !== 'undefined' && document.currentScript ?
@@ -699,6 +699,55 @@ function stringToBytes(str) {
699
  return bytes;
700
  }
701
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
702
  function string32(value) {
703
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
704
  (value >> 8) & 0xff, value & 0xff);
@@ -2483,6 +2532,8 @@ exports.UnexpectedResponseException = UnexpectedResponseException;
2483
  exports.UnknownErrorException = UnknownErrorException;
2484
  exports.Util = Util;
2485
  exports.XRefParseException = XRefParseException;
 
 
2486
  exports.assert = assert;
2487
  exports.bytesToString = bytesToString;
2488
  exports.combineUrl = combineUrl;
@@ -7656,15 +7707,19 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
7656
  }
7657
  }
7658
 
7659
- if (simpleFillText && !accent) {
7660
- // common case
7661
- ctx.fillText(character, scaledX, scaledY);
7662
- } else {
7663
- this.paintChar(character, scaledX, scaledY);
7664
- if (accent) {
7665
- scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
7666
- scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
7667
- this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
 
 
 
 
7668
  }
7669
  }
7670
 
28
  // Use strict in our context only - users might not want it
29
  'use strict';
30
 
31
+ var pdfjsVersion = '1.4.129';
32
+ var pdfjsBuild = '4065a21';
33
 
34
  var pdfjsFilePath =
35
  typeof document !== 'undefined' && document.currentScript ?
699
  return bytes;
700
  }
701
 
702
+ /**
703
+ * Gets length of the array (Array, Uint8Array, or string) in bytes.
704
+ * @param {Array|Uint8Array|string} arr
705
+ * @returns {number}
706
+ */
707
+ function arrayByteLength(arr) {
708
+ if (arr.length !== undefined) {
709
+ return arr.length;
710
+ }
711
+ assert(arr.byteLength !== undefined);
712
+ return arr.byteLength;
713
+ }
714
+
715
+ /**
716
+ * Combines array items (arrays) into single Uint8Array object.
717
+ * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string).
718
+ * @returns {Uint8Array}
719
+ */
720
+ function arraysToBytes(arr) {
721
+ // Shortcut: if first and only item is Uint8Array, return it.
722
+ if (arr.length === 1 && (arr[0] instanceof Uint8Array)) {
723
+ return arr[0];
724
+ }
725
+ var resultLength = 0;
726
+ var i, ii = arr.length;
727
+ var item, itemLength ;
728
+ for (i = 0; i < ii; i++) {
729
+ item = arr[i];
730
+ itemLength = arrayByteLength(item);
731
+ resultLength += itemLength;
732
+ }
733
+ var pos = 0;
734
+ var data = new Uint8Array(resultLength);
735
+ for (i = 0; i < ii; i++) {
736
+ item = arr[i];
737
+ if (!(item instanceof Uint8Array)) {
738
+ if (typeof item === 'string') {
739
+ item = stringToBytes(item);
740
+ } else {
741
+ item = new Uint8Array(item);
742
+ }
743
+ }
744
+ itemLength = item.byteLength;
745
+ data.set(item, pos);
746
+ pos += itemLength;
747
+ }
748
+ return data;
749
+ }
750
+
751
  function string32(value) {
752
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
753
  (value >> 8) & 0xff, value & 0xff);
2532
  exports.UnknownErrorException = UnknownErrorException;
2533
  exports.Util = Util;
2534
  exports.XRefParseException = XRefParseException;
2535
+ exports.arrayByteLength = arrayByteLength;
2536
+ exports.arraysToBytes = arraysToBytes;
2537
  exports.assert = assert;
2538
  exports.bytesToString = bytesToString;
2539
  exports.combineUrl = combineUrl;
7707
  }
7708
  }
7709
 
7710
+ // Only attempt to draw the glyph if it is actually in the embedded font
7711
+ // file or if there isn't a font file so the fallback font is shown.
7712
+ if (glyph.isInFont || font.missingFile) {
7713
+ if (simpleFillText && !accent) {
7714
+ // common case
7715
+ ctx.fillText(character, scaledX, scaledY);
7716
+ } else {
7717
+ this.paintChar(character, scaledX, scaledY);
7718
+ if (accent) {
7719
+ scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
7720
+ scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
7721
+ this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
7722
+ }
7723
  }
7724
  }
7725
 
js/pdfjs/pdf.worker.js CHANGED
@@ -28,8 +28,8 @@ factory((root.pdfjsDistBuildPdfWorker = {}));
28
  // Use strict in our context only - users might not want it
29
  'use strict';
30
 
31
- var pdfjsVersion = '1.4.93';
32
- var pdfjsBuild = '05917b6';
33
 
34
  var pdfjsFilePath =
35
  typeof document !== 'undefined' && document.currentScript ?
@@ -1650,264 +1650,6 @@ exports.JpegImage = JpegImage;
1650
  }));
1651
 
1652
 
1653
-
1654
-
1655
- var NetworkManager = (function NetworkManagerClosure() {
1656
-
1657
- var OK_RESPONSE = 200;
1658
- var PARTIAL_CONTENT_RESPONSE = 206;
1659
-
1660
- function NetworkManager(url, args) {
1661
- this.url = url;
1662
- args = args || {};
1663
- this.isHttp = /^https?:/i.test(url);
1664
- this.httpHeaders = (this.isHttp && args.httpHeaders) || {};
1665
- this.withCredentials = args.withCredentials || false;
1666
- this.getXhr = args.getXhr ||
1667
- function NetworkManager_getXhr() {
1668
- return new XMLHttpRequest();
1669
- };
1670
-
1671
- this.currXhrId = 0;
1672
- this.pendingRequests = Object.create(null);
1673
- this.loadedRequests = Object.create(null);
1674
- }
1675
-
1676
- function getArrayBuffer(xhr) {
1677
- var data = xhr.response;
1678
- if (typeof data !== 'string') {
1679
- return data;
1680
- }
1681
- var length = data.length;
1682
- var array = new Uint8Array(length);
1683
- for (var i = 0; i < length; i++) {
1684
- array[i] = data.charCodeAt(i) & 0xFF;
1685
- }
1686
- return array.buffer;
1687
- }
1688
-
1689
- var supportsMozChunked = (function supportsMozChunkedClosure() {
1690
- try {
1691
- var x = new XMLHttpRequest();
1692
- // Firefox 37- required .open() to be called before setting responseType.
1693
- // https://bugzilla.mozilla.org/show_bug.cgi?id=707484
1694
- // Even though the URL is not visited, .open() could fail if the URL is
1695
- // blocked, e.g. via the connect-src CSP directive or the NoScript addon.
1696
- // When this error occurs, this feature detection method will mistakenly
1697
- // report that moz-chunked-arraybuffer is not supported in Firefox 37-.
1698
- x.open('GET', 'https://example.com');
1699
- x.responseType = 'moz-chunked-arraybuffer';
1700
- return x.responseType === 'moz-chunked-arraybuffer';
1701
- } catch (e) {
1702
- return false;
1703
- }
1704
- })();
1705
-
1706
- NetworkManager.prototype = {
1707
- requestRange: function NetworkManager_requestRange(begin, end, listeners) {
1708
- var args = {
1709
- begin: begin,
1710
- end: end
1711
- };
1712
- for (var prop in listeners) {
1713
- args[prop] = listeners[prop];
1714
- }
1715
- return this.request(args);
1716
- },
1717
-
1718
- requestFull: function NetworkManager_requestFull(listeners) {
1719
- return this.request(listeners);
1720
- },
1721
-
1722
- request: function NetworkManager_request(args) {
1723
- var xhr = this.getXhr();
1724
- var xhrId = this.currXhrId++;
1725
- var pendingRequest = this.pendingRequests[xhrId] = {
1726
- xhr: xhr
1727
- };
1728
-
1729
- xhr.open('GET', this.url);
1730
- xhr.withCredentials = this.withCredentials;
1731
- for (var property in this.httpHeaders) {
1732
- var value = this.httpHeaders[property];
1733
- if (typeof value === 'undefined') {
1734
- continue;
1735
- }
1736
- xhr.setRequestHeader(property, value);
1737
- }
1738
- if (this.isHttp && 'begin' in args && 'end' in args) {
1739
- var rangeStr = args.begin + '-' + (args.end - 1);
1740
- xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
1741
- pendingRequest.expectedStatus = 206;
1742
- } else {
1743
- pendingRequest.expectedStatus = 200;
1744
- }
1745
-
1746
- var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;
1747
- if (useMozChunkedLoading) {
1748
- xhr.responseType = 'moz-chunked-arraybuffer';
1749
- pendingRequest.onProgressiveData = args.onProgressiveData;
1750
- pendingRequest.mozChunked = true;
1751
- } else {
1752
- xhr.responseType = 'arraybuffer';
1753
- }
1754
-
1755
- if (args.onError) {
1756
- xhr.onerror = function(evt) {
1757
- args.onError(xhr.status);
1758
- };
1759
- }
1760
- xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
1761
- xhr.onprogress = this.onProgress.bind(this, xhrId);
1762
-
1763
- pendingRequest.onHeadersReceived = args.onHeadersReceived;
1764
- pendingRequest.onDone = args.onDone;
1765
- pendingRequest.onError = args.onError;
1766
- pendingRequest.onProgress = args.onProgress;
1767
-
1768
- xhr.send(null);
1769
-
1770
- return xhrId;
1771
- },
1772
-
1773
- onProgress: function NetworkManager_onProgress(xhrId, evt) {
1774
- var pendingRequest = this.pendingRequests[xhrId];
1775
- if (!pendingRequest) {
1776
- // Maybe abortRequest was called...
1777
- return;
1778
- }
1779
-
1780
- if (pendingRequest.mozChunked) {
1781
- var chunk = getArrayBuffer(pendingRequest.xhr);
1782
- pendingRequest.onProgressiveData(chunk);
1783
- }
1784
-
1785
- var onProgress = pendingRequest.onProgress;
1786
- if (onProgress) {
1787
- onProgress(evt);
1788
- }
1789
- },
1790
-
1791
- onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
1792
- var pendingRequest = this.pendingRequests[xhrId];
1793
- if (!pendingRequest) {
1794
- // Maybe abortRequest was called...
1795
- return;
1796
- }
1797
-
1798
- var xhr = pendingRequest.xhr;
1799
- if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
1800
- pendingRequest.onHeadersReceived();
1801
- delete pendingRequest.onHeadersReceived;
1802
- }
1803
-
1804
- if (xhr.readyState !== 4) {
1805
- return;
1806
- }
1807
-
1808
- if (!(xhrId in this.pendingRequests)) {
1809
- // The XHR request might have been aborted in onHeadersReceived()
1810
- // callback, in which case we should abort request
1811
- return;
1812
- }
1813
-
1814
- delete this.pendingRequests[xhrId];
1815
-
1816
- // success status == 0 can be on ftp, file and other protocols
1817
- if (xhr.status === 0 && this.isHttp) {
1818
- if (pendingRequest.onError) {
1819
- pendingRequest.onError(xhr.status);
1820
- }
1821
- return;
1822
- }
1823
- var xhrStatus = xhr.status || OK_RESPONSE;
1824
-
1825
- // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
1826
- // "A server MAY ignore the Range header". This means it's possible to
1827
- // get a 200 rather than a 206 response from a range request.
1828
- var ok_response_on_range_request =
1829
- xhrStatus === OK_RESPONSE &&
1830
- pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
1831
-
1832
- if (!ok_response_on_range_request &&
1833
- xhrStatus !== pendingRequest.expectedStatus) {
1834
- if (pendingRequest.onError) {
1835
- pendingRequest.onError(xhr.status);
1836
- }
1837
- return;
1838
- }
1839
-
1840
- this.loadedRequests[xhrId] = true;
1841
-
1842
- var chunk = getArrayBuffer(xhr);
1843
- if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
1844
- var rangeHeader = xhr.getResponseHeader('Content-Range');
1845
- var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
1846
- var begin = parseInt(matches[1], 10);
1847
- pendingRequest.onDone({
1848
- begin: begin,
1849
- chunk: chunk
1850
- });
1851
- } else if (pendingRequest.onProgressiveData) {
1852
- pendingRequest.onDone(null);
1853
- } else if (chunk) {
1854
- pendingRequest.onDone({
1855
- begin: 0,
1856
- chunk: chunk
1857
- });
1858
- } else if (pendingRequest.onError) {
1859
- pendingRequest.onError(xhr.status);
1860
- }
1861
- },
1862
-
1863
- hasPendingRequests: function NetworkManager_hasPendingRequests() {
1864
- for (var xhrId in this.pendingRequests) {
1865
- return true;
1866
- }
1867
- return false;
1868
- },
1869
-
1870
- getRequestXhr: function NetworkManager_getXhr(xhrId) {
1871
- return this.pendingRequests[xhrId].xhr;
1872
- },
1873
-
1874
- isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
1875
- return !!(this.pendingRequests[xhrId].onProgressiveData);
1876
- },
1877
-
1878
- isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
1879
- return xhrId in this.pendingRequests;
1880
- },
1881
-
1882
- isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
1883
- return xhrId in this.loadedRequests;
1884
- },
1885
-
1886
- abortAllRequests: function NetworkManager_abortAllRequests() {
1887
- for (var xhrId in this.pendingRequests) {
1888
- this.abortRequest(xhrId | 0);
1889
- }
1890
- },
1891
-
1892
- abortRequest: function NetworkManager_abortRequest(xhrId) {
1893
- var xhr = this.pendingRequests[xhrId].xhr;
1894
- delete this.pendingRequests[xhrId];
1895
- xhr.abort();
1896
- }
1897
- };
1898
-
1899
- return NetworkManager;
1900
- })();
1901
-
1902
- (function (root, factory) {
1903
- {
1904
- factory((root.pdfjsCoreNetwork = {}));
1905
- }
1906
- }(this, function (exports) {
1907
- exports.NetworkManager = NetworkManager;
1908
- }));
1909
-
1910
-
1911
  (function (root, factory) {
1912
  {
1913
  factory((root.pdfjsSharedGlobal = {}));
@@ -2916,6 +2658,55 @@ function stringToBytes(str) {
2916
  return bytes;
2917
  }
2918
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2919
  function string32(value) {
2920
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
2921
  (value >> 8) & 0xff, value & 0xff);
@@ -4700,6 +4491,8 @@ exports.UnexpectedResponseException = UnexpectedResponseException;
4700
  exports.UnknownErrorException = UnknownErrorException;
4701
  exports.Util = Util;
4702
  exports.XRefParseException = XRefParseException;
 
 
4703
  exports.assert = assert;
4704
  exports.bytesToString = bytesToString;
4705
  exports.combineUrl = combineUrl;
@@ -4743,6 +4536,8 @@ exports.warn = warn;
4743
  }(this, function (exports, sharedUtil) {
4744
 
4745
  var MissingDataException = sharedUtil.MissingDataException;
 
 
4746
  var assert = sharedUtil.assert;
4747
  var createPromiseCapability = sharedUtil.createPromiseCapability;
4748
  var isInt = sharedUtil.isInt;
@@ -4994,37 +4789,16 @@ var ChunkedStream = (function ChunkedStreamClosure() {
4994
 
4995
  var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
4996
 
4997
- function ChunkedStreamManager(length, chunkSize, url, args) {
 
 
4998
  this.stream = new ChunkedStream(length, chunkSize, this);
4999
  this.length = length;
5000
  this.chunkSize = chunkSize;
5001
- this.url = url;
 
5002
  this.disableAutoFetch = args.disableAutoFetch;
5003
- var msgHandler = this.msgHandler = args.msgHandler;
5004
-
5005
- if (args.chunkedViewerLoading) {
5006
- msgHandler.on('OnDataRange', this.onReceiveData.bind(this));
5007
- msgHandler.on('OnDataProgress', this.onProgress.bind(this));
5008
- this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
5009
- msgHandler.send('RequestDataRange', { begin: begin, end: end });
5010
- };
5011
- } else {
5012
-
5013
- var getXhr = function getXhr() {
5014
- return new XMLHttpRequest();
5015
- };
5016
- this.networkManager = new NetworkManager(this.url, {
5017
- getXhr: getXhr,
5018
- httpHeaders: args.httpHeaders,
5019
- withCredentials: args.withCredentials
5020
- });
5021
- this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
5022
- this.networkManager.requestRange(begin, end, {
5023
- onDone: this.onReceiveData.bind(this),
5024
- onProgress: this.onProgress.bind(this)
5025
- });
5026
- };
5027
- }
5028
 
5029
  this.currRequestId = 0;
5030
 
@@ -5032,12 +4806,9 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
5032
  this.requestsByChunk = Object.create(null);
5033
  this.promisesByRequest = Object.create(null);
5034
  this.progressiveDataLength = 0;
 
5035
 
5036
  this._loadedStreamCapability = createPromiseCapability();
5037
-
5038
- if (args.initialData) {
5039
- this.onReceiveData({chunk: args.initialData});
5040
- }
5041
  }
5042
 
5043
  ChunkedStreamManager.prototype = {
@@ -5045,6 +4816,44 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
5045
  return this._loadedStreamCapability.promise;
5046
  },
5047
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5048
  // Get all the chunks that are not yet loaded and groups them into
5049
  // contiguous ranges to load in as few requests as possible
5050
  requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
@@ -5264,8 +5073,9 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
5264
  },
5265
 
5266
  abort: function ChunkedStreamManager_abort() {
5267
- if (this.networkManager) {
5268
- this.networkManager.abortAllRequests();
 
5269
  }
5270
  for(var requestId in this.promisesByRequest) {
5271
  var capability = this.promisesByRequest[requestId];
@@ -26143,7 +25953,7 @@ function getFontType(type, subtype) {
26143
 
26144
  var Glyph = (function GlyphClosure() {
26145
  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId,
26146
- isSpace) {
26147
  this.fontChar = fontChar;
26148
  this.unicode = unicode;
26149
  this.accent = accent;
@@ -26151,17 +25961,20 @@ var Glyph = (function GlyphClosure() {
26151
  this.vmetric = vmetric;
26152
  this.operatorListId = operatorListId;
26153
  this.isSpace = isSpace;
 
26154
  }
26155
 
26156
  Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width,
26157
- vmetric, operatorListId, isSpace) {
 
26158
  return this.fontChar === fontChar &&
26159
  this.unicode === unicode &&
26160
  this.accent === accent &&
26161
  this.width === width &&
26162
  this.vmetric === vmetric &&
26163
  this.operatorListId === operatorListId &&
26164
- this.isSpace === isSpace;
 
26165
  };
26166
 
26167
  return Glyph;
@@ -26420,6 +26233,7 @@ var Font = (function FontClosure() {
26420
  this.loadedName = properties.loadedName;
26421
  this.isType3Font = properties.isType3Font;
26422
  this.sizes = [];
 
26423
 
26424
  this.glyphCache = Object.create(null);
26425
 
@@ -27784,6 +27598,9 @@ var Font = (function FontClosure() {
27784
  }
27785
  for (i = 0, ii = records.length; i < ii; i++) {
27786
  var record = records[i];
 
 
 
27787
  var pos = start + stringsStart + record.offset;
27788
  if (pos + record.length > end) {
27789
  continue; // outside of name table, ignoring
@@ -28231,7 +28048,7 @@ var Font = (function FontClosure() {
28231
  assert(cid <= 0xffff, 'Max size of CID is 65,535');
28232
  var glyphId = -1;
28233
  if (isCidToGidMapEmpty) {
28234
- glyphId = charCode;
28235
  } else if (cidToGidMap[cid] !== undefined) {
28236
  glyphId = cidToGidMap[cid];
28237
  }
@@ -28759,6 +28576,7 @@ var Font = (function FontClosure() {
28759
  unicode = String.fromCharCode(unicode);
28760
  }
28761
 
 
28762
  // First try the toFontChar map, if it's not there then try falling
28763
  // back to the char code.
28764
  fontCharCode = this.toFontChar[charcode] || charcode;
@@ -28773,6 +28591,7 @@ var Font = (function FontClosure() {
28773
 
28774
  var accent = null;
28775
  if (this.seacMap && this.seacMap[charcode]) {
 
28776
  var seac = this.seacMap[charcode];
28777
  fontCharCode = seac.baseFontCharCode;
28778
  accent = {
@@ -28786,9 +28605,9 @@ var Font = (function FontClosure() {
28786
  var glyph = this.glyphCache[charcode];
28787
  if (!glyph ||
28788
  !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
28789
- operatorListId, isSpace)) {
28790
  glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
28791
- operatorListId, isSpace);
28792
  this.glyphCache[charcode] = glyph;
28793
  }
28794
  return glyph;
@@ -41567,21 +41386,18 @@ var LocalPdfManager = (function LocalPdfManagerClosure() {
41567
  })();
41568
 
41569
  var NetworkPdfManager = (function NetworkPdfManagerClosure() {
41570
- function NetworkPdfManager(docId, args, msgHandler) {
41571
  this._docId = docId;
41572
- this.msgHandler = msgHandler;
41573
 
41574
  var params = {
41575
- msgHandler: msgHandler,
41576
- httpHeaders: args.httpHeaders,
41577
- withCredentials: args.withCredentials,
41578
- chunkedViewerLoading: args.chunkedViewerLoading,
41579
  disableAutoFetch: args.disableAutoFetch,
41580
- initialData: args.initialData
41581
  };
41582
- this.streamManager = new ChunkedStreamManager(args.length,
41583
- args.rangeChunkSize,
41584
- args.url, params);
41585
  this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),
41586
  args.password);
41587
  }
@@ -41663,10 +41479,12 @@ var PasswordException = sharedUtil.PasswordException;
41663
  var PasswordResponses = sharedUtil.PasswordResponses;
41664
  var UnknownErrorException = sharedUtil.UnknownErrorException;
41665
  var XRefParseException = sharedUtil.XRefParseException;
 
 
 
41666
  var createPromiseCapability = sharedUtil.createPromiseCapability;
41667
  var error = sharedUtil.error;
41668
  var info = sharedUtil.info;
41669
- var isInt = sharedUtil.isInt;
41670
  var warn = sharedUtil.warn;
41671
  var Ref = corePrimitives.Ref;
41672
  var LocalPdfManager = corePdfManager.LocalPdfManager;
@@ -41704,6 +41522,221 @@ var WorkerTask = (function WorkerTaskClosure() {
41704
  return WorkerTask;
41705
  })();
41706
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41707
  var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
41708
  setup: function wphSetup(handler, port) {
41709
  var testMessageProcessed = false;
@@ -41810,7 +41843,6 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
41810
  var pdfManager;
41811
 
41812
  var source = data.source;
41813
- var disableRange = data.disableRange;
41814
  if (source.data) {
41815
  try {
41816
  pdfManager = new LocalPdfManager(docId, source.data, source.password);
@@ -41819,143 +41851,113 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
41819
  pdfManagerCapability.reject(ex);
41820
  }
41821
  return pdfManagerCapability.promise;
41822
- } else if (source.chunkedViewerLoading) {
41823
- try {
41824
- pdfManager = new NetworkPdfManager(docId, source, handler);
41825
- pdfManagerCapability.resolve(pdfManager);
41826
- } catch (ex) {
41827
- pdfManagerCapability.reject(ex);
 
 
 
41828
  }
 
 
41829
  return pdfManagerCapability.promise;
41830
  }
41831
 
41832
- var networkManager = new NetworkManager(source.url, {
41833
- httpHeaders: source.httpHeaders,
41834
- withCredentials: source.withCredentials
41835
- });
41836
- var cachedChunks = [];
41837
- var fullRequestXhrId = networkManager.requestFull({
41838
- onHeadersReceived: function onHeadersReceived() {
41839
- if (disableRange) {
41840
- return;
41841
- }
41842
-
41843
- var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);
41844
- if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {
41845
- return;
41846
- }
41847
-
41848
- var contentEncoding =
41849
- fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';
41850
- if (contentEncoding !== 'identity') {
41851
- return;
41852
- }
41853
 
41854
- var length = fullRequestXhr.getResponseHeader('Content-Length');
41855
- length = parseInt(length, 10);
41856
- if (!isInt(length)) {
41857
- return;
41858
- }
41859
- source.length = length;
41860
- if (length <= 2 * source.rangeChunkSize) {
41861
- // The file size is smaller than the size of two chunks, so it does
41862
- // not make any sense to abort the request and retry with a range
41863
- // request.
41864
- return;
41865
- }
41866
 
41867
- if (networkManager.isStreamingRequest(fullRequestXhrId)) {
41868
- // We can continue fetching when progressive loading is enabled,
41869
- // and we don't need the autoFetch feature.
41870
- source.disableAutoFetch = true;
41871
- } else {
41872
- // NOTE: by cancelling the full request, and then issuing range
41873
- // requests, there will be an issue for sites where you can only
41874
- // request the pdf once. However, if this is the case, then the
41875
- // server should not be returning that it can support range
41876
- // requests.
41877
- networkManager.abortRequest(fullRequestXhrId);
41878
- }
 
 
 
 
 
41879
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41880
  try {
41881
- pdfManager = new NetworkPdfManager(docId, source, handler);
41882
- pdfManagerCapability.resolve(pdfManager);
41883
- } catch (ex) {
41884
- pdfManagerCapability.reject(ex);
41885
- }
41886
- cancelXHRs = null;
41887
- },
41888
-
41889
- onProgressiveData: source.disableStream ? null :
41890
- function onProgressiveData(chunk) {
41891
- if (!pdfManager) {
41892
- cachedChunks.push(chunk);
41893
- return;
41894
- }
41895
- pdfManager.sendProgressiveData(chunk);
41896
- },
41897
-
41898
- onDone: function onDone(args) {
41899
- if (pdfManager) {
41900
- return; // already processed
41901
- }
41902
 
41903
- var pdfFile;
41904
- if (args === null) {
41905
- // TODO add some streaming manager, e.g. for unknown length files.
41906
- // The data was returned in the onProgressiveData, combining...
41907
- var pdfFileLength = 0, pos = 0;
41908
- cachedChunks.forEach(function (chunk) {
41909
- pdfFileLength += chunk.byteLength;
41910
- });
41911
- if (source.length && pdfFileLength !== source.length) {
41912
- warn('reported HTTP length is different from actual');
41913
  }
41914
- var pdfFileArray = new Uint8Array(pdfFileLength);
41915
- cachedChunks.forEach(function (chunk) {
41916
- pdfFileArray.set(new Uint8Array(chunk), pos);
41917
- pos += chunk.byteLength;
41918
- });
41919
- pdfFile = pdfFileArray.buffer;
41920
- } else {
41921
- pdfFile = args.chunk;
41922
- }
41923
 
41924
- // the data is array, instantiating directly from it
41925
- try {
41926
- pdfManager = new LocalPdfManager(docId, pdfFile, source.password);
41927
- pdfManagerCapability.resolve(pdfManager);
41928
- } catch (ex) {
41929
- pdfManagerCapability.reject(ex);
41930
- }
41931
- cancelXHRs = null;
41932
- },
41933
 
41934
- onError: function onError(status) {
41935
- var exception;
41936
- if (status === 404 || status === 0 && /^file:/.test(source.url)) {
41937
- exception = new MissingPDFException('Missing PDF "' +
41938
- source.url + '".');
41939
- handler.send('MissingPDF', exception);
41940
- } else {
41941
- exception = new UnexpectedResponseException(
41942
- 'Unexpected server response (' + status +
41943
- ') while retrieving PDF "' + source.url + '".', status);
41944
- handler.send('UnexpectedResponse', exception);
41945
  }
41946
- cancelXHRs = null;
41947
- },
41948
-
41949
- onProgress: function onProgress(evt) {
41950
- handler.send('DocProgress', {
41951
- loaded: evt.loaded,
41952
- total: evt.lengthComputable ? evt.total : source.length
41953
- });
41954
- }
41955
  });
41956
 
41957
  cancelXHRs = function () {
41958
- networkManager.abortRequest(fullRequestXhrId);
41959
  };
41960
 
41961
  return pdfManagerCapability.promise;
@@ -42296,11 +42298,603 @@ if (typeof window === 'undefined' &&
42296
  initializeWorker();
42297
  }
42298
 
 
42299
  exports.WorkerTask = WorkerTask;
42300
  exports.WorkerMessageHandler = WorkerMessageHandler;
42301
  }));
42302
 
42303
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42304
  }).call(pdfjsLibs);
42305
 
42306
  exports.PDFJS = pdfjsLibs.pdfjsSharedGlobal.PDFJS;
28
  // Use strict in our context only - users might not want it
29
  'use strict';
30
 
31
+ var pdfjsVersion = '1.4.129';
32
+ var pdfjsBuild = '4065a21';
33
 
34
  var pdfjsFilePath =
35
  typeof document !== 'undefined' && document.currentScript ?
1650
  }));
1651
 
1652
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1653
  (function (root, factory) {
1654
  {
1655
  factory((root.pdfjsSharedGlobal = {}));
2658
  return bytes;
2659
  }
2660
 
2661
+ /**
2662
+ * Gets length of the array (Array, Uint8Array, or string) in bytes.
2663
+ * @param {Array|Uint8Array|string} arr
2664
+ * @returns {number}
2665
+ */
2666
+ function arrayByteLength(arr) {
2667
+ if (arr.length !== undefined) {
2668
+ return arr.length;
2669
+ }
2670
+ assert(arr.byteLength !== undefined);
2671
+ return arr.byteLength;
2672
+ }
2673
+
2674
+ /**
2675
+ * Combines array items (arrays) into single Uint8Array object.
2676
+ * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string).
2677
+ * @returns {Uint8Array}
2678
+ */
2679
+ function arraysToBytes(arr) {
2680
+ // Shortcut: if first and only item is Uint8Array, return it.
2681
+ if (arr.length === 1 && (arr[0] instanceof Uint8Array)) {
2682
+ return arr[0];
2683
+ }
2684
+ var resultLength = 0;
2685
+ var i, ii = arr.length;
2686
+ var item, itemLength ;
2687
+ for (i = 0; i < ii; i++) {
2688
+ item = arr[i];
2689
+ itemLength = arrayByteLength(item);
2690
+ resultLength += itemLength;
2691
+ }
2692
+ var pos = 0;
2693
+ var data = new Uint8Array(resultLength);
2694
+ for (i = 0; i < ii; i++) {
2695
+ item = arr[i];
2696
+ if (!(item instanceof Uint8Array)) {
2697
+ if (typeof item === 'string') {
2698
+ item = stringToBytes(item);
2699
+ } else {
2700
+ item = new Uint8Array(item);
2701
+ }
2702
+ }
2703
+ itemLength = item.byteLength;
2704
+ data.set(item, pos);
2705
+ pos += itemLength;
2706
+ }
2707
+ return data;
2708
+ }
2709
+
2710
  function string32(value) {
2711
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
2712
  (value >> 8) & 0xff, value & 0xff);
4491
  exports.UnknownErrorException = UnknownErrorException;
4492
  exports.Util = Util;
4493
  exports.XRefParseException = XRefParseException;
4494
+ exports.arrayByteLength = arrayByteLength;
4495
+ exports.arraysToBytes = arraysToBytes;
4496
  exports.assert = assert;
4497
  exports.bytesToString = bytesToString;
4498
  exports.combineUrl = combineUrl;
4536
  }(this, function (exports, sharedUtil) {
4537
 
4538
  var MissingDataException = sharedUtil.MissingDataException;
4539
+ var arrayByteLength = sharedUtil.arrayByteLength;
4540
+ var arraysToBytes = sharedUtil.arraysToBytes;
4541
  var assert = sharedUtil.assert;
4542
  var createPromiseCapability = sharedUtil.createPromiseCapability;
4543
  var isInt = sharedUtil.isInt;
4789
 
4790
  var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
4791
 
4792
+ function ChunkedStreamManager(pdfNetworkStream, args) {
4793
+ var chunkSize = args.rangeChunkSize;
4794
+ var length = args.length;
4795
  this.stream = new ChunkedStream(length, chunkSize, this);
4796
  this.length = length;
4797
  this.chunkSize = chunkSize;
4798
+ this.pdfNetworkStream = pdfNetworkStream;
4799
+ this.url = args.url;
4800
  this.disableAutoFetch = args.disableAutoFetch;
4801
+ this.msgHandler = args.msgHandler;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4802
 
4803
  this.currRequestId = 0;
4804
 
4806
  this.requestsByChunk = Object.create(null);
4807
  this.promisesByRequest = Object.create(null);
4808
  this.progressiveDataLength = 0;
4809
+ this.aborted = false;
4810
 
4811
  this._loadedStreamCapability = createPromiseCapability();
 
 
 
 
4812
  }
4813
 
4814
  ChunkedStreamManager.prototype = {
4816
  return this._loadedStreamCapability.promise;
4817
  },
4818
 
4819
+ sendRequest: function ChunkedStreamManager_sendRequest(begin, end) {
4820
+ var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);
4821
+ if (!rangeReader.isStreamingSupported) {
4822
+ rangeReader.onProgress = this.onProgress.bind(this);
4823
+ }
4824
+ var chunks = [], loaded = 0;
4825
+ var manager = this;
4826
+ var promise = new Promise(function (resolve, reject) {
4827
+ var readChunk = function (chunk) {
4828
+ try {
4829
+ if (!chunk.done) {
4830
+ var data = chunk.value;
4831
+ chunks.push(data);
4832
+ loaded += arrayByteLength(data);
4833
+ if (rangeReader.isStreamingSupported) {
4834
+ manager.onProgress({loaded: loaded});
4835
+ }
4836
+ rangeReader.read().then(readChunk, reject);
4837
+ return;
4838
+ }
4839
+ var chunkData = arraysToBytes(chunks);
4840
+ chunks = null;
4841
+ resolve(chunkData);
4842
+ } catch (e) {
4843
+ reject(e);
4844
+ }
4845
+ };
4846
+ rangeReader.read().then(readChunk, reject);
4847
+ });
4848
+ promise.then(function (data) {
4849
+ if (this.aborted) {
4850
+ return; // ignoring any data after abort
4851
+ }
4852
+ this.onReceiveData({chunk: data, begin: begin});
4853
+ }.bind(this));
4854
+ // TODO check errors
4855
+ },
4856
+
4857
  // Get all the chunks that are not yet loaded and groups them into
4858
  // contiguous ranges to load in as few requests as possible
4859
  requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
5073
  },
5074
 
5075
  abort: function ChunkedStreamManager_abort() {
5076
+ this.aborted = true;
5077
+ if (this.pdfNetworkStream) {
5078
+ this.pdfNetworkStream.cancelAllRequests('abort');
5079
  }
5080
  for(var requestId in this.promisesByRequest) {
5081
  var capability = this.promisesByRequest[requestId];
25953
 
25954
  var Glyph = (function GlyphClosure() {
25955
  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId,
25956
+ isSpace, isInFont) {
25957
  this.fontChar = fontChar;
25958
  this.unicode = unicode;
25959
  this.accent = accent;
25961
  this.vmetric = vmetric;
25962
  this.operatorListId = operatorListId;
25963
  this.isSpace = isSpace;
25964
+ this.isInFont = isInFont;
25965
  }
25966
 
25967
  Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width,
25968
+ vmetric, operatorListId, isSpace,
25969
+ isInFont) {
25970
  return this.fontChar === fontChar &&
25971
  this.unicode === unicode &&
25972
  this.accent === accent &&
25973
  this.width === width &&
25974
  this.vmetric === vmetric &&
25975
  this.operatorListId === operatorListId &&
25976
+ this.isSpace === isSpace &&
25977
+ this.isInFont === isInFont;
25978
  };
25979
 
25980
  return Glyph;
26233
  this.loadedName = properties.loadedName;
26234
  this.isType3Font = properties.isType3Font;
26235
  this.sizes = [];
26236
+ this.missingFile = false;
26237
 
26238
  this.glyphCache = Object.create(null);
26239
 
27598
  }
27599
  for (i = 0, ii = records.length; i < ii; i++) {
27600
  var record = records[i];
27601
+ if (record.length <= 0) {
27602
+ continue; // Nothing to process, ignoring.
27603
+ }
27604
  var pos = start + stringsStart + record.offset;
27605
  if (pos + record.length > end) {
27606
  continue; // outside of name table, ignoring
28048
  assert(cid <= 0xffff, 'Max size of CID is 65,535');
28049
  var glyphId = -1;
28050
  if (isCidToGidMapEmpty) {
28051
+ glyphId = cid;
28052
  } else if (cidToGidMap[cid] !== undefined) {
28053
  glyphId = cidToGidMap[cid];
28054
  }
28576
  unicode = String.fromCharCode(unicode);
28577
  }
28578
 
28579
+ var isInFont = charcode in this.toFontChar;
28580
  // First try the toFontChar map, if it's not there then try falling
28581
  // back to the char code.
28582
  fontCharCode = this.toFontChar[charcode] || charcode;
28591
 
28592
  var accent = null;
28593
  if (this.seacMap && this.seacMap[charcode]) {
28594
+ isInFont = true;
28595
  var seac = this.seacMap[charcode];
28596
  fontCharCode = seac.baseFontCharCode;
28597
  accent = {
28605
  var glyph = this.glyphCache[charcode];
28606
  if (!glyph ||
28607
  !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
28608
+ operatorListId, isSpace, isInFont)) {
28609
  glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
28610
+ operatorListId, isSpace, isInFont);
28611
  this.glyphCache[charcode] = glyph;
28612
  }
28613
  return glyph;
41386
  })();
41387
 
41388
  var NetworkPdfManager = (function NetworkPdfManagerClosure() {
41389
+ function NetworkPdfManager(docId, pdfNetworkStream, args) {
41390
  this._docId = docId;
41391
+ this.msgHandler = args.msgHandler;
41392
 
41393
  var params = {
41394
+ msgHandler: args.msgHandler,
41395
+ url: args.url,
41396
+ length: args.length,
 
41397
  disableAutoFetch: args.disableAutoFetch,
41398
+ rangeChunkSize: args.rangeChunkSize
41399
  };
41400
+ this.streamManager = new ChunkedStreamManager(pdfNetworkStream, params);
 
 
41401
  this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),
41402
  args.password);
41403
  }
41479
  var PasswordResponses = sharedUtil.PasswordResponses;
41480
  var UnknownErrorException = sharedUtil.UnknownErrorException;
41481
  var XRefParseException = sharedUtil.XRefParseException;
41482
+ var arrayByteLength = sharedUtil.arrayByteLength;
41483
+ var arraysToBytes = sharedUtil.arraysToBytes;
41484
+ var assert = sharedUtil.assert;
41485
  var createPromiseCapability = sharedUtil.createPromiseCapability;
41486
  var error = sharedUtil.error;
41487
  var info = sharedUtil.info;
 
41488
  var warn = sharedUtil.warn;
41489
  var Ref = corePrimitives.Ref;
41490
  var LocalPdfManager = corePdfManager.LocalPdfManager;
41522
  return WorkerTask;
41523
  })();
41524
 
41525
+
41526
+ /** @implements {IPDFStream} */
41527
+ var PDFWorkerStream = (function PDFWorkerStreamClosure() {
41528
+ function PDFWorkerStream(params, msgHandler) {
41529
+ this._queuedChunks = [];
41530
+ var initialData = params.initialData;
41531
+ if (initialData && initialData.length > 0) {
41532
+ this._queuedChunks.push(initialData);
41533
+ }
41534
+ this._msgHandler = msgHandler;
41535
+
41536
+ this._isRangeSupported = !(params.disableRange);
41537
+ this._isStreamingSupported = !(params.disableStream);
41538
+ this._contentLength = params.length;
41539
+
41540
+ this._fullRequestReader = null;
41541
+ this._rangeReaders = [];
41542
+
41543
+ msgHandler.on('OnDataRange', this._onReceiveData.bind(this));
41544
+ msgHandler.on('OnDataProgress', this._onProgress.bind(this));
41545
+ }
41546
+ PDFWorkerStream.prototype = {
41547
+ _onReceiveData: function PDFWorkerStream_onReceiveData(args) {
41548
+ if (args.begin === undefined) {
41549
+ if (this._fullRequestReader) {
41550
+ this._fullRequestReader._enqueue(args.chunk);
41551
+ } else {
41552
+ this._queuedChunks.push(args.chunk);
41553
+ }
41554
+ } else {
41555
+ var found = this._rangeReaders.some(function (rangeReader) {
41556
+ if (rangeReader._begin !== args.begin) {
41557
+ return false;
41558
+ }
41559
+ rangeReader._enqueue(args.chunk);
41560
+ return true;
41561
+ });
41562
+ assert(found);
41563
+ }
41564
+ },
41565
+
41566
+ _onProgress: function PDFWorkerStream_onProgress(evt) {
41567
+ if (this._rangeReaders.length > 0) {
41568
+ // Reporting to first range reader.
41569
+ var firstReader = this._rangeReaders[0];
41570
+ if (firstReader.onProgress) {
41571
+ firstReader.onProgress({loaded: evt.loaded});
41572
+ }
41573
+ }
41574
+ },
41575
+
41576
+ _removeRangeReader: function PDFWorkerStream_removeRangeReader(reader) {
41577
+ var i = this._rangeReaders.indexOf(reader);
41578
+ if (i >= 0) {
41579
+ this._rangeReaders.splice(i, 1);
41580
+ }
41581
+ },
41582
+
41583
+ getFullReader: function PDFWorkerStream_getFullReader() {
41584
+ assert(!this._fullRequestReader);
41585
+ var queuedChunks = this._queuedChunks;
41586
+ this._queuedChunks = null;
41587
+ return new PDFWorkerStreamReader(this, queuedChunks);
41588
+ },
41589
+
41590
+ getRangeReader: function PDFWorkerStream_getRangeReader(begin, end) {
41591
+ var reader = new PDFWorkerStreamRangeReader(this, begin, end);
41592
+ this._msgHandler.send('RequestDataRange', { begin: begin, end: end });
41593
+ this._rangeReaders.push(reader);
41594
+ return reader;
41595
+ },
41596
+
41597
+ cancelAllRequests: function PDFWorkerStream_cancelAllRequests(reason) {
41598
+ if (this._fullRequestReader) {
41599
+ this._fullRequestReader.cancel(reason);
41600
+ }
41601
+ var readers = this._rangeReaders.slice(0);
41602
+ readers.forEach(function (rangeReader) {
41603
+ rangeReader.cancel(reason);
41604
+ });
41605
+ }
41606
+ };
41607
+
41608
+ /** @implements {IPDFStreamReader} */
41609
+ function PDFWorkerStreamReader(stream, queuedChunks) {
41610
+ this._stream = stream;
41611
+ this._done = false;
41612
+ this._queuedChunks = queuedChunks || [];
41613
+ this._requests = [];
41614
+ this._headersReady = Promise.resolve();
41615
+ stream._fullRequestReader = this;
41616
+
41617
+ this.onProgress = null; // not used
41618
+ }
41619
+ PDFWorkerStreamReader.prototype = {
41620
+ _enqueue: function PDFWorkerStreamReader_enqueue(chunk) {
41621
+ if (this._done) {
41622
+ return; // ignore new data
41623
+ }
41624
+ if (this._requests.length > 0) {
41625
+ var requestCapability = this._requests.shift();
41626
+ requestCapability.resolve({value: chunk, done: false});
41627
+ return;
41628
+ }
41629
+ this._queuedChunks.push(chunk);
41630
+ },
41631
+
41632
+ get headersReady() {
41633
+ return this._headersReady;
41634
+ },
41635
+
41636
+ get isRangeSupported() {
41637
+ return this._stream._isRangeSupported;
41638
+ },
41639
+
41640
+ get isStreamingSupported() {
41641
+ return this._stream._isStreamingSupported;
41642
+ },
41643
+
41644
+ get contentLength() {
41645
+ return this._stream._contentLength;
41646
+ },
41647
+
41648
+ read: function PDFWorkerStreamReader_read() {
41649
+ if (this._queuedChunks.length > 0) {
41650
+ var chunk = this._queuedChunks.shift();
41651
+ return Promise.resolve({value: chunk, done: false});
41652
+ }
41653
+ if (this._done) {
41654
+ return Promise.resolve({value: undefined, done: true});
41655
+ }
41656
+ var requestCapability = createPromiseCapability();
41657
+ this._requests.push(requestCapability);
41658
+ return requestCapability.promise;
41659
+ },
41660
+
41661
+ cancel: function PDFWorkerStreamReader_cancel(reason) {
41662
+ this._done = true;
41663
+ this._requests.forEach(function (requestCapability) {
41664
+ requestCapability.resolve({value: undefined, done: true});
41665
+ });
41666
+ this._requests = [];
41667
+ }
41668
+ };
41669
+
41670
+ /** @implements {IPDFStreamRangeReader} */
41671
+ function PDFWorkerStreamRangeReader(stream, begin, end) {
41672
+ this._stream = stream;
41673
+ this._begin = begin;
41674
+ this._end = end;
41675
+ this._queuedChunk = null;
41676
+ this._requests = [];
41677
+ this._done = false;
41678
+
41679
+ this.onProgress = null;
41680
+ }
41681
+ PDFWorkerStreamRangeReader.prototype = {
41682
+ _enqueue: function PDFWorkerStreamRangeReader_enqueue(chunk) {
41683
+ if (this._done) {
41684
+ return; // ignore new data
41685
+ }
41686
+ if (this._requests.length === 0) {
41687
+ this._queuedChunk = chunk;
41688
+ } else {
41689
+ var requestsCapability = this._requests.shift();
41690
+ requestsCapability.resolve({value: chunk, done: false});
41691
+ this._requests.forEach(function (requestCapability) {
41692
+ requestCapability.resolve({value: undefined, done: true});
41693
+ });
41694
+ this._requests = [];
41695
+ }
41696
+ this._done = true;
41697
+ this._stream._removeRangeReader(this);
41698
+ },
41699
+
41700
+ get isStreamingSupported() {
41701
+ return false;
41702
+ },
41703
+
41704
+ read: function PDFWorkerStreamRangeReader_read() {
41705
+ if (this._queuedChunk) {
41706
+ return Promise.resolve({value: this._queuedChunk, done: false});
41707
+ }
41708
+ if (this._done) {
41709
+ return Promise.resolve({value: undefined, done: true});
41710
+ }
41711
+ var requestCapability = createPromiseCapability();
41712
+ this._requests.push(requestCapability);
41713
+ return requestCapability.promise;
41714
+ },
41715
+
41716
+ cancel: function PDFWorkerStreamRangeReader_cancel(reason) {
41717
+ this._done = true;
41718
+ this._requests.forEach(function (requestCapability) {
41719
+ requestCapability.resolve({value: undefined, done: true});
41720
+ });
41721
+ this._requests = [];
41722
+ this._stream._removeRangeReader(this);
41723
+ }
41724
+ };
41725
+
41726
+ return PDFWorkerStream;
41727
+ })();
41728
+
41729
+ /** @type IPDFStream */
41730
+ var PDFNetworkStream;
41731
+
41732
+ /**
41733
+ * Sets PDFNetworkStream class to be used as alternative PDF data transport.
41734
+ * @param {IPDFStream} cls - the PDF data transport.
41735
+ */
41736
+ function setPDFNetworkStreamClass(cls) {
41737
+ PDFNetworkStream = cls;
41738
+ }
41739
+
41740
  var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
41741
  setup: function wphSetup(handler, port) {
41742
  var testMessageProcessed = false;
41843
  var pdfManager;
41844
 
41845
  var source = data.source;
 
41846
  if (source.data) {
41847
  try {
41848
  pdfManager = new LocalPdfManager(docId, source.data, source.password);
41851
  pdfManagerCapability.reject(ex);
41852
  }
41853
  return pdfManagerCapability.promise;
41854
+ }
41855
+
41856
+ var pdfStream;
41857
+ try {
41858
+ if (source.chunkedViewerLoading) {
41859
+ pdfStream = new PDFWorkerStream(source, handler);
41860
+ } else {
41861
+ assert(PDFNetworkStream, 'pdfjs/core/network module is not loaded');
41862
+ pdfStream = new PDFNetworkStream(data);
41863
  }
41864
+ } catch (ex) {
41865
+ pdfManagerCapability.reject(ex);
41866
  return pdfManagerCapability.promise;
41867
  }
41868
 
41869
+ var fullRequest = pdfStream.getFullReader();
41870
+ fullRequest.headersReady.then(function () {
41871
+ if (!fullRequest.isStreamingSupported ||
41872
+ !fullRequest.isRangeSupported) {
41873
+ // If stream or range are disabled, it's our only way to report
41874
+ // loading progress.
41875
+ fullRequest.onProgress = function (evt) {
41876
+ handler.send('DocProgress', {
41877
+ loaded: evt.loaded,
41878
+ total: evt.total
41879
+ });
41880
+ };
41881
+ }
 
 
 
 
 
 
 
 
41882
 
41883
+ if (!fullRequest.isRangeSupported) {
41884
+ return;
41885
+ }
 
 
 
 
 
 
 
 
 
41886
 
41887
+ // We don't need auto-fetch when streaming is enabled.
41888
+ var disableAutoFetch = source.disableAutoFetch ||
41889
+ fullRequest.isStreamingSupported;
41890
+ pdfManager = new NetworkPdfManager(docId, pdfStream, {
41891
+ msgHandler: handler,
41892
+ url: source.url,
41893
+ password: source.password,
41894
+ length: fullRequest.contentLength,
41895
+ disableAutoFetch: disableAutoFetch,
41896
+ rangeChunkSize: source.rangeChunkSize
41897
+ });
41898
+ pdfManagerCapability.resolve(pdfManager);
41899
+ cancelXHRs = null;
41900
+ }).catch(function (reason) {
41901
+ pdfManagerCapability.reject(reason);
41902
+ cancelXHRs = null;
41903
+ });
41904
 
41905
+ var cachedChunks = [], loaded = 0;
41906
+ var flushChunks = function () {
41907
+ var pdfFile = arraysToBytes(cachedChunks);
41908
+ if (source.length && pdfFile.length !== source.length) {
41909
+ warn('reported HTTP length is different from actual');
41910
+ }
41911
+ // the data is array, instantiating directly from it
41912
+ try {
41913
+ pdfManager = new LocalPdfManager(docId, pdfFile, source.password);
41914
+ pdfManagerCapability.resolve(pdfManager);
41915
+ } catch (ex) {
41916
+ pdfManagerCapability.reject(ex);
41917
+ }
41918
+ cachedChunks = [];
41919
+ };
41920
+ var readPromise = new Promise(function (resolve, reject) {
41921
+ var readChunk = function (chunk) {
41922
  try {
41923
+ ensureNotTerminated();
41924
+ if (chunk.done) {
41925
+ if (!pdfManager) {
41926
+ flushChunks();
41927
+ }
41928
+ cancelXHRs = null;
41929
+ return;
41930
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
41931
 
41932
+ var data = chunk.value;
41933
+ loaded += arrayByteLength(data);
41934
+ if (!fullRequest.isStreamingSupported) {
41935
+ handler.send('DocProgress', {
41936
+ loaded: loaded,
41937
+ total: Math.max(loaded, fullRequest.contentLength || 0)
41938
+ });
 
 
 
41939
  }
 
 
 
 
 
 
 
 
 
41940
 
41941
+ if (pdfManager) {
41942
+ pdfManager.sendProgressiveData(data);
41943
+ } else {
41944
+ cachedChunks.push(data);
41945
+ }
 
 
 
 
41946
 
41947
+ fullRequest.read().then(readChunk, reject);
41948
+ } catch (e) {
41949
+ reject(e);
 
 
 
 
 
 
 
 
41950
  }
41951
+ };
41952
+ fullRequest.read().then(readChunk, reject);
41953
+ });
41954
+ readPromise.catch(function (e) {
41955
+ pdfManagerCapability.reject(e);
41956
+ cancelXHRs = null;
 
 
 
41957
  });
41958
 
41959
  cancelXHRs = function () {
41960
+ pdfStream.cancelAllRequests('abort');
41961
  };
41962
 
41963
  return pdfManagerCapability.promise;
42298
  initializeWorker();
42299
  }
42300
 
42301
+ exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass;
42302
  exports.WorkerTask = WorkerTask;
42303
  exports.WorkerMessageHandler = WorkerMessageHandler;
42304
  }));
42305
 
42306
 
42307
+
42308
+
42309
+ var NetworkManager = (function NetworkManagerClosure() {
42310
+
42311
+ var OK_RESPONSE = 200;
42312
+ var PARTIAL_CONTENT_RESPONSE = 206;
42313
+
42314
+ function NetworkManager(url, args) {
42315
+ this.url = url;
42316
+ args = args || {};
42317
+ this.isHttp = /^https?:/i.test(url);
42318
+ this.httpHeaders = (this.isHttp && args.httpHeaders) || {};
42319
+ this.withCredentials = args.withCredentials || false;
42320
+ this.getXhr = args.getXhr ||
42321
+ function NetworkManager_getXhr() {
42322
+ return new XMLHttpRequest();
42323
+ };
42324
+
42325
+ this.currXhrId = 0;
42326
+ this.pendingRequests = Object.create(null);
42327
+ this.loadedRequests = Object.create(null);
42328
+ }
42329
+
42330
+ function getArrayBuffer(xhr) {
42331
+ var data = xhr.response;
42332
+ if (typeof data !== 'string') {
42333
+ return data;
42334
+ }
42335
+ var length = data.length;
42336
+ var array = new Uint8Array(length);
42337
+ for (var i = 0; i < length; i++) {
42338
+ array[i] = data.charCodeAt(i) & 0xFF;
42339
+ }
42340
+ return array.buffer;
42341
+ }
42342
+
42343
+ var supportsMozChunked = (function supportsMozChunkedClosure() {
42344
+ try {
42345
+ var x = new XMLHttpRequest();
42346
+ // Firefox 37- required .open() to be called before setting responseType.
42347
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=707484
42348
+ // Even though the URL is not visited, .open() could fail if the URL is
42349
+ // blocked, e.g. via the connect-src CSP directive or the NoScript addon.
42350
+ // When this error occurs, this feature detection method will mistakenly
42351
+ // report that moz-chunked-arraybuffer is not supported in Firefox 37-.
42352
+ x.open('GET', 'https://example.com');
42353
+ x.responseType = 'moz-chunked-arraybuffer';
42354
+ return x.responseType === 'moz-chunked-arraybuffer';
42355
+ } catch (e) {
42356
+ return false;
42357
+ }
42358
+ })();
42359
+
42360
+ NetworkManager.prototype = {
42361
+ requestRange: function NetworkManager_requestRange(begin, end, listeners) {
42362
+ var args = {
42363
+ begin: begin,
42364
+ end: end
42365
+ };
42366
+ for (var prop in listeners) {
42367
+ args[prop] = listeners[prop];
42368
+ }
42369
+ return this.request(args);
42370
+ },
42371
+
42372
+ requestFull: function NetworkManager_requestFull(listeners) {
42373
+ return this.request(listeners);
42374
+ },
42375
+
42376
+ request: function NetworkManager_request(args) {
42377
+ var xhr = this.getXhr();
42378
+ var xhrId = this.currXhrId++;
42379
+ var pendingRequest = this.pendingRequests[xhrId] = {
42380
+ xhr: xhr
42381
+ };
42382
+
42383
+ xhr.open('GET', this.url);
42384
+ xhr.withCredentials = this.withCredentials;
42385
+ for (var property in this.httpHeaders) {
42386
+ var value = this.httpHeaders[property];
42387
+ if (typeof value === 'undefined') {
42388
+ continue;
42389
+ }
42390
+ xhr.setRequestHeader(property, value);
42391
+ }
42392
+ if (this.isHttp && 'begin' in args && 'end' in args) {
42393
+ var rangeStr = args.begin + '-' + (args.end - 1);
42394
+ xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
42395
+ pendingRequest.expectedStatus = 206;
42396
+ } else {
42397
+ pendingRequest.expectedStatus = 200;
42398
+ }
42399
+
42400
+ var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;
42401
+ if (useMozChunkedLoading) {
42402
+ xhr.responseType = 'moz-chunked-arraybuffer';
42403
+ pendingRequest.onProgressiveData = args.onProgressiveData;
42404
+ pendingRequest.mozChunked = true;
42405
+ } else {
42406
+ xhr.responseType = 'arraybuffer';
42407
+ }
42408
+
42409
+ if (args.onError) {
42410
+ xhr.onerror = function(evt) {
42411
+ args.onError(xhr.status);
42412
+ };
42413
+ }
42414
+ xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
42415
+ xhr.onprogress = this.onProgress.bind(this, xhrId);
42416
+
42417
+ pendingRequest.onHeadersReceived = args.onHeadersReceived;
42418
+ pendingRequest.onDone = args.onDone;
42419
+ pendingRequest.onError = args.onError;
42420
+ pendingRequest.onProgress = args.onProgress;
42421
+
42422
+ xhr.send(null);
42423
+
42424
+ return xhrId;
42425
+ },
42426
+
42427
+ onProgress: function NetworkManager_onProgress(xhrId, evt) {
42428
+ var pendingRequest = this.pendingRequests[xhrId];
42429
+ if (!pendingRequest) {
42430
+ // Maybe abortRequest was called...
42431
+ return;
42432
+ }
42433
+
42434
+ if (pendingRequest.mozChunked) {
42435
+ var chunk = getArrayBuffer(pendingRequest.xhr);
42436
+ pendingRequest.onProgressiveData(chunk);
42437
+ }
42438
+
42439
+ var onProgress = pendingRequest.onProgress;
42440
+ if (onProgress) {
42441
+ onProgress(evt);
42442
+ }
42443
+ },
42444
+
42445
+ onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
42446
+ var pendingRequest = this.pendingRequests[xhrId];
42447
+ if (!pendingRequest) {
42448
+ // Maybe abortRequest was called...
42449
+ return;
42450
+ }
42451
+
42452
+ var xhr = pendingRequest.xhr;
42453
+ if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
42454
+ pendingRequest.onHeadersReceived();
42455
+ delete pendingRequest.onHeadersReceived;
42456
+ }
42457
+
42458
+ if (xhr.readyState !== 4) {
42459
+ return;
42460
+ }
42461
+
42462
+ if (!(xhrId in this.pendingRequests)) {
42463
+ // The XHR request might have been aborted in onHeadersReceived()
42464
+ // callback, in which case we should abort request
42465
+ return;
42466
+ }
42467
+
42468
+ delete this.pendingRequests[xhrId];
42469
+
42470
+ // success status == 0 can be on ftp, file and other protocols
42471
+ if (xhr.status === 0 && this.isHttp) {
42472
+ if (pendingRequest.onError) {
42473
+ pendingRequest.onError(xhr.status);
42474
+ }
42475
+ return;
42476
+ }
42477
+ var xhrStatus = xhr.status || OK_RESPONSE;
42478
+
42479
+ // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
42480
+ // "A server MAY ignore the Range header". This means it's possible to
42481
+ // get a 200 rather than a 206 response from a range request.
42482
+ var ok_response_on_range_request =
42483
+ xhrStatus === OK_RESPONSE &&
42484
+ pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
42485
+
42486
+ if (!ok_response_on_range_request &&
42487
+ xhrStatus !== pendingRequest.expectedStatus) {
42488
+ if (pendingRequest.onError) {
42489
+ pendingRequest.onError(xhr.status);
42490
+ }
42491
+ return;
42492
+ }
42493
+
42494
+ this.loadedRequests[xhrId] = true;
42495
+
42496
+ var chunk = getArrayBuffer(xhr);
42497
+ if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
42498
+ var rangeHeader = xhr.getResponseHeader('Content-Range');
42499
+ var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
42500
+ var begin = parseInt(matches[1], 10);
42501
+ pendingRequest.onDone({
42502
+ begin: begin,
42503
+ chunk: chunk
42504
+ });
42505
+ } else if (pendingRequest.onProgressiveData) {
42506
+ pendingRequest.onDone(null);
42507
+ } else if (chunk) {
42508
+ pendingRequest.onDone({
42509
+ begin: 0,
42510
+ chunk: chunk
42511
+ });
42512
+ } else if (pendingRequest.onError) {
42513
+ pendingRequest.onError(xhr.status);
42514
+ }
42515
+ },
42516
+
42517
+ hasPendingRequests: function NetworkManager_hasPendingRequests() {
42518
+ for (var xhrId in this.pendingRequests) {
42519
+ return true;
42520
+ }
42521
+ return false;
42522
+ },
42523
+
42524
+ getRequestXhr: function NetworkManager_getXhr(xhrId) {
42525
+ return this.pendingRequests[xhrId].xhr;
42526
+ },
42527
+
42528
+ isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
42529
+ return !!(this.pendingRequests[xhrId].onProgressiveData);
42530
+ },
42531
+
42532
+ isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
42533
+ return xhrId in this.pendingRequests;
42534
+ },
42535
+
42536
+ isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
42537
+ return xhrId in this.loadedRequests;
42538
+ },
42539
+
42540
+ abortAllRequests: function NetworkManager_abortAllRequests() {
42541
+ for (var xhrId in this.pendingRequests) {
42542
+ this.abortRequest(xhrId | 0);
42543
+ }
42544
+ },
42545
+
42546
+ abortRequest: function NetworkManager_abortRequest(xhrId) {
42547
+ var xhr = this.pendingRequests[xhrId].xhr;
42548
+ delete this.pendingRequests[xhrId];
42549
+ xhr.abort();
42550
+ }
42551
+ };
42552
+
42553
+ return NetworkManager;
42554
+ })();
42555
+
42556
+ (function (root, factory) {
42557
+ {
42558
+ factory((root.pdfjsCoreNetwork = {}), root.pdfjsSharedUtil,
42559
+ root.pdfjsCoreWorker);
42560
+ }
42561
+ }(this, function (exports, sharedUtil, coreWorker) {
42562
+
42563
+ var assert = sharedUtil.assert;
42564
+ var createPromiseCapability = sharedUtil.createPromiseCapability;
42565
+ var isInt = sharedUtil.isInt;
42566
+ var MissingPDFException = sharedUtil.MissingPDFException;
42567
+ var UnexpectedResponseException = sharedUtil.UnexpectedResponseException;
42568
+
42569
+ /** @implements {IPDFStream} */
42570
+ function PDFNetworkStream(options) {
42571
+ this._options = options;
42572
+ var source = options.source;
42573
+ this._manager = new NetworkManager(source.url, {
42574
+ httpHeaders: source.httpHeaders,
42575
+ withCredentials: source.withCredentials
42576
+ });
42577
+ this._rangeChunkSize = source.rangeChunkSize;
42578
+ this._fullRequestReader = null;
42579
+ this._rangeRequestReaders = [];
42580
+ }
42581
+
42582
+ PDFNetworkStream.prototype = {
42583
+ _onRangeRequestReaderClosed:
42584
+ function PDFNetworkStream_onRangeRequestReaderClosed(reader) {
42585
+ var i = this._rangeRequestReaders.indexOf(reader);
42586
+ if (i >= 0) {
42587
+ this._rangeRequestReaders.splice(i, 1);
42588
+ }
42589
+ },
42590
+
42591
+ getFullReader: function PDFNetworkStream_getFullReader() {
42592
+ assert(!this._fullRequestReader);
42593
+ this._fullRequestReader =
42594
+ new PDFNetworkStreamFullRequestReader(this._manager, this._options);
42595
+ return this._fullRequestReader;
42596
+ },
42597
+
42598
+ getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) {
42599
+ var reader = new PDFNetworkStreamRangeRequestReader(this._manager,
42600
+ begin, end);
42601
+ reader.onClosed = this._onRangeRequestReaderClosed.bind(this);
42602
+ this._rangeRequestReaders.push(reader);
42603
+ return reader;
42604
+ },
42605
+
42606
+ cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) {
42607
+ if (this._fullRequestReader) {
42608
+ this._fullRequestReader.cancel(reason);
42609
+ }
42610
+ var readers = this._rangeRequestReaders.slice(0);
42611
+ readers.forEach(function (reader) {
42612
+ reader.cancel(reason);
42613
+ });
42614
+ }
42615
+ };
42616
+
42617
+ /** @implements {IPDFStreamReader} */
42618
+ function PDFNetworkStreamFullRequestReader(manager, options) {
42619
+ this._manager = manager;
42620
+
42621
+ var source = options.source;
42622
+ var args = {
42623
+ onHeadersReceived: this._onHeadersReceived.bind(this),
42624
+ onProgressiveData: source.disableStream ? null :
42625
+ this._onProgressiveData.bind(this),
42626
+ onDone: this._onDone.bind(this),
42627
+ onError: this._onError.bind(this),
42628
+ onProgress: this._onProgress.bind(this)
42629
+ };
42630
+ this._url = source.url;
42631
+ this._fullRequestId = manager.requestFull(args);
42632
+ this._headersReceivedCapability = createPromiseCapability();
42633
+ this._disableRange = options.disableRange || false;
42634
+ this._contentLength = source.length; // optional
42635
+ this._rangeChunkSize = source.rangeChunkSize;
42636
+ if (!this._rangeChunkSize && !this._disableRange) {
42637
+ this._disableRange = true;
42638
+ }
42639
+
42640
+ this._isStreamingSupported = false;
42641
+ this._isRangeSupported = false;
42642
+
42643
+ this._cachedChunks = [];
42644
+ this._requests = [];
42645
+ this._done = false;
42646
+ this._storedError = undefined;
42647
+
42648
+ this.onProgress = null;
42649
+ }
42650
+
42651
+ PDFNetworkStreamFullRequestReader.prototype = {
42652
+ _validateRangeRequestCapabilities: function
42653
+ PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities() {
42654
+
42655
+ if (this._disableRange) {
42656
+ return false;
42657
+ }
42658
+
42659
+ var networkManager = this._manager;
42660
+ var fullRequestXhrId = this._fullRequestId;
42661
+ var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);
42662
+ if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {
42663
+ return false;
42664
+ }
42665
+
42666
+ var contentEncoding =
42667
+ fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';
42668
+ if (contentEncoding !== 'identity') {
42669
+ return false;
42670
+ }
42671
+
42672
+ var length = fullRequestXhr.getResponseHeader('Content-Length');
42673
+ length = parseInt(length, 10);
42674
+ if (!isInt(length)) {
42675
+ return false;
42676
+ }
42677
+
42678
+ this._contentLength = length; // setting right content length
42679
+
42680
+ if (length <= 2 * this._rangeChunkSize) {
42681
+ // The file size is smaller than the size of two chunks, so it does
42682
+ // not make any sense to abort the request and retry with a range
42683
+ // request.
42684
+ return false;
42685
+ }
42686
+
42687
+ return true;
42688
+ },
42689
+
42690
+ _onHeadersReceived:
42691
+ function PDFNetworkStreamFullRequestReader_onHeadersReceived() {
42692
+
42693
+ if (this._validateRangeRequestCapabilities()) {
42694
+ this._isRangeSupported = true;
42695
+ }
42696
+
42697
+ var networkManager = this._manager;
42698
+ var fullRequestXhrId = this._fullRequestId;
42699
+ if (networkManager.isStreamingRequest(fullRequestXhrId)) {
42700
+ // We can continue fetching when progressive loading is enabled,
42701
+ // and we don't need the autoFetch feature.
42702
+ this._isStreamingSupported = true;
42703
+ } else if (this._isRangeSupported) {
42704
+ // NOTE: by cancelling the full request, and then issuing range
42705
+ // requests, there will be an issue for sites where you can only
42706
+ // request the pdf once. However, if this is the case, then the
42707
+ // server should not be returning that it can support range
42708
+ // requests.
42709
+ networkManager.abortRequest(fullRequestXhrId);
42710
+ }
42711
+
42712
+ this._headersReceivedCapability.resolve();
42713
+ },
42714
+
42715
+ _onProgressiveData:
42716
+ function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) {
42717
+ if (this._requests.length > 0) {
42718
+ var requestCapability = this._requests.shift();
42719
+ requestCapability.resolve({value: chunk, done: false});
42720
+ } else {
42721
+ this._cachedChunks.push(chunk);
42722
+ }
42723
+ },
42724
+
42725
+ _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) {
42726
+ if (args) {
42727
+ this._onProgressiveData(args.chunk);
42728
+ }
42729
+ this._done = true;
42730
+ if (this._cachedChunks.length > 0) {
42731
+ return;
42732
+ }
42733
+ this._requests.forEach(function (requestCapability) {
42734
+ requestCapability.resolve({value: undefined, done: true});
42735
+ });
42736
+ this._requests = [];
42737
+ },
42738
+
42739
+ _onError: function PDFNetworkStreamFullRequestReader_onError(status) {
42740
+ var url = this._url;
42741
+ var exception;
42742
+ if (status === 404 || status === 0 && /^file:/.test(url)) {
42743
+ exception = new MissingPDFException('Missing PDF "' + url + '".');
42744
+ } else {
42745
+ exception = new UnexpectedResponseException(
42746
+ 'Unexpected server response (' + status +
42747
+ ') while retrieving PDF "' + url + '".', status);
42748
+ }
42749
+ this._storedError = exception;
42750
+ this._headersReceivedCapability.reject(exception);
42751
+ this._requests.forEach(function (requestCapability) {
42752
+ requestCapability.reject(exception);
42753
+ });
42754
+ this._requests = [];
42755
+ this._cachedChunks = [];
42756
+ },
42757
+
42758
+ _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) {
42759
+ if (this.onProgress) {
42760
+ this.onProgress({
42761
+ loaded: data.loaded,
42762
+ total: data.lengthComputable ? data.total : this._contentLength
42763
+ });
42764
+ }
42765
+ },
42766
+
42767
+ get isRangeSupported() {
42768
+ return this._isRangeSupported;
42769
+ },
42770
+
42771
+ get isStreamingSupported() {
42772
+ return this._isStreamingSupported;
42773
+ },
42774
+
42775
+ get contentLength() {
42776
+ return this._contentLength;
42777
+ },
42778
+
42779
+ get headersReady() {
42780
+ return this._headersReceivedCapability.promise;
42781
+ },
42782
+
42783
+ read: function PDFNetworkStreamFullRequestReader_read() {
42784
+ if (this._storedError) {
42785
+ return Promise.reject(this._storedError);
42786
+ }
42787
+ if (this._cachedChunks.length > 0) {
42788
+ var chunk = this._cachedChunks.shift();
42789
+ return Promise.resolve(chunk);
42790
+ }
42791
+ if (this._done) {
42792
+ return Promise.resolve({value: undefined, done: true});
42793
+ }
42794
+ var requestCapability = createPromiseCapability();
42795
+ this._requests.push(requestCapability);
42796
+ return requestCapability.promise;
42797
+ },
42798
+
42799
+ cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) {
42800
+ this._done = true;
42801
+ this._headersReceivedCapability.reject(reason);
42802
+ this._requests.forEach(function (requestCapability) {
42803
+ requestCapability.resolve({value: undefined, done: true});
42804
+ });
42805
+ this._requests = [];
42806
+ if (this._manager.isPendingRequest(this._fullRequestId)) {
42807
+ this._manager.abortRequest(this._fullRequestId);
42808
+ }
42809
+ this._fullRequestReader = null;
42810
+ }
42811
+ };
42812
+
42813
+ /** @implements {IPDFStreamRangeReader} */
42814
+ function PDFNetworkStreamRangeRequestReader(manager, begin, end) {
42815
+ this._manager = manager;
42816
+ var args = {
42817
+ onDone: this._onDone.bind(this),
42818
+ onProgress: this._onProgress.bind(this)
42819
+ };
42820
+ this._requestId = manager.requestRange(begin, end, args);
42821
+ this._requests = [];
42822
+ this._queuedChunk = null;
42823
+ this._done = false;
42824
+
42825
+ this.onProgress = null;
42826
+ this.onClosed = null;
42827
+ }
42828
+
42829
+ PDFNetworkStreamRangeRequestReader.prototype = {
42830
+ _close: function PDFNetworkStreamRangeRequestReader_close() {
42831
+ if (this.onClosed) {
42832
+ this.onClosed(this);
42833
+ }
42834
+ },
42835
+
42836
+ _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) {
42837
+ var chunk = data.chunk;
42838
+ if (this._requests.length > 0) {
42839
+ var requestCapability = this._requests.shift();
42840
+ requestCapability.resolve({value: chunk, done: false});
42841
+ } else {
42842
+ this._queuedChunk = chunk;
42843
+ }
42844
+ this._done = true;
42845
+ this._requests.forEach(function (requestCapability) {
42846
+ requestCapability.resolve({value: undefined, done: true});
42847
+ });
42848
+ this._requests = [];
42849
+ this._close();
42850
+ },
42851
+
42852
+ _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) {
42853
+ if (!this.isStreamingSupported && this.onProgress) {
42854
+ this.onProgress({
42855
+ loaded: evt.loaded
42856
+ });
42857
+ }
42858
+ },
42859
+
42860
+ get isStreamingSupported() {
42861
+ return false; // TODO allow progressive range bytes loading
42862
+ },
42863
+
42864
+ read: function PDFNetworkStreamRangeRequestReader_read() {
42865
+ if (this._queuedChunk !== null) {
42866
+ var chunk = this._queuedChunk;
42867
+ this._queuedChunk = null;
42868
+ return Promise.resolve({value: chunk, done: false});
42869
+ }
42870
+ if (this._done) {
42871
+ return Promise.resolve({value: undefined, done: true});
42872
+ }
42873
+ var requestCapability = createPromiseCapability();
42874
+ this._requests.push(requestCapability);
42875
+ return requestCapability.promise;
42876
+ },
42877
+
42878
+ cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) {
42879
+ this._done = true;
42880
+ this._requests.forEach(function (requestCapability) {
42881
+ requestCapability.resolve({value: undefined, done: true});
42882
+ });
42883
+ this._requests = [];
42884
+ if (this._manager.isPendingRequest(this._requestId)) {
42885
+ this._manager.abortRequest(this._requestId);
42886
+ }
42887
+ this._close();
42888
+ }
42889
+ };
42890
+
42891
+ coreWorker.setPDFNetworkStreamClass(PDFNetworkStream);
42892
+
42893
+ exports.PDFNetworkStream = PDFNetworkStream;
42894
+ exports.NetworkManager = NetworkManager;
42895
+ }));
42896
+
42897
+
42898
  }).call(pdfjsLibs);
42899
 
42900
  exports.PDFJS = pdfjsLibs.pdfjsSharedGlobal.PDFJS;
js/pdfjs/pdf.worker.min.js CHANGED
@@ -28,8 +28,8 @@ factory((root.pdfjsDistBuildPdfWorker = {}));
28
  // Use strict in our context only - users might not want it
29
  'use strict';
30
 
31
- var pdfjsVersion = '1.4.93';
32
- var pdfjsBuild = '05917b6';
33
 
34
  var pdfjsFilePath =
35
  typeof document !== 'undefined' && document.currentScript ?
@@ -1650,264 +1650,6 @@ exports.JpegImage = JpegImage;
1650
  }));
1651
 
1652
 
1653
-
1654
-
1655
- var NetworkManager = (function NetworkManagerClosure() {
1656
-
1657
- var OK_RESPONSE = 200;
1658
- var PARTIAL_CONTENT_RESPONSE = 206;
1659
-
1660
- function NetworkManager(url, args) {
1661
- this.url = url;
1662
- args = args || {};
1663
- this.isHttp = /^https?:/i.test(url);
1664
- this.httpHeaders = (this.isHttp && args.httpHeaders) || {};
1665
- this.withCredentials = args.withCredentials || false;
1666
- this.getXhr = args.getXhr ||
1667
- function NetworkManager_getXhr() {
1668
- return new XMLHttpRequest();
1669
- };
1670
-
1671
- this.currXhrId = 0;
1672
- this.pendingRequests = Object.create(null);
1673
- this.loadedRequests = Object.create(null);
1674
- }
1675
-
1676
- function getArrayBuffer(xhr) {
1677
- var data = xhr.response;
1678
- if (typeof data !== 'string') {
1679
- return data;
1680
- }
1681
- var length = data.length;
1682
- var array = new Uint8Array(length);
1683
- for (var i = 0; i < length; i++) {
1684
- array[i] = data.charCodeAt(i) & 0xFF;
1685
- }
1686
- return array.buffer;
1687
- }
1688
-
1689
- var supportsMozChunked = (function supportsMozChunkedClosure() {
1690
- try {
1691
- var x = new XMLHttpRequest();
1692
- // Firefox 37- required .open() to be called before setting responseType.
1693
- // https://bugzilla.mozilla.org/show_bug.cgi?id=707484
1694
- // Even though the URL is not visited, .open() could fail if the URL is
1695
- // blocked, e.g. via the connect-src CSP directive or the NoScript addon.
1696
- // When this error occurs, this feature detection method will mistakenly
1697
- // report that moz-chunked-arraybuffer is not supported in Firefox 37-.
1698
- x.open('GET', 'https://example.com');
1699
- x.responseType = 'moz-chunked-arraybuffer';
1700
- return x.responseType === 'moz-chunked-arraybuffer';
1701
- } catch (e) {
1702
- return false;
1703
- }
1704
- })();
1705
-
1706
- NetworkManager.prototype = {
1707
- requestRange: function NetworkManager_requestRange(begin, end, listeners) {
1708
- var args = {
1709
- begin: begin,
1710
- end: end
1711
- };
1712
- for (var prop in listeners) {
1713
- args[prop] = listeners[prop];
1714
- }
1715
- return this.request(args);
1716
- },
1717
-
1718
- requestFull: function NetworkManager_requestFull(listeners) {
1719
- return this.request(listeners);
1720
- },
1721
-
1722
- request: function NetworkManager_request(args) {
1723
- var xhr = this.getXhr();
1724
- var xhrId = this.currXhrId++;
1725
- var pendingRequest = this.pendingRequests[xhrId] = {
1726
- xhr: xhr
1727
- };
1728
-
1729
- xhr.open('GET', this.url);
1730
- xhr.withCredentials = this.withCredentials;
1731
- for (var property in this.httpHeaders) {
1732
- var value = this.httpHeaders[property];
1733
- if (typeof value === 'undefined') {
1734
- continue;
1735
- }
1736
- xhr.setRequestHeader(property, value);
1737
- }
1738
- if (this.isHttp && 'begin' in args && 'end' in args) {
1739
- var rangeStr = args.begin + '-' + (args.end - 1);
1740
- xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
1741
- pendingRequest.expectedStatus = 206;
1742
- } else {
1743
- pendingRequest.expectedStatus = 200;
1744
- }
1745
-
1746
- var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;
1747
- if (useMozChunkedLoading) {
1748
- xhr.responseType = 'moz-chunked-arraybuffer';
1749
- pendingRequest.onProgressiveData = args.onProgressiveData;
1750
- pendingRequest.mozChunked = true;
1751
- } else {
1752
- xhr.responseType = 'arraybuffer';
1753
- }
1754
-
1755
- if (args.onError) {
1756
- xhr.onerror = function(evt) {
1757
- args.onError(xhr.status);
1758
- };
1759
- }
1760
- xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
1761
- xhr.onprogress = this.onProgress.bind(this, xhrId);
1762
-
1763
- pendingRequest.onHeadersReceived = args.onHeadersReceived;
1764
- pendingRequest.onDone = args.onDone;
1765
- pendingRequest.onError = args.onError;
1766
- pendingRequest.onProgress = args.onProgress;
1767
-
1768
- xhr.send(null);
1769
-
1770
- return xhrId;
1771
- },
1772
-
1773
- onProgress: function NetworkManager_onProgress(xhrId, evt) {
1774
- var pendingRequest = this.pendingRequests[xhrId];
1775
- if (!pendingRequest) {
1776
- // Maybe abortRequest was called...
1777
- return;
1778
- }
1779
-
1780
- if (pendingRequest.mozChunked) {
1781
- var chunk = getArrayBuffer(pendingRequest.xhr);
1782
- pendingRequest.onProgressiveData(chunk);
1783
- }
1784
-
1785
- var onProgress = pendingRequest.onProgress;
1786
- if (onProgress) {
1787
- onProgress(evt);
1788
- }
1789
- },
1790
-
1791
- onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
1792
- var pendingRequest = this.pendingRequests[xhrId];
1793
- if (!pendingRequest) {
1794
- // Maybe abortRequest was called...
1795
- return;
1796
- }
1797
-
1798
- var xhr = pendingRequest.xhr;
1799
- if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
1800
- pendingRequest.onHeadersReceived();
1801
- delete pendingRequest.onHeadersReceived;
1802
- }
1803
-
1804
- if (xhr.readyState !== 4) {
1805
- return;
1806
- }
1807
-
1808
- if (!(xhrId in this.pendingRequests)) {
1809
- // The XHR request might have been aborted in onHeadersReceived()
1810
- // callback, in which case we should abort request
1811
- return;
1812
- }
1813
-
1814
- delete this.pendingRequests[xhrId];
1815
-
1816
- // success status == 0 can be on ftp, file and other protocols
1817
- if (xhr.status === 0 && this.isHttp) {
1818
- if (pendingRequest.onError) {
1819
- pendingRequest.onError(xhr.status);
1820
- }
1821
- return;
1822
- }
1823
- var xhrStatus = xhr.status || OK_RESPONSE;
1824
-
1825
- // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
1826
- // "A server MAY ignore the Range header". This means it's possible to
1827
- // get a 200 rather than a 206 response from a range request.
1828
- var ok_response_on_range_request =
1829
- xhrStatus === OK_RESPONSE &&
1830
- pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
1831
-
1832
- if (!ok_response_on_range_request &&
1833
- xhrStatus !== pendingRequest.expectedStatus) {
1834
- if (pendingRequest.onError) {
1835
- pendingRequest.onError(xhr.status);
1836
- }
1837
- return;
1838
- }
1839
-
1840
- this.loadedRequests[xhrId] = true;
1841
-
1842
- var chunk = getArrayBuffer(xhr);
1843
- if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
1844
- var rangeHeader = xhr.getResponseHeader('Content-Range');
1845
- var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
1846
- var begin = parseInt(matches[1], 10);
1847
- pendingRequest.onDone({
1848
- begin: begin,
1849
- chunk: chunk
1850
- });
1851
- } else if (pendingRequest.onProgressiveData) {
1852
- pendingRequest.onDone(null);
1853
- } else if (chunk) {
1854
- pendingRequest.onDone({
1855
- begin: 0,
1856
- chunk: chunk
1857
- });
1858
- } else if (pendingRequest.onError) {
1859
- pendingRequest.onError(xhr.status);
1860
- }
1861
- },
1862
-
1863
- hasPendingRequests: function NetworkManager_hasPendingRequests() {
1864
- for (var xhrId in this.pendingRequests) {
1865
- return true;
1866
- }
1867
- return false;
1868
- },
1869
-
1870
- getRequestXhr: function NetworkManager_getXhr(xhrId) {
1871
- return this.pendingRequests[xhrId].xhr;
1872
- },
1873
-
1874
- isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
1875
- return !!(this.pendingRequests[xhrId].onProgressiveData);
1876
- },
1877
-
1878
- isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
1879
- return xhrId in this.pendingRequests;
1880
- },
1881
-
1882
- isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
1883
- return xhrId in this.loadedRequests;
1884
- },
1885
-
1886
- abortAllRequests: function NetworkManager_abortAllRequests() {
1887
- for (var xhrId in this.pendingRequests) {
1888
- this.abortRequest(xhrId | 0);
1889
- }
1890
- },
1891
-
1892
- abortRequest: function NetworkManager_abortRequest(xhrId) {
1893
- var xhr = this.pendingRequests[xhrId].xhr;
1894
- delete this.pendingRequests[xhrId];
1895
- xhr.abort();
1896
- }
1897
- };
1898
-
1899
- return NetworkManager;
1900
- })();
1901
-
1902
- (function (root, factory) {
1903
- {
1904
- factory((root.pdfjsCoreNetwork = {}));
1905
- }
1906
- }(this, function (exports) {
1907
- exports.NetworkManager = NetworkManager;
1908
- }));
1909
-
1910
-
1911
  (function (root, factory) {
1912
  {
1913
  factory((root.pdfjsSharedGlobal = {}));
@@ -2916,6 +2658,55 @@ function stringToBytes(str) {
2916
  return bytes;
2917
  }
2918
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2919
  function string32(value) {
2920
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
2921
  (value >> 8) & 0xff, value & 0xff);
@@ -4700,6 +4491,8 @@ exports.UnexpectedResponseException = UnexpectedResponseException;
4700
  exports.UnknownErrorException = UnknownErrorException;
4701
  exports.Util = Util;
4702
  exports.XRefParseException = XRefParseException;
 
 
4703
  exports.assert = assert;
4704
  exports.bytesToString = bytesToString;
4705
  exports.combineUrl = combineUrl;
@@ -4743,6 +4536,8 @@ exports.warn = warn;
4743
  }(this, function (exports, sharedUtil) {
4744
 
4745
  var MissingDataException = sharedUtil.MissingDataException;
 
 
4746
  var assert = sharedUtil.assert;
4747
  var createPromiseCapability = sharedUtil.createPromiseCapability;
4748
  var isInt = sharedUtil.isInt;
@@ -4994,37 +4789,16 @@ var ChunkedStream = (function ChunkedStreamClosure() {
4994
 
4995
  var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
4996
 
4997
- function ChunkedStreamManager(length, chunkSize, url, args) {
 
 
4998
  this.stream = new ChunkedStream(length, chunkSize, this);
4999
  this.length = length;
5000
  this.chunkSize = chunkSize;
5001
- this.url = url;
 
5002
  this.disableAutoFetch = args.disableAutoFetch;
5003
- var msgHandler = this.msgHandler = args.msgHandler;
5004
-
5005
- if (args.chunkedViewerLoading) {
5006
- msgHandler.on('OnDataRange', this.onReceiveData.bind(this));
5007
- msgHandler.on('OnDataProgress', this.onProgress.bind(this));
5008
- this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
5009
- msgHandler.send('RequestDataRange', { begin: begin, end: end });
5010
- };
5011
- } else {
5012
-
5013
- var getXhr = function getXhr() {
5014
- return new XMLHttpRequest();
5015
- };
5016
- this.networkManager = new NetworkManager(this.url, {
5017
- getXhr: getXhr,
5018
- httpHeaders: args.httpHeaders,
5019
- withCredentials: args.withCredentials
5020
- });
5021
- this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
5022
- this.networkManager.requestRange(begin, end, {
5023
- onDone: this.onReceiveData.bind(this),
5024
- onProgress: this.onProgress.bind(this)
5025
- });
5026
- };
5027
- }
5028
 
5029
  this.currRequestId = 0;
5030
 
@@ -5032,12 +4806,9 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
5032
  this.requestsByChunk = Object.create(null);
5033
  this.promisesByRequest = Object.create(null);
5034
  this.progressiveDataLength = 0;
 
5035
 
5036
  this._loadedStreamCapability = createPromiseCapability();
5037
-
5038
- if (args.initialData) {
5039
- this.onReceiveData({chunk: args.initialData});
5040
- }
5041
  }
5042
 
5043
  ChunkedStreamManager.prototype = {
@@ -5045,6 +4816,44 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
5045
  return this._loadedStreamCapability.promise;
5046
  },
5047
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5048
  // Get all the chunks that are not yet loaded and groups them into
5049
  // contiguous ranges to load in as few requests as possible
5050
  requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
@@ -5264,8 +5073,9 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
5264
  },
5265
 
5266
  abort: function ChunkedStreamManager_abort() {
5267
- if (this.networkManager) {
5268
- this.networkManager.abortAllRequests();
 
5269
  }
5270
  for(var requestId in this.promisesByRequest) {
5271
  var capability = this.promisesByRequest[requestId];
@@ -26143,7 +25953,7 @@ function getFontType(type, subtype) {
26143
 
26144
  var Glyph = (function GlyphClosure() {
26145
  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId,
26146
- isSpace) {
26147
  this.fontChar = fontChar;
26148
  this.unicode = unicode;
26149
  this.accent = accent;
@@ -26151,17 +25961,20 @@ var Glyph = (function GlyphClosure() {
26151
  this.vmetric = vmetric;
26152
  this.operatorListId = operatorListId;
26153
  this.isSpace = isSpace;
 
26154
  }
26155
 
26156
  Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width,
26157
- vmetric, operatorListId, isSpace) {
 
26158
  return this.fontChar === fontChar &&
26159
  this.unicode === unicode &&
26160
  this.accent === accent &&
26161
  this.width === width &&
26162
  this.vmetric === vmetric &&
26163
  this.operatorListId === operatorListId &&
26164
- this.isSpace === isSpace;
 
26165
  };
26166
 
26167
  return Glyph;
@@ -26420,6 +26233,7 @@ var Font = (function FontClosure() {
26420
  this.loadedName = properties.loadedName;
26421
  this.isType3Font = properties.isType3Font;
26422
  this.sizes = [];
 
26423
 
26424
  this.glyphCache = Object.create(null);
26425
 
@@ -27784,6 +27598,9 @@ var Font = (function FontClosure() {
27784
  }
27785
  for (i = 0, ii = records.length; i < ii; i++) {
27786
  var record = records[i];
 
 
 
27787
  var pos = start + stringsStart + record.offset;
27788
  if (pos + record.length > end) {
27789
  continue; // outside of name table, ignoring
@@ -28231,7 +28048,7 @@ var Font = (function FontClosure() {
28231
  assert(cid <= 0xffff, 'Max size of CID is 65,535');
28232
  var glyphId = -1;
28233
  if (isCidToGidMapEmpty) {
28234
- glyphId = charCode;
28235
  } else if (cidToGidMap[cid] !== undefined) {
28236
  glyphId = cidToGidMap[cid];
28237
  }
@@ -28759,6 +28576,7 @@ var Font = (function FontClosure() {
28759
  unicode = String.fromCharCode(unicode);
28760
  }
28761
 
 
28762
  // First try the toFontChar map, if it's not there then try falling
28763
  // back to the char code.
28764
  fontCharCode = this.toFontChar[charcode] || charcode;
@@ -28773,6 +28591,7 @@ var Font = (function FontClosure() {
28773
 
28774
  var accent = null;
28775
  if (this.seacMap && this.seacMap[charcode]) {
 
28776
  var seac = this.seacMap[charcode];
28777
  fontCharCode = seac.baseFontCharCode;
28778
  accent = {
@@ -28786,9 +28605,9 @@ var Font = (function FontClosure() {
28786
  var glyph = this.glyphCache[charcode];
28787
  if (!glyph ||
28788
  !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
28789
- operatorListId, isSpace)) {
28790
  glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
28791
- operatorListId, isSpace);
28792
  this.glyphCache[charcode] = glyph;
28793
  }
28794
  return glyph;
@@ -41567,21 +41386,18 @@ var LocalPdfManager = (function LocalPdfManagerClosure() {
41567
  })();
41568
 
41569
  var NetworkPdfManager = (function NetworkPdfManagerClosure() {
41570
- function NetworkPdfManager(docId, args, msgHandler) {
41571
  this._docId = docId;
41572
- this.msgHandler = msgHandler;
41573
 
41574
  var params = {
41575
- msgHandler: msgHandler,
41576
- httpHeaders: args.httpHeaders,
41577
- withCredentials: args.withCredentials,
41578
- chunkedViewerLoading: args.chunkedViewerLoading,
41579
  disableAutoFetch: args.disableAutoFetch,
41580
- initialData: args.initialData
41581
  };
41582
- this.streamManager = new ChunkedStreamManager(args.length,
41583
- args.rangeChunkSize,
41584
- args.url, params);
41585
  this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),
41586
  args.password);
41587
  }
@@ -41663,10 +41479,12 @@ var PasswordException = sharedUtil.PasswordException;
41663
  var PasswordResponses = sharedUtil.PasswordResponses;
41664
  var UnknownErrorException = sharedUtil.UnknownErrorException;
41665
  var XRefParseException = sharedUtil.XRefParseException;
 
 
 
41666
  var createPromiseCapability = sharedUtil.createPromiseCapability;
41667
  var error = sharedUtil.error;
41668
  var info = sharedUtil.info;
41669
- var isInt = sharedUtil.isInt;
41670
  var warn = sharedUtil.warn;
41671
  var Ref = corePrimitives.Ref;
41672
  var LocalPdfManager = corePdfManager.LocalPdfManager;
@@ -41704,6 +41522,221 @@ var WorkerTask = (function WorkerTaskClosure() {
41704
  return WorkerTask;
41705
  })();
41706
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41707
  var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
41708
  setup: function wphSetup(handler, port) {
41709
  var testMessageProcessed = false;
@@ -41810,7 +41843,6 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
41810
  var pdfManager;
41811
 
41812
  var source = data.source;
41813
- var disableRange = data.disableRange;
41814
  if (source.data) {
41815
  try {
41816
  pdfManager = new LocalPdfManager(docId, source.data, source.password);
@@ -41819,143 +41851,113 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
41819
  pdfManagerCapability.reject(ex);
41820
  }
41821
  return pdfManagerCapability.promise;
41822
- } else if (source.chunkedViewerLoading) {
41823
- try {
41824
- pdfManager = new NetworkPdfManager(docId, source, handler);
41825
- pdfManagerCapability.resolve(pdfManager);
41826
- } catch (ex) {
41827
- pdfManagerCapability.reject(ex);
 
 
 
41828
  }
 
 
41829
  return pdfManagerCapability.promise;
41830
  }
41831
 
41832
- var networkManager = new NetworkManager(source.url, {
41833
- httpHeaders: source.httpHeaders,
41834
- withCredentials: source.withCredentials
41835
- });
41836
- var cachedChunks = [];
41837
- var fullRequestXhrId = networkManager.requestFull({
41838
- onHeadersReceived: function onHeadersReceived() {
41839
- if (disableRange) {
41840
- return;
41841
- }
41842
-
41843
- var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);
41844
- if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {
41845
- return;
41846
- }
41847
-
41848
- var contentEncoding =
41849
- fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';
41850
- if (contentEncoding !== 'identity') {
41851
- return;
41852
- }
41853
 
41854
- var length = fullRequestXhr.getResponseHeader('Content-Length');
41855
- length = parseInt(length, 10);
41856
- if (!isInt(length)) {
41857
- return;
41858
- }
41859
- source.length = length;
41860
- if (length <= 2 * source.rangeChunkSize) {
41861
- // The file size is smaller than the size of two chunks, so it does
41862
- // not make any sense to abort the request and retry with a range
41863
- // request.
41864
- return;
41865
- }
41866
 
41867
- if (networkManager.isStreamingRequest(fullRequestXhrId)) {
41868
- // We can continue fetching when progressive loading is enabled,
41869
- // and we don't need the autoFetch feature.
41870
- source.disableAutoFetch = true;
41871
- } else {
41872
- // NOTE: by cancelling the full request, and then issuing range
41873
- // requests, there will be an issue for sites where you can only
41874
- // request the pdf once. However, if this is the case, then the
41875
- // server should not be returning that it can support range
41876
- // requests.
41877
- networkManager.abortRequest(fullRequestXhrId);
41878
- }
 
 
 
 
 
41879
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41880
  try {
41881
- pdfManager = new NetworkPdfManager(docId, source, handler);
41882
- pdfManagerCapability.resolve(pdfManager);
41883
- } catch (ex) {
41884
- pdfManagerCapability.reject(ex);
41885
- }
41886
- cancelXHRs = null;
41887
- },
41888
-
41889
- onProgressiveData: source.disableStream ? null :
41890
- function onProgressiveData(chunk) {
41891
- if (!pdfManager) {
41892
- cachedChunks.push(chunk);
41893
- return;
41894
- }
41895
- pdfManager.sendProgressiveData(chunk);
41896
- },
41897
-
41898
- onDone: function onDone(args) {
41899
- if (pdfManager) {
41900
- return; // already processed
41901
- }
41902
 
41903
- var pdfFile;
41904
- if (args === null) {
41905
- // TODO add some streaming manager, e.g. for unknown length files.
41906
- // The data was returned in the onProgressiveData, combining...
41907
- var pdfFileLength = 0, pos = 0;
41908
- cachedChunks.forEach(function (chunk) {
41909
- pdfFileLength += chunk.byteLength;
41910
- });
41911
- if (source.length && pdfFileLength !== source.length) {
41912
- warn('reported HTTP length is different from actual');
41913
  }
41914
- var pdfFileArray = new Uint8Array(pdfFileLength);
41915
- cachedChunks.forEach(function (chunk) {
41916
- pdfFileArray.set(new Uint8Array(chunk), pos);
41917
- pos += chunk.byteLength;
41918
- });
41919
- pdfFile = pdfFileArray.buffer;
41920
- } else {
41921
- pdfFile = args.chunk;
41922
- }
41923
 
41924
- // the data is array, instantiating directly from it
41925
- try {
41926
- pdfManager = new LocalPdfManager(docId, pdfFile, source.password);
41927
- pdfManagerCapability.resolve(pdfManager);
41928
- } catch (ex) {
41929
- pdfManagerCapability.reject(ex);
41930
- }
41931
- cancelXHRs = null;
41932
- },
41933
 
41934
- onError: function onError(status) {
41935
- var exception;
41936
- if (status === 404 || status === 0 && /^file:/.test(source.url)) {
41937
- exception = new MissingPDFException('Missing PDF "' +
41938
- source.url + '".');
41939
- handler.send('MissingPDF', exception);
41940
- } else {
41941
- exception = new UnexpectedResponseException(
41942
- 'Unexpected server response (' + status +
41943
- ') while retrieving PDF "' + source.url + '".', status);
41944
- handler.send('UnexpectedResponse', exception);
41945
  }
41946
- cancelXHRs = null;
41947
- },
41948
-
41949
- onProgress: function onProgress(evt) {
41950
- handler.send('DocProgress', {
41951
- loaded: evt.loaded,
41952
- total: evt.lengthComputable ? evt.total : source.length
41953
- });
41954
- }
41955
  });
41956
 
41957
  cancelXHRs = function () {
41958
- networkManager.abortRequest(fullRequestXhrId);
41959
  };
41960
 
41961
  return pdfManagerCapability.promise;
@@ -42296,11 +42298,603 @@ if (typeof window === 'undefined' &&
42296
  initializeWorker();
42297
  }
42298
 
 
42299
  exports.WorkerTask = WorkerTask;
42300
  exports.WorkerMessageHandler = WorkerMessageHandler;
42301
  }));
42302
 
42303
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42304
  }).call(pdfjsLibs);
42305
 
42306
  exports.PDFJS = pdfjsLibs.pdfjsSharedGlobal.PDFJS;
28
  // Use strict in our context only - users might not want it
29
  'use strict';
30
 
31
+ var pdfjsVersion = '1.4.129';
32
+ var pdfjsBuild = '4065a21';
33
 
34
  var pdfjsFilePath =
35
  typeof document !== 'undefined' && document.currentScript ?
1650
  }));
1651
 
1652
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1653
  (function (root, factory) {
1654
  {
1655
  factory((root.pdfjsSharedGlobal = {}));
2658
  return bytes;
2659
  }
2660
 
2661
+ /**
2662
+ * Gets length of the array (Array, Uint8Array, or string) in bytes.
2663
+ * @param {Array|Uint8Array|string} arr
2664
+ * @returns {number}
2665
+ */
2666
+ function arrayByteLength(arr) {
2667
+ if (arr.length !== undefined) {
2668
+ return arr.length;
2669
+ }
2670
+ assert(arr.byteLength !== undefined);
2671
+ return arr.byteLength;
2672
+ }
2673
+
2674
+ /**
2675
+ * Combines array items (arrays) into single Uint8Array object.
2676
+ * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string).
2677
+ * @returns {Uint8Array}
2678
+ */
2679
+ function arraysToBytes(arr) {
2680
+ // Shortcut: if first and only item is Uint8Array, return it.
2681
+ if (arr.length === 1 && (arr[0] instanceof Uint8Array)) {
2682
+ return arr[0];
2683
+ }
2684
+ var resultLength = 0;
2685
+ var i, ii = arr.length;
2686
+ var item, itemLength ;
2687
+ for (i = 0; i < ii; i++) {
2688
+ item = arr[i];
2689
+ itemLength = arrayByteLength(item);
2690
+ resultLength += itemLength;
2691
+ }
2692
+ var pos = 0;
2693
+ var data = new Uint8Array(resultLength);
2694
+ for (i = 0; i < ii; i++) {
2695
+ item = arr[i];
2696
+ if (!(item instanceof Uint8Array)) {
2697
+ if (typeof item === 'string') {
2698
+ item = stringToBytes(item);
2699
+ } else {
2700
+ item = new Uint8Array(item);
2701
+ }
2702
+ }
2703
+ itemLength = item.byteLength;
2704
+ data.set(item, pos);
2705
+ pos += itemLength;
2706
+ }
2707
+ return data;
2708
+ }
2709
+
2710
  function string32(value) {
2711
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
2712
  (value >> 8) & 0xff, value & 0xff);
4491
  exports.UnknownErrorException = UnknownErrorException;
4492
  exports.Util = Util;
4493
  exports.XRefParseException = XRefParseException;
4494
+ exports.arrayByteLength = arrayByteLength;
4495
+ exports.arraysToBytes = arraysToBytes;
4496
  exports.assert = assert;
4497
  exports.bytesToString = bytesToString;
4498
  exports.combineUrl = combineUrl;
4536
  }(this, function (exports, sharedUtil) {
4537
 
4538
  var MissingDataException = sharedUtil.MissingDataException;
4539
+ var arrayByteLength = sharedUtil.arrayByteLength;
4540
+ var arraysToBytes = sharedUtil.arraysToBytes;
4541
  var assert = sharedUtil.assert;
4542
  var createPromiseCapability = sharedUtil.createPromiseCapability;
4543
  var isInt = sharedUtil.isInt;
4789
 
4790
  var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
4791
 
4792
+ function ChunkedStreamManager(pdfNetworkStream, args) {
4793
+ var chunkSize = args.rangeChunkSize;
4794
+ var length = args.length;
4795
  this.stream = new ChunkedStream(length, chunkSize, this);
4796
  this.length = length;
4797
  this.chunkSize = chunkSize;
4798
+ this.pdfNetworkStream = pdfNetworkStream;
4799
+ this.url = args.url;
4800
  this.disableAutoFetch = args.disableAutoFetch;
4801
+ this.msgHandler = args.msgHandler;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4802
 
4803
  this.currRequestId = 0;
4804
 
4806
  this.requestsByChunk = Object.create(null);
4807
  this.promisesByRequest = Object.create(null);
4808
  this.progressiveDataLength = 0;
4809
+ this.aborted = false;
4810
 
4811
  this._loadedStreamCapability = createPromiseCapability();
 
 
 
 
4812
  }
4813
 
4814
  ChunkedStreamManager.prototype = {
4816
  return this._loadedStreamCapability.promise;
4817
  },
4818
 
4819
+ sendRequest: function ChunkedStreamManager_sendRequest(begin, end) {
4820
+ var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);
4821
+ if (!rangeReader.isStreamingSupported) {
4822
+ rangeReader.onProgress = this.onProgress.bind(this);
4823
+ }
4824
+ var chunks = [], loaded = 0;
4825
+ var manager = this;
4826
+ var promise = new Promise(function (resolve, reject) {
4827
+ var readChunk = function (chunk) {
4828
+ try {
4829
+ if (!chunk.done) {
4830
+ var data = chunk.value;
4831
+ chunks.push(data);
4832
+ loaded += arrayByteLength(data);
4833
+ if (rangeReader.isStreamingSupported) {
4834
+ manager.onProgress({loaded: loaded});
4835
+ }
4836
+ rangeReader.read().then(readChunk, reject);
4837
+ return;
4838
+ }
4839
+ var chunkData = arraysToBytes(chunks);
4840
+ chunks = null;
4841
+ resolve(chunkData);
4842
+ } catch (e) {
4843
+ reject(e);
4844
+ }
4845
+ };
4846
+ rangeReader.read().then(readChunk, reject);
4847
+ });
4848
+ promise.then(function (data) {
4849
+ if (this.aborted) {
4850
+ return; // ignoring any data after abort
4851
+ }
4852
+ this.onReceiveData({chunk: data, begin: begin});
4853
+ }.bind(this));
4854
+ // TODO check errors
4855
+ },
4856
+
4857
  // Get all the chunks that are not yet loaded and groups them into
4858
  // contiguous ranges to load in as few requests as possible
4859
  requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
5073
  },
5074
 
5075
  abort: function ChunkedStreamManager_abort() {
5076
+ this.aborted = true;
5077
+ if (this.pdfNetworkStream) {
5078
+ this.pdfNetworkStream.cancelAllRequests('abort');
5079
  }
5080
  for(var requestId in this.promisesByRequest) {
5081
  var capability = this.promisesByRequest[requestId];
25953
 
25954
  var Glyph = (function GlyphClosure() {
25955
  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId,
25956
+ isSpace, isInFont) {
25957
  this.fontChar = fontChar;
25958
  this.unicode = unicode;
25959
  this.accent = accent;
25961
  this.vmetric = vmetric;
25962
  this.operatorListId = operatorListId;
25963
  this.isSpace = isSpace;
25964
+ this.isInFont = isInFont;
25965
  }
25966
 
25967
  Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width,
25968
+ vmetric, operatorListId, isSpace,
25969
+ isInFont) {
25970
  return this.fontChar === fontChar &&
25971
  this.unicode === unicode &&
25972
  this.accent === accent &&
25973
  this.width === width &&
25974
  this.vmetric === vmetric &&
25975
  this.operatorListId === operatorListId &&
25976
+ this.isSpace === isSpace &&
25977
+ this.isInFont === isInFont;
25978
  };
25979
 
25980
  return Glyph;
26233
  this.loadedName = properties.loadedName;
26234
  this.isType3Font = properties.isType3Font;
26235
  this.sizes = [];
26236
+ this.missingFile = false;
26237
 
26238
  this.glyphCache = Object.create(null);
26239
 
27598
  }
27599
  for (i = 0, ii = records.length; i < ii; i++) {
27600
  var record = records[i];
27601
+ if (record.length <= 0) {
27602
+ continue; // Nothing to process, ignoring.
27603
+ }
27604
  var pos = start + stringsStart + record.offset;
27605
  if (pos + record.length > end) {
27606
  continue; // outside of name table, ignoring
28048
  assert(cid <= 0xffff, 'Max size of CID is 65,535');
28049
  var glyphId = -1;
28050
  if (isCidToGidMapEmpty) {
28051
+ glyphId = cid;
28052
  } else if (cidToGidMap[cid] !== undefined) {
28053
  glyphId = cidToGidMap[cid];
28054
  }
28576
  unicode = String.fromCharCode(unicode);
28577
  }
28578
 
28579
+ var isInFont = charcode in this.toFontChar;
28580
  // First try the toFontChar map, if it's not there then try falling
28581
  // back to the char code.
28582
  fontCharCode = this.toFontChar[charcode] || charcode;
28591
 
28592
  var accent = null;
28593
  if (this.seacMap && this.seacMap[charcode]) {
28594
+ isInFont = true;
28595
  var seac = this.seacMap[charcode];
28596
  fontCharCode = seac.baseFontCharCode;
28597
  accent = {
28605
  var glyph = this.glyphCache[charcode];
28606
  if (!glyph ||
28607
  !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
28608
+ operatorListId, isSpace, isInFont)) {
28609
  glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
28610
+ operatorListId, isSpace, isInFont);
28611
  this.glyphCache[charcode] = glyph;
28612
  }
28613
  return glyph;
41386
  })();
41387
 
41388
  var NetworkPdfManager = (function NetworkPdfManagerClosure() {
41389
+ function NetworkPdfManager(docId, pdfNetworkStream, args) {
41390
  this._docId = docId;
41391
+ this.msgHandler = args.msgHandler;
41392
 
41393
  var params = {
41394
+ msgHandler: args.msgHandler,
41395
+ url: args.url,
41396
+ length: args.length,
 
41397
  disableAutoFetch: args.disableAutoFetch,
41398
+ rangeChunkSize: args.rangeChunkSize
41399
  };
41400
+ this.streamManager = new ChunkedStreamManager(pdfNetworkStream, params);
 
 
41401
  this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),
41402
  args.password);
41403
  }
41479
  var PasswordResponses = sharedUtil.PasswordResponses;
41480
  var UnknownErrorException = sharedUtil.UnknownErrorException;
41481
  var XRefParseException = sharedUtil.XRefParseException;
41482
+ var arrayByteLength = sharedUtil.arrayByteLength;
41483
+ var arraysToBytes = sharedUtil.arraysToBytes;
41484
+ var assert = sharedUtil.assert;
41485
  var createPromiseCapability = sharedUtil.createPromiseCapability;
41486
  var error = sharedUtil.error;
41487
  var info = sharedUtil.info;
 
41488
  var warn = sharedUtil.warn;
41489
  var Ref = corePrimitives.Ref;
41490
  var LocalPdfManager = corePdfManager.LocalPdfManager;
41522
  return WorkerTask;
41523
  })();
41524
 
41525
+
41526
+ /** @implements {IPDFStream} */
41527
+ var PDFWorkerStream = (function PDFWorkerStreamClosure() {
41528
+ function PDFWorkerStream(params, msgHandler) {
41529
+ this._queuedChunks = [];
41530
+ var initialData = params.initialData;
41531
+ if (initialData && initialData.length > 0) {
41532
+ this._queuedChunks.push(initialData);
41533
+ }
41534
+ this._msgHandler = msgHandler;
41535
+
41536
+ this._isRangeSupported = !(params.disableRange);
41537
+ this._isStreamingSupported = !(params.disableStream);
41538
+ this._contentLength = params.length;
41539
+
41540
+ this._fullRequestReader = null;
41541
+ this._rangeReaders = [];
41542
+
41543
+ msgHandler.on('OnDataRange', this._onReceiveData.bind(this));
41544
+ msgHandler.on('OnDataProgress', this._onProgress.bind(this));
41545
+ }
41546
+ PDFWorkerStream.prototype = {
41547
+ _onReceiveData: function PDFWorkerStream_onReceiveData(args) {
41548
+ if (args.begin === undefined) {
41549
+ if (this._fullRequestReader) {
41550
+ this._fullRequestReader._enqueue(args.chunk);
41551
+ } else {
41552
+ this._queuedChunks.push(args.chunk);
41553
+ }
41554
+ } else {
41555
+ var found = this._rangeReaders.some(function (rangeReader) {
41556
+ if (rangeReader._begin !== args.begin) {
41557
+ return false;
41558
+ }
41559
+ rangeReader._enqueue(args.chunk);
41560
+ return true;
41561
+ });
41562
+ assert(found);
41563
+ }
41564
+ },
41565
+
41566
+ _onProgress: function PDFWorkerStream_onProgress(evt) {
41567
+ if (this._rangeReaders.length > 0) {
41568
+ // Reporting to first range reader.
41569
+ var firstReader = this._rangeReaders[0];
41570
+ if (firstReader.onProgress) {
41571
+ firstReader.onProgress({loaded: evt.loaded});
41572
+ }
41573
+ }
41574
+ },
41575
+
41576
+ _removeRangeReader: function PDFWorkerStream_removeRangeReader(reader) {
41577
+ var i = this._rangeReaders.indexOf(reader);
41578
+ if (i >= 0) {
41579
+ this._rangeReaders.splice(i, 1);
41580
+ }
41581
+ },
41582
+
41583
+ getFullReader: function PDFWorkerStream_getFullReader() {
41584
+ assert(!this._fullRequestReader);
41585
+ var queuedChunks = this._queuedChunks;
41586
+ this._queuedChunks = null;
41587
+ return new PDFWorkerStreamReader(this, queuedChunks);
41588
+ },
41589
+
41590
+ getRangeReader: function PDFWorkerStream_getRangeReader(begin, end) {
41591
+ var reader = new PDFWorkerStreamRangeReader(this, begin, end);
41592
+ this._msgHandler.send('RequestDataRange', { begin: begin, end: end });
41593
+ this._rangeReaders.push(reader);
41594
+ return reader;
41595
+ },
41596
+
41597
+ cancelAllRequests: function PDFWorkerStream_cancelAllRequests(reason) {
41598
+ if (this._fullRequestReader) {
41599
+ this._fullRequestReader.cancel(reason);
41600
+ }
41601
+ var readers = this._rangeReaders.slice(0);
41602
+ readers.forEach(function (rangeReader) {
41603
+ rangeReader.cancel(reason);
41604
+ });
41605
+ }
41606
+ };
41607
+
41608
+ /** @implements {IPDFStreamReader} */
41609
+ function PDFWorkerStreamReader(stream, queuedChunks) {
41610
+ this._stream = stream;
41611
+ this._done = false;
41612
+ this._queuedChunks = queuedChunks || [];
41613
+ this._requests = [];
41614
+ this._headersReady = Promise.resolve();
41615
+ stream._fullRequestReader = this;
41616
+
41617
+ this.onProgress = null; // not used
41618
+ }
41619
+ PDFWorkerStreamReader.prototype = {
41620
+ _enqueue: function PDFWorkerStreamReader_enqueue(chunk) {
41621
+ if (this._done) {
41622
+ return; // ignore new data
41623
+ }
41624
+ if (this._requests.length > 0) {
41625
+ var requestCapability = this._requests.shift();
41626
+ requestCapability.resolve({value: chunk, done: false});
41627
+ return;
41628
+ }
41629
+ this._queuedChunks.push(chunk);
41630
+ },
41631
+
41632
+ get headersReady() {
41633
+ return this._headersReady;
41634
+ },
41635
+
41636
+ get isRangeSupported() {
41637
+ return this._stream._isRangeSupported;
41638
+ },
41639
+
41640
+ get isStreamingSupported() {
41641
+ return this._stream._isStreamingSupported;
41642
+ },
41643
+
41644
+ get contentLength() {
41645
+ return this._stream._contentLength;
41646
+ },
41647
+
41648
+ read: function PDFWorkerStreamReader_read() {
41649
+ if (this._queuedChunks.length > 0) {
41650
+ var chunk = this._queuedChunks.shift();
41651
+ return Promise.resolve({value: chunk, done: false});
41652
+ }
41653
+ if (this._done) {
41654
+ return Promise.resolve({value: undefined, done: true});
41655
+ }
41656
+ var requestCapability = createPromiseCapability();
41657
+ this._requests.push(requestCapability);
41658
+ return requestCapability.promise;
41659
+ },
41660
+
41661
+ cancel: function PDFWorkerStreamReader_cancel(reason) {
41662
+ this._done = true;
41663
+ this._requests.forEach(function (requestCapability) {
41664
+ requestCapability.resolve({value: undefined, done: true});
41665
+ });
41666
+ this._requests = [];
41667
+ }
41668
+ };
41669
+
41670
+ /** @implements {IPDFStreamRangeReader} */
41671
+ function PDFWorkerStreamRangeReader(stream, begin, end) {
41672
+ this._stream = stream;
41673
+ this._begin = begin;
41674
+ this._end = end;
41675
+ this._queuedChunk = null;
41676
+ this._requests = [];
41677
+ this._done = false;
41678
+
41679
+ this.onProgress = null;
41680
+ }
41681
+ PDFWorkerStreamRangeReader.prototype = {
41682
+ _enqueue: function PDFWorkerStreamRangeReader_enqueue(chunk) {
41683
+ if (this._done) {
41684
+ return; // ignore new data
41685
+ }
41686
+ if (this._requests.length === 0) {
41687
+ this._queuedChunk = chunk;
41688
+ } else {
41689
+ var requestsCapability = this._requests.shift();
41690
+ requestsCapability.resolve({value: chunk, done: false});
41691
+ this._requests.forEach(function (requestCapability) {
41692
+ requestCapability.resolve({value: undefined, done: true});
41693
+ });
41694
+ this._requests = [];
41695
+ }
41696
+ this._done = true;
41697
+ this._stream._removeRangeReader(this);
41698
+ },
41699
+
41700
+ get isStreamingSupported() {
41701
+ return false;
41702
+ },
41703
+
41704
+ read: function PDFWorkerStreamRangeReader_read() {
41705
+ if (this._queuedChunk) {
41706
+ return Promise.resolve({value: this._queuedChunk, done: false});
41707
+ }
41708
+ if (this._done) {
41709
+ return Promise.resolve({value: undefined, done: true});
41710
+ }
41711
+ var requestCapability = createPromiseCapability();
41712
+ this._requests.push(requestCapability);
41713
+ return requestCapability.promise;
41714
+ },
41715
+
41716
+ cancel: function PDFWorkerStreamRangeReader_cancel(reason) {
41717
+ this._done = true;
41718
+ this._requests.forEach(function (requestCapability) {
41719
+ requestCapability.resolve({value: undefined, done: true});
41720
+ });
41721
+ this._requests = [];
41722
+ this._stream._removeRangeReader(this);
41723
+ }
41724
+ };
41725
+
41726
+ return PDFWorkerStream;
41727
+ })();
41728
+
41729
+ /** @type IPDFStream */
41730
+ var PDFNetworkStream;
41731
+
41732
+ /**
41733
+ * Sets PDFNetworkStream class to be used as alternative PDF data transport.
41734
+ * @param {IPDFStream} cls - the PDF data transport.
41735
+ */
41736
+ function setPDFNetworkStreamClass(cls) {
41737
+ PDFNetworkStream = cls;
41738
+ }
41739
+
41740
  var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
41741
  setup: function wphSetup(handler, port) {
41742
  var testMessageProcessed = false;
41843
  var pdfManager;
41844
 
41845
  var source = data.source;
 
41846
  if (source.data) {
41847
  try {
41848
  pdfManager = new LocalPdfManager(docId, source.data, source.password);
41851
  pdfManagerCapability.reject(ex);
41852
  }
41853
  return pdfManagerCapability.promise;
41854
+ }
41855
+
41856
+ var pdfStream;
41857
+ try {
41858
+ if (source.chunkedViewerLoading) {
41859
+ pdfStream = new PDFWorkerStream(source, handler);
41860
+ } else {
41861
+ assert(PDFNetworkStream, 'pdfjs/core/network module is not loaded');
41862
+ pdfStream = new PDFNetworkStream(data);
41863
  }
41864
+ } catch (ex) {
41865
+ pdfManagerCapability.reject(ex);
41866
  return pdfManagerCapability.promise;
41867
  }
41868
 
41869
+ var fullRequest = pdfStream.getFullReader();
41870
+ fullRequest.headersReady.then(function () {
41871
+ if (!fullRequest.isStreamingSupported ||
41872
+ !fullRequest.isRangeSupported) {
41873
+ // If stream or range are disabled, it's our only way to report
41874
+ // loading progress.
41875
+ fullRequest.onProgress = function (evt) {
41876
+ handler.send('DocProgress', {
41877
+ loaded: evt.loaded,
41878
+ total: evt.total
41879
+ });
41880
+ };
41881
+ }
 
 
 
 
 
 
 
 
41882
 
41883
+ if (!fullRequest.isRangeSupported) {
41884
+ return;
41885
+ }
 
 
 
 
 
 
 
 
 
41886
 
41887
+ // We don't need auto-fetch when streaming is enabled.
41888
+ var disableAutoFetch = source.disableAutoFetch ||
41889
+ fullRequest.isStreamingSupported;
41890
+ pdfManager = new NetworkPdfManager(docId, pdfStream, {
41891
+ msgHandler: handler,
41892
+ url: source.url,
41893
+ password: source.password,
41894
+ length: fullRequest.contentLength,
41895
+ disableAutoFetch: disableAutoFetch,
41896
+ rangeChunkSize: source.rangeChunkSize
41897
+ });
41898
+ pdfManagerCapability.resolve(pdfManager);
41899
+ cancelXHRs = null;
41900
+ }).catch(function (reason) {
41901
+ pdfManagerCapability.reject(reason);
41902
+ cancelXHRs = null;
41903
+ });
41904
 
41905
+ var cachedChunks = [], loaded = 0;
41906
+ var flushChunks = function () {
41907
+ var pdfFile = arraysToBytes(cachedChunks);
41908
+ if (source.length && pdfFile.length !== source.length) {
41909
+ warn('reported HTTP length is different from actual');
41910
+ }
41911
+ // the data is array, instantiating directly from it
41912
+ try {
41913
+ pdfManager = new LocalPdfManager(docId, pdfFile, source.password);
41914
+ pdfManagerCapability.resolve(pdfManager);
41915
+ } catch (ex) {
41916
+ pdfManagerCapability.reject(ex);
41917
+ }
41918
+ cachedChunks = [];
41919
+ };
41920
+ var readPromise = new Promise(function (resolve, reject) {
41921
+ var readChunk = function (chunk) {
41922
  try {
41923
+ ensureNotTerminated();
41924
+ if (chunk.done) {
41925
+ if (!pdfManager) {
41926
+ flushChunks();
41927
+ }
41928
+ cancelXHRs = null;
41929
+ return;
41930
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
41931
 
41932
+ var data = chunk.value;
41933
+ loaded += arrayByteLength(data);
41934
+ if (!fullRequest.isStreamingSupported) {
41935
+ handler.send('DocProgress', {
41936
+ loaded: loaded,
41937
+ total: Math.max(loaded, fullRequest.contentLength || 0)
41938
+ });
 
 
 
41939
  }
 
 
 
 
 
 
 
 
 
41940
 
41941
+ if (pdfManager) {
41942
+ pdfManager.sendProgressiveData(data);
41943
+ } else {
41944
+ cachedChunks.push(data);
41945
+ }
 
 
 
 
41946
 
41947
+ fullRequest.read().then(readChunk, reject);
41948
+ } catch (e) {
41949
+ reject(e);
 
 
 
 
 
 
 
 
41950
  }
41951
+ };
41952
+ fullRequest.read().then(readChunk, reject);
41953
+ });
41954
+ readPromise.catch(function (e) {
41955
+ pdfManagerCapability.reject(e);
41956
+ cancelXHRs = null;
 
 
 
41957
  });
41958
 
41959
  cancelXHRs = function () {
41960
+ pdfStream.cancelAllRequests('abort');
41961
  };
41962
 
41963
  return pdfManagerCapability.promise;
42298
  initializeWorker();
42299
  }
42300
 
42301
+ exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass;
42302
  exports.WorkerTask = WorkerTask;
42303
  exports.WorkerMessageHandler = WorkerMessageHandler;
42304
  }));
42305
 
42306
 
42307
+
42308
+
42309
+ var NetworkManager = (function NetworkManagerClosure() {
42310
+
42311
+ var OK_RESPONSE = 200;
42312
+ var PARTIAL_CONTENT_RESPONSE = 206;
42313
+
42314
+ function NetworkManager(url, args) {
42315
+ this.url = url;
42316
+ args = args || {};
42317
+ this.isHttp = /^https?:/i.test(url);
42318
+ this.httpHeaders = (this.isHttp && args.httpHeaders) || {};
42319
+ this.withCredentials = args.withCredentials || false;
42320
+ this.getXhr = args.getXhr ||
42321
+ function NetworkManager_getXhr() {
42322
+ return new XMLHttpRequest();
42323
+ };
42324
+
42325
+ this.currXhrId = 0;
42326
+ this.pendingRequests = Object.create(null);
42327
+ this.loadedRequests = Object.create(null);
42328
+ }
42329
+
42330
+ function getArrayBuffer(xhr) {
42331
+ var data = xhr.response;
42332
+ if (typeof data !== 'string') {
42333
+ return data;
42334
+ }
42335
+ var length = data.length;
42336
+ var array = new Uint8Array(length);
42337
+ for (var i = 0; i < length; i++) {
42338
+ array[i] = data.charCodeAt(i) & 0xFF;
42339
+ }
42340
+ return array.buffer;
42341
+ }
42342
+
42343
+ var supportsMozChunked = (function supportsMozChunkedClosure() {
42344
+ try {
42345
+ var x = new XMLHttpRequest();
42346
+ // Firefox 37- required .open() to be called before setting responseType.
42347
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=707484
42348
+ // Even though the URL is not visited, .open() could fail if the URL is
42349
+ // blocked, e.g. via the connect-src CSP directive or the NoScript addon.
42350
+ // When this error occurs, this feature detection method will mistakenly
42351
+ // report that moz-chunked-arraybuffer is not supported in Firefox 37-.
42352
+ x.open('GET', 'https://example.com');
42353
+ x.responseType = 'moz-chunked-arraybuffer';
42354
+ return x.responseType === 'moz-chunked-arraybuffer';
42355
+ } catch (e) {
42356
+ return false;
42357
+ }
42358
+ })();
42359
+
42360
+ NetworkManager.prototype = {
42361
+ requestRange: function NetworkManager_requestRange(begin, end, listeners) {
42362
+ var args = {
42363
+ begin: begin,
42364
+ end: end
42365
+ };
42366
+ for (var prop in listeners) {
42367
+ args[prop] = listeners[prop];
42368
+ }
42369
+ return this.request(args);
42370
+ },
42371
+
42372
+ requestFull: function NetworkManager_requestFull(listeners) {
42373
+ return this.request(listeners);
42374
+ },
42375
+
42376
+ request: function NetworkManager_request(args) {
42377
+ var xhr = this.getXhr();
42378
+ var xhrId = this.currXhrId++;
42379
+ var pendingRequest = this.pendingRequests[xhrId] = {
42380
+ xhr: xhr
42381
+ };
42382
+
42383
+ xhr.open('GET', this.url);
42384
+ xhr.withCredentials = this.withCredentials;
42385
+ for (var property in this.httpHeaders) {
42386
+ var value = this.httpHeaders[property];
42387
+ if (typeof value === 'undefined') {
42388
+ continue;
42389
+ }
42390
+ xhr.setRequestHeader(property, value);
42391
+ }
42392
+ if (this.isHttp && 'begin' in args && 'end' in args) {
42393
+ var rangeStr = args.begin + '-' + (args.end - 1);
42394
+ xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
42395
+ pendingRequest.expectedStatus = 206;
42396
+ } else {
42397
+ pendingRequest.expectedStatus = 200;
42398
+ }
42399
+
42400
+ var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;
42401
+ if (useMozChunkedLoading) {
42402
+ xhr.responseType = 'moz-chunked-arraybuffer';
42403
+ pendingRequest.onProgressiveData = args.onProgressiveData;
42404
+ pendingRequest.mozChunked = true;
42405
+ } else {
42406
+ xhr.responseType = 'arraybuffer';
42407
+ }
42408
+
42409
+ if (args.onError) {
42410
+ xhr.onerror = function(evt) {
42411
+ args.onError(xhr.status);
42412
+ };
42413
+ }
42414
+ xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
42415
+ xhr.onprogress = this.onProgress.bind(this, xhrId);
42416
+
42417
+ pendingRequest.onHeadersReceived = args.onHeadersReceived;
42418
+ pendingRequest.onDone = args.onDone;
42419
+ pendingRequest.onError = args.onError;
42420
+ pendingRequest.onProgress = args.onProgress;
42421
+
42422
+ xhr.send(null);
42423
+
42424
+ return xhrId;
42425
+ },
42426
+
42427
+ onProgress: function NetworkManager_onProgress(xhrId, evt) {
42428
+ var pendingRequest = this.pendingRequests[xhrId];
42429
+ if (!pendingRequest) {
42430
+ // Maybe abortRequest was called...
42431
+ return;
42432
+ }
42433
+
42434
+ if (pendingRequest.mozChunked) {
42435
+ var chunk = getArrayBuffer(pendingRequest.xhr);
42436
+ pendingRequest.onProgressiveData(chunk);
42437
+ }
42438
+
42439
+ var onProgress = pendingRequest.onProgress;
42440
+ if (onProgress) {
42441
+ onProgress(evt);
42442
+ }
42443
+ },
42444
+
42445
+ onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
42446
+ var pendingRequest = this.pendingRequests[xhrId];
42447
+ if (!pendingRequest) {
42448
+ // Maybe abortRequest was called...
42449
+ return;
42450
+ }
42451
+
42452
+ var xhr = pendingRequest.xhr;
42453
+ if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
42454
+ pendingRequest.onHeadersReceived();
42455
+ delete pendingRequest.onHeadersReceived;
42456
+ }
42457
+
42458
+ if (xhr.readyState !== 4) {
42459
+ return;
42460
+ }
42461
+
42462
+ if (!(xhrId in this.pendingRequests)) {
42463
+ // The XHR request might have been aborted in onHeadersReceived()
42464
+ // callback, in which case we should abort request
42465
+ return;
42466
+ }
42467
+
42468
+ delete this.pendingRequests[xhrId];
42469
+
42470
+ // success status == 0 can be on ftp, file and other protocols
42471
+ if (xhr.status === 0 && this.isHttp) {
42472
+ if (pendingRequest.onError) {
42473
+ pendingRequest.onError(xhr.status);
42474
+ }
42475
+ return;
42476
+ }
42477
+ var xhrStatus = xhr.status || OK_RESPONSE;
42478
+
42479
+ // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
42480
+ // "A server MAY ignore the Range header". This means it's possible to
42481
+ // get a 200 rather than a 206 response from a range request.
42482
+ var ok_response_on_range_request =
42483
+ xhrStatus === OK_RESPONSE &&
42484
+ pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
42485
+
42486
+ if (!ok_response_on_range_request &&
42487
+ xhrStatus !== pendingRequest.expectedStatus) {
42488
+ if (pendingRequest.onError) {
42489
+ pendingRequest.onError(xhr.status);
42490
+ }
42491
+ return;
42492
+ }
42493
+
42494
+ this.loadedRequests[xhrId] = true;
42495
+
42496
+ var chunk = getArrayBuffer(xhr);
42497
+ if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
42498
+ var rangeHeader = xhr.getResponseHeader('Content-Range');
42499
+ var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
42500
+ var begin = parseInt(matches[1], 10);
42501
+ pendingRequest.onDone({
42502
+ begin: begin,
42503
+ chunk: chunk
42504
+ });
42505
+ } else if (pendingRequest.onProgressiveData) {
42506
+ pendingRequest.onDone(null);
42507
+ } else if (chunk) {
42508
+ pendingRequest.onDone({
42509
+ begin: 0,
42510
+ chunk: chunk
42511
+ });
42512
+ } else if (pendingRequest.onError) {
42513
+ pendingRequest.onError(xhr.status);
42514
+ }
42515
+ },
42516
+
42517
+ hasPendingRequests: function NetworkManager_hasPendingRequests() {
42518
+ for (var xhrId in this.pendingRequests) {
42519
+ return true;
42520
+ }
42521
+ return false;
42522
+ },
42523
+
42524
+ getRequestXhr: function NetworkManager_getXhr(xhrId) {
42525
+ return this.pendingRequests[xhrId].xhr;
42526
+ },
42527
+
42528
+ isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
42529
+ return !!(this.pendingRequests[xhrId].onProgressiveData);
42530
+ },
42531
+
42532
+ isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
42533
+ return xhrId in this.pendingRequests;
42534
+ },
42535
+
42536
+ isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
42537
+ return xhrId in this.loadedRequests;
42538
+ },
42539
+
42540
+ abortAllRequests: function NetworkManager_abortAllRequests() {
42541
+ for (var xhrId in this.pendingRequests) {
42542
+ this.abortRequest(xhrId | 0);
42543
+ }
42544
+ },
42545
+
42546
+ abortRequest: function NetworkManager_abortRequest(xhrId) {
42547
+ var xhr = this.pendingRequests[xhrId].xhr;
42548
+ delete this.pendingRequests[xhrId];
42549
+ xhr.abort();
42550
+ }
42551
+ };
42552
+
42553
+ return NetworkManager;
42554
+ })();
42555
+
42556
+ (function (root, factory) {
42557
+ {
42558
+ factory((root.pdfjsCoreNetwork = {}), root.pdfjsSharedUtil,
42559
+ root.pdfjsCoreWorker);
42560
+ }
42561
+ }(this, function (exports, sharedUtil, coreWorker) {
42562
+
42563
+ var assert = sharedUtil.assert;
42564
+ var createPromiseCapability = sharedUtil.createPromiseCapability;
42565
+ var isInt = sharedUtil.isInt;
42566
+ var MissingPDFException = sharedUtil.MissingPDFException;
42567
+ var UnexpectedResponseException = sharedUtil.UnexpectedResponseException;
42568
+
42569
+ /** @implements {IPDFStream} */
42570
+ function PDFNetworkStream(options) {
42571
+ this._options = options;
42572
+ var source = options.source;
42573
+ this._manager = new NetworkManager(source.url, {
42574
+ httpHeaders: source.httpHeaders,
42575
+ withCredentials: source.withCredentials
42576
+ });
42577
+ this._rangeChunkSize = source.rangeChunkSize;
42578
+ this._fullRequestReader = null;
42579
+ this._rangeRequestReaders = [];
42580
+ }
42581
+
42582
+ PDFNetworkStream.prototype = {
42583
+ _onRangeRequestReaderClosed:
42584
+ function PDFNetworkStream_onRangeRequestReaderClosed(reader) {
42585
+ var i = this._rangeRequestReaders.indexOf(reader);
42586
+ if (i >= 0) {
42587
+ this._rangeRequestReaders.splice(i, 1);
42588
+ }
42589
+ },
42590
+
42591
+ getFullReader: function PDFNetworkStream_getFullReader() {
42592
+ assert(!this._fullRequestReader);
42593
+ this._fullRequestReader =
42594
+ new PDFNetworkStreamFullRequestReader(this._manager, this._options);
42595
+ return this._fullRequestReader;
42596
+ },
42597
+
42598
+ getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) {
42599
+ var reader = new PDFNetworkStreamRangeRequestReader(this._manager,
42600
+ begin, end);
42601
+ reader.onClosed = this._onRangeRequestReaderClosed.bind(this);
42602
+ this._rangeRequestReaders.push(reader);
42603
+ return reader;
42604
+ },
42605
+
42606
+ cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) {
42607
+ if (this._fullRequestReader) {
42608
+ this._fullRequestReader.cancel(reason);
42609
+ }
42610
+ var readers = this._rangeRequestReaders.slice(0);
42611
+ readers.forEach(function (reader) {
42612
+ reader.cancel(reason);
42613
+ });
42614
+ }
42615
+ };
42616
+
42617
+ /** @implements {IPDFStreamReader} */
42618
+ function PDFNetworkStreamFullRequestReader(manager, options) {
42619
+ this._manager = manager;
42620
+
42621
+ var source = options.source;
42622
+ var args = {
42623
+ onHeadersReceived: this._onHeadersReceived.bind(this),
42624
+ onProgressiveData: source.disableStream ? null :
42625
+ this._onProgressiveData.bind(this),
42626
+ onDone: this._onDone.bind(this),
42627
+ onError: this._onError.bind(this),
42628
+ onProgress: this._onProgress.bind(this)
42629
+ };
42630
+ this._url = source.url;
42631
+ this._fullRequestId = manager.requestFull(args);
42632
+ this._headersReceivedCapability = createPromiseCapability();
42633
+ this._disableRange = options.disableRange || false;
42634
+ this._contentLength = source.length; // optional
42635
+ this._rangeChunkSize = source.rangeChunkSize;
42636
+ if (!this._rangeChunkSize && !this._disableRange) {
42637
+ this._disableRange = true;
42638
+ }
42639
+
42640
+ this._isStreamingSupported = false;
42641
+ this._isRangeSupported = false;
42642
+
42643
+ this._cachedChunks = [];
42644
+ this._requests = [];
42645
+ this._done = false;
42646
+ this._storedError = undefined;
42647
+
42648
+ this.onProgress = null;
42649
+ }
42650
+
42651
+ PDFNetworkStreamFullRequestReader.prototype = {
42652
+ _validateRangeRequestCapabilities: function
42653
+ PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities() {
42654
+
42655
+ if (this._disableRange) {
42656
+ return false;
42657
+ }
42658
+
42659
+ var networkManager = this._manager;
42660
+ var fullRequestXhrId = this._fullRequestId;
42661
+ var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);
42662
+ if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {
42663
+ return false;
42664
+ }
42665
+
42666
+ var contentEncoding =
42667
+ fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';
42668
+ if (contentEncoding !== 'identity') {
42669
+ return false;
42670
+ }
42671
+
42672
+ var length = fullRequestXhr.getResponseHeader('Content-Length');
42673
+ length = parseInt(length, 10);
42674
+ if (!isInt(length)) {
42675
+ return false;
42676
+ }
42677
+
42678
+ this._contentLength = length; // setting right content length
42679
+
42680
+ if (length <= 2 * this._rangeChunkSize) {
42681
+ // The file size is smaller than the size of two chunks, so it does
42682
+ // not make any sense to abort the request and retry with a range
42683
+ // request.
42684
+ return false;
42685
+ }
42686
+
42687
+ return true;
42688
+ },
42689
+
42690
+ _onHeadersReceived:
42691
+ function PDFNetworkStreamFullRequestReader_onHeadersReceived() {
42692
+
42693
+ if (this._validateRangeRequestCapabilities()) {
42694
+ this._isRangeSupported = true;
42695
+ }
42696
+
42697
+ var networkManager = this._manager;
42698
+ var fullRequestXhrId = this._fullRequestId;
42699
+ if (networkManager.isStreamingRequest(fullRequestXhrId)) {
42700
+ // We can continue fetching when progressive loading is enabled,
42701
+ // and we don't need the autoFetch feature.
42702
+ this._isStreamingSupported = true;
42703
+ } else if (this._isRangeSupported) {
42704
+ // NOTE: by cancelling the full request, and then issuing range
42705
+ // requests, there will be an issue for sites where you can only
42706
+ // request the pdf once. However, if this is the case, then the
42707
+ // server should not be returning that it can support range
42708
+ // requests.
42709
+ networkManager.abortRequest(fullRequestXhrId);
42710
+ }
42711
+
42712
+ this._headersReceivedCapability.resolve();
42713
+ },
42714
+
42715
+ _onProgressiveData:
42716
+ function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) {
42717
+ if (this._requests.length > 0) {
42718
+ var requestCapability = this._requests.shift();
42719
+ requestCapability.resolve({value: chunk, done: false});
42720
+ } else {
42721
+ this._cachedChunks.push(chunk);
42722
+ }
42723
+ },
42724
+
42725
+ _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) {
42726
+ if (args) {
42727
+ this._onProgressiveData(args.chunk);
42728
+ }
42729
+ this._done = true;
42730
+ if (this._cachedChunks.length > 0) {
42731
+ return;
42732
+ }
42733
+ this._requests.forEach(function (requestCapability) {
42734
+ requestCapability.resolve({value: undefined, done: true});
42735
+ });
42736
+ this._requests = [];
42737
+ },
42738
+
42739
+ _onError: function PDFNetworkStreamFullRequestReader_onError(status) {
42740
+ var url = this._url;
42741
+ var exception;
42742
+ if (status === 404 || status === 0 && /^file:/.test(url)) {
42743
+ exception = new MissingPDFException('Missing PDF "' + url + '".');
42744
+ } else {
42745
+ exception = new UnexpectedResponseException(
42746
+ 'Unexpected server response (' + status +
42747
+ ') while retrieving PDF "' + url + '".', status);
42748
+ }
42749
+ this._storedError = exception;
42750
+ this._headersReceivedCapability.reject(exception);
42751
+ this._requests.forEach(function (requestCapability) {
42752
+ requestCapability.reject(exception);
42753
+ });
42754
+ this._requests = [];
42755
+ this._cachedChunks = [];
42756
+ },
42757
+
42758
+ _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) {
42759
+ if (this.onProgress) {
42760
+ this.onProgress({
42761
+ loaded: data.loaded,
42762
+ total: data.lengthComputable ? data.total : this._contentLength
42763
+ });
42764
+ }
42765
+ },
42766
+
42767
+ get isRangeSupported() {
42768
+ return this._isRangeSupported;
42769
+ },
42770
+
42771
+ get isStreamingSupported() {
42772
+ return this._isStreamingSupported;
42773
+ },
42774
+
42775
+ get contentLength() {
42776
+ return this._contentLength;
42777
+ },
42778
+
42779
+ get headersReady() {
42780
+ return this._headersReceivedCapability.promise;
42781
+ },
42782
+
42783
+ read: function PDFNetworkStreamFullRequestReader_read() {
42784
+ if (this._storedError) {
42785
+ return Promise.reject(this._storedError);
42786
+ }
42787
+ if (this._cachedChunks.length > 0) {
42788
+ var chunk = this._cachedChunks.shift();
42789
+ return Promise.resolve(chunk);
42790
+ }
42791
+ if (this._done) {
42792
+ return Promise.resolve({value: undefined, done: true});
42793
+ }
42794
+ var requestCapability = createPromiseCapability();
42795
+ this._requests.push(requestCapability);
42796
+ return requestCapability.promise;
42797
+ },
42798
+
42799
+ cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) {
42800
+ this._done = true;
42801
+ this._headersReceivedCapability.reject(reason);
42802
+ this._requests.forEach(function (requestCapability) {
42803
+ requestCapability.resolve({value: undefined, done: true});
42804
+ });
42805
+ this._requests = [];
42806
+ if (this._manager.isPendingRequest(this._fullRequestId)) {
42807
+ this._manager.abortRequest(this._fullRequestId);
42808
+ }
42809
+ this._fullRequestReader = null;
42810
+ }
42811
+ };
42812
+
42813
+ /** @implements {IPDFStreamRangeReader} */
42814
+ function PDFNetworkStreamRangeRequestReader(manager, begin, end) {
42815
+ this._manager = manager;
42816
+ var args = {
42817
+ onDone: this._onDone.bind(this),
42818
+ onProgress: this._onProgress.bind(this)
42819
+ };
42820
+ this._requestId = manager.requestRange(begin, end, args);
42821
+ this._requests = [];
42822
+ this._queuedChunk = null;
42823
+ this._done = false;
42824
+
42825
+ this.onProgress = null;
42826
+ this.onClosed = null;
42827
+ }
42828
+
42829
+ PDFNetworkStreamRangeRequestReader.prototype = {
42830
+ _close: function PDFNetworkStreamRangeRequestReader_close() {
42831
+ if (this.onClosed) {
42832
+ this.onClosed(this);
42833
+ }
42834
+ },
42835
+
42836
+ _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) {
42837
+ var chunk = data.chunk;
42838
+ if (this._requests.length > 0) {
42839
+ var requestCapability = this._requests.shift();
42840
+ requestCapability.resolve({value: chunk, done: false});
42841
+ } else {
42842
+ this._queuedChunk = chunk;
42843
+ }
42844
+ this._done = true;
42845
+ this._requests.forEach(function (requestCapability) {
42846
+ requestCapability.resolve({value: undefined, done: true});
42847
+ });
42848
+ this._requests = [];
42849
+ this._close();
42850
+ },
42851
+
42852
+ _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) {
42853
+ if (!this.isStreamingSupported && this.onProgress) {
42854
+ this.onProgress({
42855
+ loaded: evt.loaded
42856
+ });
42857
+ }
42858
+ },
42859
+
42860
+ get isStreamingSupported() {
42861
+ return false; // TODO allow progressive range bytes loading
42862
+ },
42863
+
42864
+ read: function PDFNetworkStreamRangeRequestReader_read() {
42865
+ if (this._queuedChunk !== null) {
42866
+ var chunk = this._queuedChunk;
42867
+ this._queuedChunk = null;
42868
+ return Promise.resolve({value: chunk, done: false});
42869
+ }
42870
+ if (this._done) {
42871
+ return Promise.resolve({value: undefined, done: true});
42872
+ }
42873
+ var requestCapability = createPromiseCapability();
42874
+ this._requests.push(requestCapability);
42875
+ return requestCapability.promise;
42876
+ },
42877
+
42878
+ cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) {
42879
+ this._done = true;
42880
+ this._requests.forEach(function (requestCapability) {
42881
+ requestCapability.resolve({value: undefined, done: true});
42882
+ });
42883
+ this._requests = [];
42884
+ if (this._manager.isPendingRequest(this._requestId)) {
42885
+ this._manager.abortRequest(this._requestId);
42886
+ }
42887
+ this._close();
42888
+ }
42889
+ };
42890
+
42891
+ coreWorker.setPDFNetworkStreamClass(PDFNetworkStream);
42892
+
42893
+ exports.PDFNetworkStream = PDFNetworkStream;
42894
+ exports.NetworkManager = NetworkManager;
42895
+ }));
42896
+
42897
+
42898
  }).call(pdfjsLibs);
42899
 
42900
  exports.PDFJS = pdfjsLibs.pdfjsSharedGlobal.PDFJS;
lang/pdf-embedder-fr_FR.mo ADDED
Binary file
lang/pdf-embedder-fr_FR.po ADDED
@@ -0,0 +1,630 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2016
2
+ # This file is distributed under the same license as the package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/PDFEmbedder\n"
7
+ "POT-Creation-Date: 2016-03-23 16:27+0100\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2016-03-23 17:46+0100\n"
12
+ "Language-Team: \n"
13
+ "X-Generator: Poedit 1.8.7\n"
14
+ "Last-Translator: \n"
15
+ "Plural-Forms: nplurals=2; plural=(n > 1);\n"
16
+ "Language: fr_FR\n"
17
+
18
+ #: basic_pdf_embedder.php:76
19
+ msgid "Options only available in Premium versions"
20
+ msgstr "En option seulement dans les versions premium"
21
+
22
+ #: basic_pdf_embedder.php:78 core/commercial_pdf_embedder.php:64
23
+ msgid "Download Button"
24
+ msgstr "Bouton téléchargement"
25
+
26
+ #: basic_pdf_embedder.php:80
27
+ msgid "Provide PDF download button on toolbar"
28
+ msgstr "Affiche un bouton téléchargement dans la barre d'outils"
29
+
30
+ #: basic_pdf_embedder.php:85 core/commercial_pdf_embedder.php:73
31
+ msgid "Track Views/Downloads"
32
+ msgstr "Suivre Vues / Téléchargements"
33
+
34
+ #: basic_pdf_embedder.php:87
35
+ msgid "Count number of views and downloads"
36
+ msgstr "Compter le nombre de vues et téléchargements"
37
+
38
+ #: basic_pdf_embedder.php:92 core/commercial_pdf_embedder.php:82
39
+ msgid "External Links"
40
+ msgstr "Liens externes"
41
+
42
+ #: basic_pdf_embedder.php:94 core/commercial_pdf_embedder.php:85
43
+ msgid "Open links in a new browser tab/window"
44
+ msgstr "Ouvrir les liens dans un nouvel onglet de navigateur / fenêtre"
45
+
46
+ #: basic_pdf_embedder.php:99 core/commercial_pdf_embedder.php:91
47
+ msgid "Scroll to Top"
48
+ msgstr "Défiler vers le Haut"
49
+
50
+ #: basic_pdf_embedder.php:101 core/commercial_pdf_embedder.php:94
51
+ msgid "Scroll to top of page when user clicks next/prev"
52
+ msgstr ""
53
+ "Défiler au haut de la page lorsque l'utilisateur clique suivante / précédente"
54
+
55
+ #: basic_pdf_embedder.php:105
56
+ msgid ""
57
+ "Find out more about <a href=\"%s\" target=\"_blank\">Premium Versions of the "
58
+ "plugin on our website</a>."
59
+ msgstr ""
60
+ "Pour en savoir plus sur <a href=\"%s\" target=\"_blank\">les Versions "
61
+ "premium du plugin sur notre site</a>."
62
+
63
+ #: basic_pdf_embedder.php:115
64
+ msgid "Mobile-friendly embedding using PDF Embedder Premium"
65
+ msgstr "Intégration pour mobiles en utilisant PDF Embedder premium"
66
+
67
+ #: basic_pdf_embedder.php:116
68
+ msgid ""
69
+ "This free version of the plugin should work on most mobile browsers, but it "
70
+ "will be cumbersome for users with small screens - it is difficult to "
71
+ "position\n"
72
+ " the document entirely within the screen, and your users' fingers "
73
+ "may catch the entire browser page when\n"
74
+ " they're trying only to move about the document..."
75
+ msgstr ""
76
+ "Cette version gratuite du plugin devrait fonctionner sur la plupart des "
77
+ "navigateurs mobiles, mais il sera lourd pour les utilisateurs avec de petits "
78
+ "écrans - il est difficile de position\n"
79
+ " le document entièrement à l'intérieur de l'écran, et les doigts "
80
+ "de vos utilisateurs peuvent attraper la page entière du navigateur lorsque\n"
81
+ " ils essaient seulement de se déplacer sur le document..."
82
+
83
+ #: basic_pdf_embedder.php:120
84
+ msgid ""
85
+ "Our <b>PDF Embedder Premium</b> plugin solves this problem with an "
86
+ "intelligent 'full screen' mode.\n"
87
+ " When the document is smaller than a certain width, the document "
88
+ "displays only as a 'thumbnail' with a large\n"
89
+ " 'View in Full Screen' button for the\n"
90
+ " user to click when they want to study your document.\n"
91
+ " This opens up the document so it has the full focus of the "
92
+ "mobile browser, and the user can move about the\n"
93
+ " document without hitting other parts of\n"
94
+ " the web page by mistake. Click Exit to return to the regular web "
95
+ "page."
96
+ msgstr ""
97
+ "Notre plugin <b>PDF Embedder Premium</b> résout ce problème avec un mode "
98
+ "intelligent \"plein écran\".\n"
99
+ " Lorsque le document est inférieur à une certaine largeur, le "
100
+ "document indique seulement en tant que \"vignette\" avec un grand\n"
101
+ " bouton 'Voir en plein écran' pour que votre\n"
102
+ " utilisateur puisse cliquer quand ils veulent consulter votre "
103
+ "document.\n"
104
+ " Cela ouvre le document de sorte qu'il a la pleine attention du "
105
+ "navigateur mobile, et l'utilisateur peut se déplacer dans le\n"
106
+ " document sans cliquer d'autres parties de\n"
107
+ " la page Web par erreur. Cliquer sur Quitter pour revenir à la "
108
+ "page Web principale."
109
+
110
+ #: basic_pdf_embedder.php:129 core/core_pdf_embedder.php:335
111
+ msgid ""
112
+ "See our website <a href=\"%s\">wp-pdf.com</a> for more details and purchase "
113
+ "options."
114
+ msgstr ""
115
+ "Consultez notre site Web <a href=\"%s\">wp-pdf.com</a> pour plus de détails "
116
+ "et d'options d'achat."
117
+
118
+ #: basic_pdf_embedder.php:175
119
+ msgid ""
120
+ "Track downloads and views with <a href=\"%s\" target=\"_blank\">PDF Embedder "
121
+ "Premium</a>"
122
+ msgstr ""
123
+ "Tracer les téléchargements et les vues avec <a href=\"%s\" target=\"_blank"
124
+ "\">PDF Embedder Premium</a>"
125
+
126
+ #: basic_pdf_embedder.php:177
127
+ msgid "Downloads/Views"
128
+ msgstr "Téléchargements / Vues"
129
+
130
+ #: core/EDD_SL_Plugin_Updater.php:248
131
+ msgid ""
132
+ "There is a new version of %1$s available. <a target=\"_blank\" class="
133
+ "\"thickbox\" href=\"%2$s\">View version %3$s details</a>."
134
+ msgstr ""
135
+ "Il y a une nouvelle version de %1$s disponible. <a target=\"_blank\" class="
136
+ "\"thickbox\" href=\"%2$s\">Voir les détails de la version %3$s</a>."
137
+
138
+ #: core/EDD_SL_Plugin_Updater.php:255
139
+ msgid ""
140
+ "There is a new version of %1$s available. <a target=\"_blank\" class="
141
+ "\"thickbox\" href=\"%2$s\">View version %3$s details</a> or <a href=\"%4$s"
142
+ "\">update now</a>."
143
+ msgstr ""
144
+ "Il y a une nouvelle version de %1$s disponible. <a target=\"_blank\" class="
145
+ "\"thickbox\" href=\"%2$s\">Voir les détails de la version %3$s</a> ou <a "
146
+ "href=\"%4$s\">mettre à jour maintenant</a>."
147
+
148
+ #: core/EDD_SL_Plugin_Updater.php:479
149
+ msgid "You do not have permission to install plugin updates"
150
+ msgstr "Vous n'êtes pas autorisé à installer les mises à jour du plugin"
151
+
152
+ #: core/EDD_SL_Plugin_Updater.php:479
153
+ msgid "Error"
154
+ msgstr "Erreur"
155
+
156
+ #: core/commercial_pdf_embedder.php:53
157
+ msgid "License"
158
+ msgstr "License"
159
+
160
+ #: core/commercial_pdf_embedder.php:67
161
+ msgid "Check to provide PDF download button in toolbar"
162
+ msgstr ""
163
+ "Vérifiez la présence du bouton de téléchargement de PDF dans la barre "
164
+ "d'outils"
165
+
166
+ #: core/commercial_pdf_embedder.php:76
167
+ msgid ""
168
+ "Count number of views and downloads (figures will be shown in <a href=\"%s"
169
+ "\">Media Library</a>)"
170
+ msgstr ""
171
+ "Compter le nombre de vues et téléchargements (les chiffres seront présentés "
172
+ "dans la <a href=\"%s\">Bibliothèque Médias </a>)"
173
+
174
+ #: core/commercial_pdf_embedder.php:104
175
+ msgid "Default Mobile Settings"
176
+ msgstr "Paramètres mobiles par défaut"
177
+
178
+ #: core/commercial_pdf_embedder.php:106
179
+ msgid ""
180
+ "When the document is smaller than the width specified below, the document "
181
+ "displays only as a 'thumbnail' with a large 'View in Full Screen' button for "
182
+ "the user to click to open."
183
+ msgstr ""
184
+ "Lorsque le document est plus petite que la largeur spécifiée ci-dessous, le "
185
+ "document s'affiche uniquement comme une 'miniature' avec un grand bouton "
186
+ "'Voir en plein écran' pour que l'utilisateur clique pour ouvrir."
187
+
188
+ #: core/commercial_pdf_embedder.php:108
189
+ msgid "Mobile Width"
190
+ msgstr "Largeur mobile"
191
+
192
+ #: core/commercial_pdf_embedder.php:112
193
+ msgid ""
194
+ "Enter an integer number of pixels, or 0 to disable automatic full-screen"
195
+ msgstr ""
196
+ "Entrez un nombre entier de pixels, ou 0 pour désactiver automatique le plein "
197
+ "écran"
198
+
199
+ #: core/commercial_pdf_embedder.php:116
200
+ msgid "Disable Device Zoom"
201
+ msgstr "Désactiver le Zoom"
202
+
203
+ #: core/commercial_pdf_embedder.php:119
204
+ msgid "Enable if you are experiencing quality issues on mobiles"
205
+ msgstr "Activer si vous rencontrez des problèmes de qualité sur les mobiles"
206
+
207
+ #: core/commercial_pdf_embedder.php:124
208
+ msgid ""
209
+ "Some mobile browsers will use their own zoom, causing the PDF Embedder to "
210
+ "render at a lower resolution than it should, or lose the toolbar off screen."
211
+ msgstr ""
212
+ "Certains navigateurs mobiles vont utiliser leur propre zoom, PDF Embedder "
213
+ "peut alors afficher une résolution inférieure à ce qu'elle devrait, ou "
214
+ "perdre la barre d'outils hors de l'écran."
215
+
216
+ #: core/commercial_pdf_embedder.php:125
217
+ msgid ""
218
+ "Enabling this option may help, but could potentially affect appearance in "
219
+ "the rest of your site."
220
+ msgstr ""
221
+ "L'activation de cette option peut aider, mais pourrait potentiellement "
222
+ "affecter l'apparence dans le reste de votre site."
223
+
224
+ #: core/commercial_pdf_embedder.php:126
225
+ msgid "See <a href=\"%s\" target=\"_blank\">documentation</a> for details."
226
+ msgstr ""
227
+ "Voir la <a href=\"%s\" target=\"_blank\">documentation</a> pour plus de "
228
+ "détails."
229
+
230
+ #: core/commercial_pdf_embedder.php:137
231
+ msgid ""
232
+ "You should have received a license key when you purchased this premium "
233
+ "version of PDF Embedder."
234
+ msgstr ""
235
+ "Vous devriez avoir reçu une clé de licence lorsque vous avez acheté cette "
236
+ "version premium de PDF Embedder."
237
+
238
+ #: core/commercial_pdf_embedder.php:138
239
+ msgid ""
240
+ "Please enter it below to enable automatic updates, or <a href=\"%s\">email "
241
+ "us</a> if you do not have one."
242
+ msgstr ""
243
+ "Veuillez valider ci-dessous pour activer les mises à jour automatiques, ou "
244
+ "<a href=\"%s\">envoyez nous un mail</a> si vous ne l'avez pas."
245
+
246
+ #: core/commercial_pdf_embedder.php:140
247
+ msgid "License Key"
248
+ msgstr "Clé de licence"
249
+
250
+ #: core/commercial_pdf_embedder.php:153
251
+ msgid "Current License"
252
+ msgstr "Licence actuelle"
253
+
254
+ #: core/commercial_pdf_embedder.php:156
255
+ msgid "Status"
256
+ msgstr "Statut"
257
+
258
+ #: core/commercial_pdf_embedder.php:160
259
+ msgid "Last Checked"
260
+ msgstr "Dernière vérification"
261
+
262
+ #: core/commercial_pdf_embedder.php:168
263
+ msgid "License Expires"
264
+ msgstr "Licence Expirée"
265
+
266
+ #: core/commercial_pdf_embedder.php:180
267
+ msgid ""
268
+ "To renew your license, please <a href=\"%s\" target=\"_blank\">click here</"
269
+ "a>."
270
+ msgstr ""
271
+ "Pour renouveler votre licence, veuillez <a href=\"%s\" target=\"_blank"
272
+ "\">cliquer ici</a>."
273
+
274
+ #: core/commercial_pdf_embedder.php:183
275
+ msgid ""
276
+ "You will receive a 50% discount if you renew before your license expires."
277
+ msgstr ""
278
+ "Vous recevrez une remise de 50% si vous renouvelez avant l'expiration de "
279
+ "votre licence."
280
+
281
+ #: core/commercial_pdf_embedder.php:309
282
+ msgid "Mobile width should be an integer number of pixels, or 0 to turn off"
283
+ msgstr ""
284
+ "La largeur du mobile doit être un nombre entier de pixels, ou 0 pour "
285
+ "désactiver"
286
+
287
+ #: core/commercial_pdf_embedder.php:310
288
+ msgid "License key is too short"
289
+ msgstr "La clé de licence est trop court"
290
+
291
+ #: core/commercial_pdf_embedder.php:312
292
+ msgid "License key failed to activate"
293
+ msgstr "Echec d'activation de la clef de Licence"
294
+
295
+ #: core/commercial_pdf_embedder.php:313
296
+ msgid "License key does not exist in our system at all"
297
+ msgstr "La clé de licence n'existe pas dans notre système"
298
+
299
+ #: core/commercial_pdf_embedder.php:314
300
+ msgid "License key entered is for the wrong product"
301
+ msgstr "La clé de licence est entrée pour le mauvais produit"
302
+
303
+ #: core/commercial_pdf_embedder.php:315
304
+ msgid "License key has expired"
305
+ msgstr "La clé de licence a expiré"
306
+
307
+ #: core/commercial_pdf_embedder.php:316
308
+ msgid "License key is not permitted for this website"
309
+ msgstr "La clé de licence n'est pas autorisée pour ce site"
310
+
311
+ #: core/commercial_pdf_embedder.php:317
312
+ msgid "License key is not active for this website"
313
+ msgstr "La clé de licence n'est pas active pour ce site"
314
+
315
+ #: core/commercial_pdf_embedder.php:318
316
+ msgid "License key has been disabled"
317
+ msgstr "La clé de licence a été désactivée"
318
+
319
+ #: core/commercial_pdf_embedder.php:319
320
+ msgid "License key was not provided"
321
+ msgstr "La clé de licence n'a pas été fourni"
322
+
323
+ #: core/commercial_pdf_embedder.php:361
324
+ msgid "Downloads"
325
+ msgstr "Téléchargements"
326
+
327
+ #: core/commercial_pdf_embedder.php:365
328
+ msgid "Views"
329
+ msgstr "Vues"
330
+
331
+ #: core/core_pdf_embedder.php:37
332
+ msgid "Loading..."
333
+ msgstr "Chargement..."
334
+
335
+ #: core/core_pdf_embedder.php:38
336
+ msgid "Page"
337
+ msgstr "Page"
338
+
339
+ #: core/core_pdf_embedder.php:39
340
+ msgid "Zoom"
341
+ msgstr "Zoom"
342
+
343
+ #: core/core_pdf_embedder.php:40
344
+ msgid "Previous page"
345
+ msgstr "Page précédente"
346
+
347
+ #: core/core_pdf_embedder.php:41
348
+ msgid "Next page"
349
+ msgstr "Page suivante"
350
+
351
+ #: core/core_pdf_embedder.php:42
352
+ msgid "Zoom In"
353
+ msgstr "Zoom +"
354
+
355
+ #: core/core_pdf_embedder.php:43
356
+ msgid "Zoom Out"
357
+ msgstr "Zoom -"
358
+
359
+ #: core/core_pdf_embedder.php:44 core/core_pdf_embedder.php:211
360
+ msgid "Secure"
361
+ msgstr "Sécurité"
362
+
363
+ #: core/core_pdf_embedder.php:45
364
+ msgid "Download PDF"
365
+ msgstr "Télécharger le PDF"
366
+
367
+ #: core/core_pdf_embedder.php:46
368
+ msgid "Full Screen"
369
+ msgstr "Plein écran"
370
+
371
+ #: core/core_pdf_embedder.php:47
372
+ msgid ""
373
+ "Error: URL to the PDF file must be on exactly the same domain as the current "
374
+ "web page."
375
+ msgstr ""
376
+ "Erreur: l'URL du fichier PDF doit être exactement dans le même domaine que "
377
+ "la page Web actuelle."
378
+
379
+ #: core/core_pdf_embedder.php:48
380
+ msgid "Click here for more info"
381
+ msgstr "Cliquez ici pour en savoir plus"
382
+
383
+ #: core/core_pdf_embedder.php:49
384
+ msgid "PDF page width or height are invalid"
385
+ msgstr "Largeur ou hauteur de la page PDF ne sont pas valides"
386
+
387
+ #: core/core_pdf_embedder.php:50
388
+ msgid "View in Full Screen"
389
+ msgstr "Voir en plein écran"
390
+
391
+ #: core/core_pdf_embedder.php:68
392
+ msgid "PDFs"
393
+ msgstr "PDF"
394
+
395
+ #: core/core_pdf_embedder.php:68
396
+ msgid "Manage PDFs"
397
+ msgstr "Gérer les fichiers PDF"
398
+
399
+ #: core/core_pdf_embedder.php:68
400
+ msgid "PDF <span class=\"count\">(%s)</span>"
401
+ msgid_plural "PDFs <span class=\"count\">(%s)</span>"
402
+ msgstr[0] "PDF <span class=\"count\">(%s)</span>"
403
+ msgstr[1] "PDFs <span class=\"count\">(%s)</span>"
404
+
405
+ #: core/core_pdf_embedder.php:172 core/core_pdf_embedder.php:177
406
+ msgid "PDF Embedder settings"
407
+ msgstr "Paramètres PDF Embedder"
408
+
409
+ #: core/core_pdf_embedder.php:172 core/core_pdf_embedder.php:177
410
+ msgid "PDF Embedder"
411
+ msgstr "PDF Embedder"
412
+
413
+ #: core/core_pdf_embedder.php:197
414
+ msgid "PDF Embedder setup"
415
+ msgstr "Configuration PDF Embedder"
416
+
417
+ #: core/core_pdf_embedder.php:199
418
+ msgid ""
419
+ "To use the plugin, just embed PDFs in the same way as you would normally "
420
+ "embed images in your posts/pages - but try with a PDF file instead."
421
+ msgstr ""
422
+ "Pour utiliser le plug-in, incorporer des fichiers PDF de la même manière que "
423
+ "vous le feriez pour incorporer des images dans vos articles / pages - mais "
424
+ "essayez avec un fichier PDF à la place."
425
+
426
+ #: core/core_pdf_embedder.php:200
427
+ msgid ""
428
+ "From the post editor, click Add Media, and then drag-and-drop your PDF file "
429
+ "into the media library.\n"
430
+ " When you insert the PDF into your post, it will "
431
+ "automatically embed using the plugin's viewer."
432
+ msgstr ""
433
+ "A partir de l'éditeur de messages, cliquez sur Ajouter des médias, puis "
434
+ "faites glisser-déposer votre fichier PDF dans la bibliothèque multimédia.\n"
435
+ " Lorsque vous insérez le PDF dans votre message, il sera "
436
+ "automatiquement intégré à l'aide du visualiseur de plugin."
437
+
438
+ #: core/core_pdf_embedder.php:209
439
+ msgid "Main Settings"
440
+ msgstr "Paramètres Généraux"
441
+
442
+ #: core/core_pdf_embedder.php:210
443
+ msgid "Mobile"
444
+ msgstr "Mobile"
445
+
446
+ #: core/core_pdf_embedder.php:238
447
+ msgid "Save Changes"
448
+ msgstr "Sauvegarder les modifications"
449
+
450
+ #: core/core_pdf_embedder.php:266
451
+ msgid "Default Viewer Settings"
452
+ msgstr "Paramètres par défaut du Viewer"
453
+
454
+ #: core/core_pdf_embedder.php:268
455
+ msgid "Width"
456
+ msgstr "Largeur"
457
+
458
+ #: core/core_pdf_embedder.php:272
459
+ msgid "Height"
460
+ msgstr "Hauteur"
461
+
462
+ #: core/core_pdf_embedder.php:276
463
+ msgid "Enter <b>max</b> or an integer number of pixels"
464
+ msgstr "Entrez <b> max </ b> ou un nombre entier de pixels"
465
+
466
+ #: core/core_pdf_embedder.php:280
467
+ msgid "Toolbar Location"
468
+ msgstr "Position de la barre d'outils"
469
+
470
+ #: core/core_pdf_embedder.php:282
471
+ msgid "Top"
472
+ msgstr "Haut"
473
+
474
+ #: core/core_pdf_embedder.php:283
475
+ msgid "Bottom"
476
+ msgstr "Bas"
477
+
478
+ #: core/core_pdf_embedder.php:284
479
+ msgid "Both"
480
+ msgstr "Haut et bas"
481
+
482
+ #: core/core_pdf_embedder.php:289
483
+ msgid "Toolbar Hover"
484
+ msgstr "Barre d'outils flottante"
485
+
486
+ #: core/core_pdf_embedder.php:292
487
+ msgid "Toolbar appears only on hover over document"
488
+ msgstr ""
489
+ "La barre d'outils apparaît uniquement sur le vol stationnaire sur le document"
490
+
491
+ #: core/core_pdf_embedder.php:297
492
+ msgid "Toolbar always visible"
493
+ msgstr "Barre d'outils toujours visible"
494
+
495
+ #: core/core_pdf_embedder.php:309
496
+ msgid ""
497
+ "You can override these defaults for specific embeds by modifying the "
498
+ "shortcodes - see <a href=\"%s\" target=\"_blank\">instructions</a>."
499
+ msgstr ""
500
+ "Vous pouvez remplacer ces valeurs par défaut pour des intégrations "
501
+ "spécifiques en modifiant les shortcodes - voir les <a href=\"%s\" target="
502
+ "\"_blank\">instructions</a>"
503
+
504
+ #: core/core_pdf_embedder.php:329
505
+ msgid "Protect your PDFs using PDF Embedder Secure"
506
+ msgstr "Protégez vos fichiers PDF à l'aide de PDF Embedder sécurisé"
507
+
508
+ #: core/core_pdf_embedder.php:330
509
+ msgid ""
510
+ "Our <b>PDF Embedder Premium Secure</b> plugin provides the same simple but "
511
+ "elegant viewer for your website visitors, with the added protection that\n"
512
+ " it is difficult for users to download or print the original PDF "
513
+ "document."
514
+ msgstr ""
515
+ "Notre plugin<b>PDF Embedder Premium Sécurisé </b> fournit une interface "
516
+ "simple mais pratique pour les visiteurs de votre site Web, avec la "
517
+ "protection supplémentaire,\n"
518
+ " il est difficile pour les utilisateurs de télécharger ou "
519
+ "d'imprimer le document PDF d'origine."
520
+
521
+ #: core/core_pdf_embedder.php:333
522
+ msgid ""
523
+ "This means that your PDF is unlikely to be shared outside your site where "
524
+ "you have no control over who views, prints, or shares it."
525
+ msgstr ""
526
+ "Cela signifie que votre PDF est peu susceptible d'être partagé en dehors de "
527
+ "votre site où vous n'avez aucun contrôle sur qui vois, imprime, ou partage."
528
+
529
+ #: core/core_pdf_embedder.php:381
530
+ msgid "Width must be \"max\" or an integer (number of pixels)"
531
+ msgstr "Largeur doit être \"max\" ou un nombre entier (nombre de pixels)"
532
+
533
+ #: core/core_pdf_embedder.php:382
534
+ msgid "Height must be \"max\" or an integer (number of pixels)"
535
+ msgstr "Hauteur doit être \"max\" ou un nombre entier (nombre de pixels)"
536
+
537
+ #: core/core_pdf_embedder.php:388
538
+ msgid "Unspecified error"
539
+ msgstr "Erreur non spécifiée"
540
+
541
+ #: core/core_pdf_embedder.php:429
542
+ msgid "Settings saved"
543
+ msgstr "Paramètres sauvegardés"
544
+
545
+ #: core/core_pdf_embedder.php:525
546
+ msgid "Settings"
547
+ msgstr "Paramètres"
548
+
549
+ #: premium_secure_pdf_embedder.php:164 premium_secure_pdf_embedder.php:166
550
+ msgid "Secure PDFs"
551
+ msgstr "PDF sécurisés"
552
+
553
+ #: premium_secure_pdf_embedder.php:169
554
+ msgid "Send PDF media uploads to 'securepdfs' folder"
555
+ msgstr "Envoyer les PDF dans un dossier média 'securepdfs'"
556
+
557
+ #: premium_secure_pdf_embedder.php:175
558
+ msgid "Disable Right Click"
559
+ msgstr "Désactiver le Clic droit"
560
+
561
+ #: premium_secure_pdf_embedder.php:178
562
+ msgid "Disable right-click mouse menu"
563
+ msgstr "Désactiver le menu de la souris clic-droit"
564
+
565
+ #: premium_secure_pdf_embedder.php:185
566
+ msgid ""
567
+ "If 'Secure PDFs' is checked above, your PDF uploads will be 'secure' by "
568
+ "default.\n"
569
+ " That is, they should be uploaded to a 'securepdfs' sub-folder of "
570
+ "your uploads area. These files should not be accessible directly,\n"
571
+ " and the plugin provides a backdoor method for the embedded "
572
+ "viewer to obtain the file contents."
573
+ msgstr ""
574
+ "Si 'PDF sécurisés' est cochée ci-dessus, vos téléchargements de fichiers PDF "
575
+ "seront 'sécurisés' par défaut.\n"
576
+ " Autrement dit, ils doivent être téléchargés dans un sous-dossier "
577
+ "'securepdfs' de votre espace de téléchargement. Ces fichiers ne doivent pas "
578
+ "être accessibles directement,\n"
579
+ " et le plugin fournit une méthode de porte dérobée pour que le "
580
+ "Viewer affiche le contenu du fichier."
581
+
582
+ #: premium_secure_pdf_embedder.php:189
583
+ msgid ""
584
+ "This means that your PDF is unlikely to be shared outside your site where "
585
+ "you have no control over who views, prints, or shares it.\n"
586
+ " Please note that it is still always possible for a determined "
587
+ "user to obtain the original file. Sensitive information should never be "
588
+ "presented to viewers in any form."
589
+ msgstr ""
590
+ "Cela signifie que votre PDF est peu susceptible d'être partagé en dehors de "
591
+ "votre site où vous n'avez aucun contrôle sur qui vois, imprime, ou partage "
592
+ "les fichiers.\n"
593
+ " A noter qu'il est toujours possible pour un utilisateur "
594
+ "déterminé d'obtenir le fichier d'origine. Les informations sensibles ne "
595
+ "devraient jamais être présenté aux visiteurs sous quelque forme que ce soit."
596
+
597
+ #: premium_secure_pdf_embedder.php:192
598
+ msgid ""
599
+ "See <a href=\"http://wp-pdf.com/premium-instructions/?utm_source=PDF"
600
+ "%20Settings%20Secure&utm_medium=premium&utm_campaign=Premium\" target="
601
+ "\"_blank\">Instructions</a> for more details."
602
+ msgstr ""
603
+ "Voir les <a href=\"http://wp-pdf.com/premium-instructions/?utm_source=PDF"
604
+ "%20Settings%20Secure&utm_medium=premium&utm_campaign=Premium\" target="
605
+ "\"_blank\">Instructions</a> pour plus de détails."
606
+
607
+ # wordpress plugin description
608
+ msgid ""
609
+ "Embed PDFs straight into your posts and pages, with flexible width and "
610
+ "height. No third-party services required."
611
+ msgstr ""
612
+ "Intégration directe des PDF dans vos messages et pages, avec une largeur "
613
+ "flexible et hauteur. Aucun service tiers requis."
614
+
615
+ # readme description
616
+ msgid ""
617
+ "Embed PDFs straight into your posts and pages, with intelligent resizing of "
618
+ "width and height. No third-party services or iframes required."
619
+ msgstr ""
620
+ "Intégration direct des PDF dans vos messages et pages, avec "
621
+ "redimensionnement intelligent de la largeur et la hauteur. Pas de services "
622
+ "tiers ou iframes nécessaires."
623
+
624
+ # wordpress plugin description
625
+ msgid "PDF Embedder Premium"
626
+ msgstr "PDF Embedder Premium"
627
+
628
+ # wordpress plugin description
629
+ msgid "PDF Embedder Premium Secure"
630
+ msgstr "PDF Embedder Premium Sécurisé"
pdf_embedder.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: PDF Embedder
5
  * Plugin URI: http://wp-pdf.com/
6
  * Description: Embed PDFs straight into your posts and pages, with flexible width and height. No third-party services required.
7
- * Version: 2.5
8
  * Author: Dan Lester
9
  * Author URI: http://wp-pdf.com/
10
  * License: GPL3
@@ -15,7 +15,7 @@ require_once( plugin_dir_path(__FILE__).'/core/core_pdf_embedder.php' );
15
 
16
  class pdfemb_basic_pdf_embedder extends core_pdf_embedder {
17
 
18
- protected $PLUGIN_VERSION = '2.5';
19
 
20
  protected function useminified() {
21
  /* using-minified */ return true;
4
  * Plugin Name: PDF Embedder
5
  * Plugin URI: http://wp-pdf.com/
6
  * Description: Embed PDFs straight into your posts and pages, with flexible width and height. No third-party services required.
7
+ * Version: 2.5.4
8
  * Author: Dan Lester
9
  * Author URI: http://wp-pdf.com/
10
  * License: GPL3
15
 
16
  class pdfemb_basic_pdf_embedder extends core_pdf_embedder {
17
 
18
+ protected $PLUGIN_VERSION = '2.5.4';
19
 
20
  protected function useminified() {
21
  /* using-minified */ return true;
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: danlester
3
  Tags: doc, docx, pdf, office, powerpoint, google, document, embed, intranet
4
  Requires at least: 3.5
5
- Tested up to: 4.4
6
- Stable tag: 2.5
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
@@ -11,6 +11,9 @@ Embed PDFs straight into your posts and pages, with intelligent resizing of widt
11
 
12
  == Description ==
13
 
 
 
 
14
  Upload PDFs and embed them straight into your site - just like adding images! PDFs will be automatically sized to their natural size and shape (or just fill the width available if they are too big). Optionally, you can specify a width and the correct height will be calculated automatically. The shape will be recalculated whenever the page is resized by the user.
15
 
16
  The plugin has a unique method for embedding PDFs, using Javascript only, and _not_ using iframes or third-party services. This gives a lot of flexibility over the appearance of your document.
@@ -26,6 +29,8 @@ Hyperlinks in your PDF will only be clickable in the Premium versions.
26
 
27
  **Now translation-ready!** Please contribute your translations.
28
 
 
 
29
  = Usage =
30
 
31
  Once installed and Activated, click Add Media from any page or post, just like adding an image, but drag and drop a PDF file instead.
@@ -162,6 +167,11 @@ the Plugins section of your Wordpress admin
162
 
163
  == Changelog ==
164
 
 
 
 
 
 
165
  = 2.5 =
166
 
167
  Uses latest version of pdf.js library for rendering PDFs.
2
  Contributors: danlester
3
  Tags: doc, docx, pdf, office, powerpoint, google, document, embed, intranet
4
  Requires at least: 3.5
5
+ Tested up to: 4.5
6
+ Stable tag: 2.5.4
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
11
 
12
  == Description ==
13
 
14
+ > Problems after upgrading to WordPress 4.5? Almost certainly, your other Themes and Plugins need updating. Please install all updates and then get in touch with us
15
+ > or your Theme author if PDF Embedder still isn't working.
16
+
17
  Upload PDFs and embed them straight into your site - just like adding images! PDFs will be automatically sized to their natural size and shape (or just fill the width available if they are too big). Optionally, you can specify a width and the correct height will be calculated automatically. The shape will be recalculated whenever the page is resized by the user.
18
 
19
  The plugin has a unique method for embedding PDFs, using Javascript only, and _not_ using iframes or third-party services. This gives a lot of flexibility over the appearance of your document.
29
 
30
  **Now translation-ready!** Please contribute your translations.
31
 
32
+ French translation contributed by Thierry Gaillou of [JDFitForme](http://www.jdfitforme.fr/) - Thank you!
33
+
34
  = Usage =
35
 
36
  Once installed and Activated, click Add Media from any page or post, just like adding an image, but drag and drop a PDF file instead.
167
 
168
  == Changelog ==
169
 
170
+ = 2.5.4 =
171
+
172
+ Added French translation thanks to Thierry Gaillou of JDFitForme.
173
+ Uses newer version of pdf.js library for rendering PDFs.
174
+
175
  = 2.5 =
176
 
177
  Uses latest version of pdf.js library for rendering PDFs.