pdf_manager.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /* Copyright 2017 Mozilla Foundation
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. 'use strict';
  16. var sharedUtil = require('../shared/util.js');
  17. var coreStream = require('./stream.js');
  18. var coreChunkedStream = require('./chunked_stream.js');
  19. var coreDocument = require('./document.js');
  20. var warn = sharedUtil.warn;
  21. var createValidAbsoluteUrl = sharedUtil.createValidAbsoluteUrl;
  22. var shadow = sharedUtil.shadow;
  23. var NotImplementedException = sharedUtil.NotImplementedException;
  24. var MissingDataException = sharedUtil.MissingDataException;
  25. var createPromiseCapability = sharedUtil.createPromiseCapability;
  26. var Util = sharedUtil.Util;
  27. var Stream = coreStream.Stream;
  28. var ChunkedStreamManager = coreChunkedStream.ChunkedStreamManager;
  29. var PDFDocument = coreDocument.PDFDocument;
  30. var BasePdfManager = function BasePdfManagerClosure() {
  31. function BasePdfManager() {
  32. throw new Error('Cannot initialize BaseManagerManager');
  33. }
  34. BasePdfManager.prototype = {
  35. get docId() {
  36. return this._docId;
  37. },
  38. get password() {
  39. return this._password;
  40. },
  41. get docBaseUrl() {
  42. var docBaseUrl = null;
  43. if (this._docBaseUrl) {
  44. var absoluteUrl = createValidAbsoluteUrl(this._docBaseUrl);
  45. if (absoluteUrl) {
  46. docBaseUrl = absoluteUrl.href;
  47. } else {
  48. warn('Invalid absolute docBaseUrl: "' + this._docBaseUrl + '".');
  49. }
  50. }
  51. return shadow(this, 'docBaseUrl', docBaseUrl);
  52. },
  53. onLoadedStream: function BasePdfManager_onLoadedStream() {
  54. throw new NotImplementedException();
  55. },
  56. ensureDoc: function BasePdfManager_ensureDoc(prop, args) {
  57. return this.ensure(this.pdfDocument, prop, args);
  58. },
  59. ensureXRef: function BasePdfManager_ensureXRef(prop, args) {
  60. return this.ensure(this.pdfDocument.xref, prop, args);
  61. },
  62. ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) {
  63. return this.ensure(this.pdfDocument.catalog, prop, args);
  64. },
  65. getPage: function BasePdfManager_getPage(pageIndex) {
  66. return this.pdfDocument.getPage(pageIndex);
  67. },
  68. cleanup: function BasePdfManager_cleanup() {
  69. return this.pdfDocument.cleanup();
  70. },
  71. ensure: function BasePdfManager_ensure(obj, prop, args) {
  72. return new NotImplementedException();
  73. },
  74. requestRange: function BasePdfManager_requestRange(begin, end) {
  75. return new NotImplementedException();
  76. },
  77. requestLoadedStream: function BasePdfManager_requestLoadedStream() {
  78. return new NotImplementedException();
  79. },
  80. sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) {
  81. return new NotImplementedException();
  82. },
  83. updatePassword: function BasePdfManager_updatePassword(password) {
  84. this._password = password;
  85. },
  86. terminate: function BasePdfManager_terminate() {
  87. return new NotImplementedException();
  88. }
  89. };
  90. return BasePdfManager;
  91. }();
  92. var LocalPdfManager = function LocalPdfManagerClosure() {
  93. function LocalPdfManager(docId, data, password, evaluatorOptions, docBaseUrl) {
  94. this._docId = docId;
  95. this._password = password;
  96. this._docBaseUrl = docBaseUrl;
  97. this.evaluatorOptions = evaluatorOptions;
  98. var stream = new Stream(data);
  99. this.pdfDocument = new PDFDocument(this, stream);
  100. this._loadedStreamCapability = createPromiseCapability();
  101. this._loadedStreamCapability.resolve(stream);
  102. }
  103. Util.inherit(LocalPdfManager, BasePdfManager, {
  104. ensure: function LocalPdfManager_ensure(obj, prop, args) {
  105. return new Promise(function (resolve, reject) {
  106. try {
  107. var value = obj[prop];
  108. var result;
  109. if (typeof value === 'function') {
  110. result = value.apply(obj, args);
  111. } else {
  112. result = value;
  113. }
  114. resolve(result);
  115. } catch (e) {
  116. reject(e);
  117. }
  118. });
  119. },
  120. requestRange: function LocalPdfManager_requestRange(begin, end) {
  121. return Promise.resolve();
  122. },
  123. requestLoadedStream: function LocalPdfManager_requestLoadedStream() {},
  124. onLoadedStream: function LocalPdfManager_onLoadedStream() {
  125. return this._loadedStreamCapability.promise;
  126. },
  127. terminate: function LocalPdfManager_terminate() {}
  128. });
  129. return LocalPdfManager;
  130. }();
  131. var NetworkPdfManager = function NetworkPdfManagerClosure() {
  132. function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions, docBaseUrl) {
  133. this._docId = docId;
  134. this._password = args.password;
  135. this._docBaseUrl = docBaseUrl;
  136. this.msgHandler = args.msgHandler;
  137. this.evaluatorOptions = evaluatorOptions;
  138. var params = {
  139. msgHandler: args.msgHandler,
  140. url: args.url,
  141. length: args.length,
  142. disableAutoFetch: args.disableAutoFetch,
  143. rangeChunkSize: args.rangeChunkSize
  144. };
  145. this.streamManager = new ChunkedStreamManager(pdfNetworkStream, params);
  146. this.pdfDocument = new PDFDocument(this, this.streamManager.getStream());
  147. }
  148. Util.inherit(NetworkPdfManager, BasePdfManager, {
  149. ensure: function NetworkPdfManager_ensure(obj, prop, args) {
  150. var pdfManager = this;
  151. return new Promise(function (resolve, reject) {
  152. function ensureHelper() {
  153. try {
  154. var result;
  155. var value = obj[prop];
  156. if (typeof value === 'function') {
  157. result = value.apply(obj, args);
  158. } else {
  159. result = value;
  160. }
  161. resolve(result);
  162. } catch (e) {
  163. if (!(e instanceof MissingDataException)) {
  164. reject(e);
  165. return;
  166. }
  167. pdfManager.streamManager.requestRange(e.begin, e.end).then(ensureHelper, reject);
  168. }
  169. }
  170. ensureHelper();
  171. });
  172. },
  173. requestRange: function NetworkPdfManager_requestRange(begin, end) {
  174. return this.streamManager.requestRange(begin, end);
  175. },
  176. requestLoadedStream: function NetworkPdfManager_requestLoadedStream() {
  177. this.streamManager.requestAllChunks();
  178. },
  179. sendProgressiveData: function NetworkPdfManager_sendProgressiveData(chunk) {
  180. this.streamManager.onReceiveData({ chunk: chunk });
  181. },
  182. onLoadedStream: function NetworkPdfManager_onLoadedStream() {
  183. return this.streamManager.onLoadedStream();
  184. },
  185. terminate: function NetworkPdfManager_terminate() {
  186. this.streamManager.abort();
  187. }
  188. });
  189. return NetworkPdfManager;
  190. }();
  191. exports.LocalPdfManager = LocalPdfManager;
  192. exports.NetworkPdfManager = NetworkPdfManager;