123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /* Copyright 2013 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /** @typedef {import("./interfaces").IDownloadManager} IDownloadManager */
- import { createValidAbsoluteUrl, isPdfFile } from "pdfjs-lib";
- if (typeof PDFJSDev !== "undefined" && !PDFJSDev.test("CHROME || GENERIC")) {
- throw new Error(
- 'Module "pdfjs-web/download_manager" shall not be used ' +
- "outside CHROME and GENERIC builds."
- );
- }
- function download(blobUrl, filename) {
- const a = document.createElement("a");
- if (!a.click) {
- throw new Error('DownloadManager: "a.click()" is not supported.');
- }
- a.href = blobUrl;
- a.target = "_parent";
- // Use a.download if available. This increases the likelihood that
- // the file is downloaded instead of opened by another PDF plugin.
- if ("download" in a) {
- a.download = filename;
- }
- // <a> must be in the document for recent Firefox versions,
- // otherwise .click() is ignored.
- (document.body || document.documentElement).append(a);
- a.click();
- a.remove();
- }
- /**
- * @implements {IDownloadManager}
- */
- class DownloadManager {
- #openBlobUrls = new WeakMap();
- downloadUrl(url, filename) {
- if (!createValidAbsoluteUrl(url, "http://example.com")) {
- console.error(`downloadUrl - not a valid URL: ${url}`);
- return; // restricted/invalid URL
- }
- download(url + "#pdfjs.action=download", filename);
- }
- downloadData(data, filename, contentType) {
- const blobUrl = URL.createObjectURL(
- new Blob([data], { type: contentType })
- );
- download(blobUrl, filename);
- }
- /**
- * @returns {boolean} Indicating if the data was opened.
- */
- openOrDownloadData(element, data, filename) {
- const isPdfData = isPdfFile(filename);
- const contentType = isPdfData ? "application/pdf" : "";
- if (isPdfData) {
- let blobUrl = this.#openBlobUrls.get(element);
- if (!blobUrl) {
- blobUrl = URL.createObjectURL(new Blob([data], { type: contentType }));
- this.#openBlobUrls.set(element, blobUrl);
- }
- let viewerUrl;
- if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) {
- // The current URL is the viewer, let's use it and append the file.
- viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename);
- } else if (PDFJSDev.test("CHROME")) {
- // In the Chrome extension, the URL is rewritten using the history API
- // in viewer.js, so an absolute URL must be generated.
- viewerUrl =
- // eslint-disable-next-line no-undef
- chrome.runtime.getURL("/content/web/viewer.html") +
- "?file=" +
- encodeURIComponent(blobUrl + "#" + filename);
- }
- try {
- window.open(viewerUrl);
- return true;
- } catch (ex) {
- console.error(`openOrDownloadData: ${ex}`);
- // Release the `blobUrl`, since opening it failed, and fallback to
- // downloading the PDF file.
- URL.revokeObjectURL(blobUrl);
- this.#openBlobUrls.delete(element);
- }
- }
- this.downloadData(data, filename, contentType);
- return false;
- }
- download(blob, url, filename) {
- const blobUrl = URL.createObjectURL(blob);
- download(blobUrl, filename);
- }
- }
- export { DownloadManager };
|