mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-25 09:38:06 +02:00
Separate page objects/images from the fonts; does not store large images
This commit is contained in:
parent
d2c1868497
commit
69b72078c0
7 changed files with 97 additions and 73 deletions
61
src/api.js
61
src/api.js
|
@ -172,8 +172,10 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
|
|||
this.transport = transport;
|
||||
this.stats = new StatTimer();
|
||||
this.stats.enabled = !!globalScope.PDFJS.enableStats;
|
||||
this.objs = transport.objs;
|
||||
this.commonObjs = transport.commonObjs;
|
||||
this.objs = new PDFObjects();
|
||||
this.renderInProgress = false;
|
||||
this.cleanupAfterRender = false;
|
||||
}
|
||||
PDFPageProxy.prototype = {
|
||||
/**
|
||||
|
@ -263,9 +265,10 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
|
|||
var self = this;
|
||||
function complete(error) {
|
||||
self.renderInProgress = false;
|
||||
if (self.destroyed) {
|
||||
delete self.operatorList;
|
||||
if (self.destroyed || self.cleanupAfterRender) {
|
||||
delete self.displayReadyPromise;
|
||||
delete self.operatorList;
|
||||
self.objs.clear();
|
||||
}
|
||||
|
||||
if (error)
|
||||
|
@ -283,7 +286,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
|
|||
return;
|
||||
}
|
||||
|
||||
var gfx = new CanvasGraphics(params.canvasContext,
|
||||
var gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
|
||||
this.objs, params.textLayer);
|
||||
try {
|
||||
this.display(gfx, params.viewport, complete, continueCallback);
|
||||
|
@ -329,7 +332,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
|
|||
// Convert the font names to the corresponding font obj.
|
||||
var fontObjs = [];
|
||||
for (var i = 0, ii = fonts.length; i < ii; i++) {
|
||||
var obj = this.objs.objs[fonts[i]].data;
|
||||
var obj = this.commonObjs.getData(fonts[i]);
|
||||
if (obj.error) {
|
||||
warn('Error during font loading: ' + obj.error);
|
||||
continue;
|
||||
|
@ -423,6 +426,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
|
|||
if (!this.renderInProgress) {
|
||||
delete this.operatorList;
|
||||
delete this.displayReadyPromise;
|
||||
this.objs.clear();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -434,7 +438,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
|
|||
var WorkerTransport = (function WorkerTransportClosure() {
|
||||
function WorkerTransport(workerInitializedPromise, workerReadyPromise) {
|
||||
this.workerReadyPromise = workerReadyPromise;
|
||||
this.objs = new PDFObjects();
|
||||
this.commonObjs = new PDFObjects();
|
||||
|
||||
this.pageCache = [];
|
||||
this.pagePromises = [];
|
||||
|
@ -569,21 +573,13 @@ var WorkerTransport = (function WorkerTransportClosure() {
|
|||
page.startRenderingFromOperatorList(data.operatorList, depFonts);
|
||||
}, this);
|
||||
|
||||
messageHandler.on('obj', function transportObj(data) {
|
||||
messageHandler.on('commonobj', function transportObj(data) {
|
||||
var id = data[0];
|
||||
var type = data[1];
|
||||
if (this.objs.hasData(id))
|
||||
if (this.commonObjs.hasData(id))
|
||||
return;
|
||||
|
||||
switch (type) {
|
||||
case 'JpegStream':
|
||||
var imageData = data[2];
|
||||
loadJpegStream(id, imageData, this.objs);
|
||||
break;
|
||||
case 'Image':
|
||||
var imageData = data[2];
|
||||
this.objs.resolve(id, imageData);
|
||||
break;
|
||||
case 'Font':
|
||||
var exportedData = data[2];
|
||||
|
||||
|
@ -594,10 +590,39 @@ var WorkerTransport = (function WorkerTransportClosure() {
|
|||
font = new ErrorFont(exportedData.error);
|
||||
else
|
||||
font = new Font(exportedData);
|
||||
this.objs.resolve(id, font);
|
||||
this.commonObjs.resolve(id, font);
|
||||
break;
|
||||
default:
|
||||
error('Got unkown object type ' + type);
|
||||
error('Got unknown common object type ' + type);
|
||||
}
|
||||
}, this);
|
||||
|
||||
messageHandler.on('obj', function transportObj(data) {
|
||||
var id = data[0];
|
||||
var pageIndex = data[1];
|
||||
var type = data[2];
|
||||
var pageProxy = this.pageCache[pageIndex];
|
||||
if (pageProxy.objs.hasData(id))
|
||||
return;
|
||||
|
||||
switch (type) {
|
||||
case 'JpegStream':
|
||||
var imageData = data[3];
|
||||
loadJpegStream(id, imageData, pageProxy.objs);
|
||||
break;
|
||||
case 'Image':
|
||||
var imageData = data[3];
|
||||
pageProxy.objs.resolve(id, imageData);
|
||||
|
||||
// heuristics that will allow not to store large data
|
||||
var MAX_IMAGE_SIZE_TO_STORE = 8000000;
|
||||
if ('data' in imageData &&
|
||||
imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
|
||||
pageProxy.cleanupAfterRender = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
error('Got unknown object type ' + type);
|
||||
}
|
||||
}, this);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue