Change the _pagePromises
cache, in the worker, from an Array to a Map
Given that not all pages necessarily are being accessed, or that the pages may be accessed out of order, using a `Map` seems like a more appropriate data-structure here. Furthermore, this patch also adds (currently missing) caching for XFA-documents. Loading a couple of such documents in the viewer, with logging added, shows that we're currently re-creating `Page`-instances unnecessarily for XFA-documents.
This commit is contained in:
parent
2e2d049a9c
commit
080996ac68
@ -655,7 +655,7 @@ class PDFDocument {
|
|||||||
this.pdfManager = pdfManager;
|
this.pdfManager = pdfManager;
|
||||||
this.stream = stream;
|
this.stream = stream;
|
||||||
this.xref = new XRef(stream, pdfManager);
|
this.xref = new XRef(stream, pdfManager);
|
||||||
this._pagePromises = [];
|
this._pagePromises = new Map();
|
||||||
this._version = null;
|
this._version = null;
|
||||||
|
|
||||||
const idCounters = {
|
const idCounters = {
|
||||||
@ -1299,36 +1299,21 @@ class PDFDocument {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getPage(pageIndex) {
|
getPage(pageIndex) {
|
||||||
if (this._pagePromises[pageIndex] !== undefined) {
|
const cachedPromise = this._pagePromises.get(pageIndex);
|
||||||
return this._pagePromises[pageIndex];
|
if (cachedPromise) {
|
||||||
|
return cachedPromise;
|
||||||
}
|
}
|
||||||
const { catalog, linearization } = this;
|
const { catalog, linearization, xfaFactory } = this;
|
||||||
|
|
||||||
if (this.xfaFactory) {
|
let promise;
|
||||||
return Promise.resolve(
|
if (xfaFactory) {
|
||||||
new Page({
|
promise = Promise.resolve([Dict.empty, null]);
|
||||||
pdfManager: this.pdfManager,
|
} else if (linearization && linearization.pageFirst === pageIndex) {
|
||||||
xref: this.xref,
|
promise = this._getLinearizationPage(pageIndex);
|
||||||
pageIndex,
|
} else {
|
||||||
pageDict: Dict.empty,
|
promise = catalog.getPageDict(pageIndex);
|
||||||
ref: null,
|
|
||||||
globalIdFactory: this._globalIdFactory,
|
|
||||||
fontCache: catalog.fontCache,
|
|
||||||
builtInCMapCache: catalog.builtInCMapCache,
|
|
||||||
standardFontDataCache: catalog.standardFontDataCache,
|
|
||||||
globalImageCache: catalog.globalImageCache,
|
|
||||||
nonBlendModesSet: catalog.nonBlendModesSet,
|
|
||||||
xfaFactory: this.xfaFactory,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
promise = promise.then(([pageDict, ref]) => {
|
||||||
const promise =
|
|
||||||
linearization && linearization.pageFirst === pageIndex
|
|
||||||
? this._getLinearizationPage(pageIndex)
|
|
||||||
: catalog.getPageDict(pageIndex);
|
|
||||||
|
|
||||||
return (this._pagePromises[pageIndex] = promise.then(([pageDict, ref]) => {
|
|
||||||
return new Page({
|
return new Page({
|
||||||
pdfManager: this.pdfManager,
|
pdfManager: this.pdfManager,
|
||||||
xref: this.xref,
|
xref: this.xref,
|
||||||
@ -1341,9 +1326,12 @@ class PDFDocument {
|
|||||||
standardFontDataCache: catalog.standardFontDataCache,
|
standardFontDataCache: catalog.standardFontDataCache,
|
||||||
globalImageCache: catalog.globalImageCache,
|
globalImageCache: catalog.globalImageCache,
|
||||||
nonBlendModesSet: catalog.nonBlendModesSet,
|
nonBlendModesSet: catalog.nonBlendModesSet,
|
||||||
xfaFactory: null,
|
xfaFactory,
|
||||||
});
|
});
|
||||||
}));
|
});
|
||||||
|
|
||||||
|
this._pagePromises.set(pageIndex, promise);
|
||||||
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
checkFirstPage() {
|
checkFirstPage() {
|
||||||
@ -1352,7 +1340,7 @@ class PDFDocument {
|
|||||||
// Clear out the various caches to ensure that we haven't stored any
|
// Clear out the various caches to ensure that we haven't stored any
|
||||||
// inconsistent and/or incorrect state, since that could easily break
|
// inconsistent and/or incorrect state, since that could easily break
|
||||||
// subsequent `this.getPage` calls.
|
// subsequent `this.getPage` calls.
|
||||||
this._pagePromises.length = 0;
|
this._pagePromises.clear();
|
||||||
await this.cleanup();
|
await this.cleanup();
|
||||||
|
|
||||||
throw new XRefParseException();
|
throw new XRefParseException();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user