| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 | /* Copyright 2016 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. */import {  AnnotationMode,  PixelsPerInch,  RenderingCancelledException,  shadow,} from "pdfjs-lib";import { getXfaHtmlForPrinting } from "./print_utils.js";import { PDFPrintServiceFactory } from "./app.js";// Creates a placeholder with div and canvas with right size for the page.function composePage(  pdfDocument,  pageNumber,  size,  printContainer,  printResolution,  optionalContentConfigPromise,  printAnnotationStoragePromise) {  const canvas = document.createElement("canvas");  // The size of the canvas in pixels for printing.  const PRINT_UNITS = printResolution / PixelsPerInch.PDF;  canvas.width = Math.floor(size.width * PRINT_UNITS);  canvas.height = Math.floor(size.height * PRINT_UNITS);  const canvasWrapper = document.createElement("div");  canvasWrapper.className = "printedPage";  canvasWrapper.append(canvas);  printContainer.append(canvasWrapper);  // A callback for a given page may be executed multiple times for different  // print operations (think of changing the print settings in the browser).  //  // Since we don't support queueing multiple render tasks for the same page  // (and it'd be racy anyways if painting the page is not done in one go) we  // keep track of the last scheduled task in order to properly cancel it before  // starting the next one.  let currentRenderTask = null;  canvas.mozPrintCallback = function (obj) {    // Printing/rendering the page.    const ctx = obj.context;    ctx.save();    ctx.fillStyle = "rgb(255, 255, 255)";    ctx.fillRect(0, 0, canvas.width, canvas.height);    ctx.restore();    let thisRenderTask = null;    Promise.all([      pdfDocument.getPage(pageNumber),      printAnnotationStoragePromise,    ])      .then(function ([pdfPage, printAnnotationStorage]) {        if (currentRenderTask) {          currentRenderTask.cancel();          currentRenderTask = null;        }        const renderContext = {          canvasContext: ctx,          transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],          viewport: pdfPage.getViewport({ scale: 1, rotation: size.rotation }),          intent: "print",          annotationMode: AnnotationMode.ENABLE_STORAGE,          optionalContentConfigPromise,          printAnnotationStorage,        };        currentRenderTask = thisRenderTask = pdfPage.render(renderContext);        return thisRenderTask.promise;      })      .then(        function () {          // Tell the printEngine that rendering this canvas/page has finished.          if (currentRenderTask === thisRenderTask) {            currentRenderTask = null;          }          obj.done();        },        function (reason) {          if (!(reason instanceof RenderingCancelledException)) {            console.error(reason);          }          if (currentRenderTask === thisRenderTask) {            currentRenderTask.cancel();            currentRenderTask = null;          }          // Tell the printEngine that rendering this canvas/page has failed.          // This will make the print process stop.          if ("abort" in obj) {            obj.abort();          } else {            obj.done();          }        }      );  };}function FirefoxPrintService(  pdfDocument,  pagesOverview,  printContainer,  printResolution,  optionalContentConfigPromise = null,  printAnnotationStoragePromise = null) {  this.pdfDocument = pdfDocument;  this.pagesOverview = pagesOverview;  this.printContainer = printContainer;  this._printResolution = printResolution || 150;  this._optionalContentConfigPromise =    optionalContentConfigPromise || pdfDocument.getOptionalContentConfig();  this._printAnnotationStoragePromise =    printAnnotationStoragePromise || Promise.resolve();}FirefoxPrintService.prototype = {  layout() {    const {      pdfDocument,      pagesOverview,      printContainer,      _printResolution,      _optionalContentConfigPromise,      _printAnnotationStoragePromise,    } = this;    const body = document.querySelector("body");    body.setAttribute("data-pdfjsprinting", true);    if (pdfDocument.isPureXfa) {      getXfaHtmlForPrinting(printContainer, pdfDocument);      return;    }    for (let i = 0, ii = pagesOverview.length; i < ii; ++i) {      composePage(        pdfDocument,        /* pageNumber = */ i + 1,        pagesOverview[i],        printContainer,        _printResolution,        _optionalContentConfigPromise,        _printAnnotationStoragePromise      );    }  },  destroy() {    this.printContainer.textContent = "";    const body = document.querySelector("body");    body.removeAttribute("data-pdfjsprinting");  },};PDFPrintServiceFactory.instance = {  get supportsPrinting() {    const canvas = document.createElement("canvas");    const value = "mozPrintCallback" in canvas;    return shadow(this, "supportsPrinting", value);  },  createPrintService(    pdfDocument,    pagesOverview,    printContainer,    printResolution,    optionalContentConfigPromise,    printAnnotationStoragePromise  ) {    return new FirefoxPrintService(      pdfDocument,      pagesOverview,      printContainer,      printResolution,      optionalContentConfigPromise,      printAnnotationStoragePromise    );  },};export { FirefoxPrintService };
 |