[api-minor] Introduce a PrintAnnotationStorage with *frozen* serializable data

Given that printing is triggered *synchronously* in browsers, it's thus possible for scripting (in PDF documents) to modify the Annotation-data while printing is currently ongoing.
To work-around that we add a new printing-specific `AnnotationStorage`, where the serializable data is *frozen* upon initialization, which the viewer can thus create/utilize during printing.
This commit is contained in:
Jonas Jenwald 2022-06-13 13:35:58 +02:00
parent c5dc082da4
commit 1cc7cecc7b
6 changed files with 196 additions and 41 deletions

View file

@ -29,7 +29,8 @@ function renderPage(
pageNumber,
size,
printResolution,
optionalContentConfigPromise
optionalContentConfigPromise,
printAnnotationStoragePromise
) {
const scratchCanvas = activeService.scratchCanvas;
@ -44,7 +45,10 @@ function renderPage(
ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);
ctx.restore();
return pdfDocument.getPage(pageNumber).then(function (pdfPage) {
return Promise.all([
pdfDocument.getPage(pageNumber),
printAnnotationStoragePromise,
]).then(function ([pdfPage, printAnnotationStorage]) {
const renderContext = {
canvasContext: ctx,
transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],
@ -52,6 +56,7 @@ function renderPage(
intent: "print",
annotationMode: AnnotationMode.ENABLE_STORAGE,
optionalContentConfigPromise,
printAnnotationStorage,
};
return pdfPage.render(renderContext).promise;
});
@ -63,6 +68,7 @@ function PDFPrintService(
printContainer,
printResolution,
optionalContentConfigPromise = null,
printAnnotationStoragePromise = null,
l10n
) {
this.pdfDocument = pdfDocument;
@ -71,6 +77,8 @@ function PDFPrintService(
this._printResolution = printResolution || 150;
this._optionalContentConfigPromise =
optionalContentConfigPromise || pdfDocument.getOptionalContentConfig();
this._printAnnotationStoragePromise =
printAnnotationStoragePromise || Promise.resolve();
this.l10n = l10n;
this.currentPage = -1;
// The temporary canvas where renderPage paints one page at a time.
@ -160,7 +168,8 @@ PDFPrintService.prototype = {
/* pageNumber = */ index + 1,
this.pagesOverview[index],
this._printResolution,
this._optionalContentConfigPromise
this._optionalContentConfigPromise,
this._printAnnotationStoragePromise
)
.then(this.useRenderedPage.bind(this))
.then(function () {
@ -359,6 +368,7 @@ PDFPrintServiceFactory.instance = {
printContainer,
printResolution,
optionalContentConfigPromise,
printAnnotationStoragePromise,
l10n
) {
if (activeService) {
@ -370,6 +380,7 @@ PDFPrintServiceFactory.instance = {
printContainer,
printResolution,
optionalContentConfigPromise,
printAnnotationStoragePromise,
l10n
);
return activeService;