Skip to content

Commit 7721899

Browse files
authored
fix: issue #373: handle bad encoding expcetion by start page rendering after page operator list is resolved, add i373_err_broken.pdf to verify (#378)
1 parent 6744445 commit 7721899

5 files changed

Lines changed: 33 additions & 40 deletions

File tree

base/core/core.js

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ var Page = (function PageClosure() {
138138
return promise;
139139
},
140140
getOperatorList: function Page_getOperatorList(handler) {
141-
var self = this;
142141
var promise = new Promise();
143142

144143
function reject(e) {
@@ -148,8 +147,7 @@ var Page = (function PageClosure() {
148147
var pageListPromise = new Promise();
149148

150149
var pdfManager = this.pdfManager;
151-
var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
152-
[]);
150+
var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', []);
153151
var resourcesPromise = this.loadResources([
154152
'ExtGState',
155153
'ColorSpace',
@@ -166,35 +164,31 @@ var Page = (function PageClosure() {
166164
this.pageIndex, 'p' + this.pageIndex + '_',
167165
this.idCounters, this.fontCache);
168166

169-
var dataPromises = Promise.all(
170-
[contentStreamPromise, resourcesPromise], reject);
171-
dataPromises.then(function(data) {
167+
Promise.all([contentStreamPromise, resourcesPromise]).then(function(data) {
172168
var contentStream = data[0];
173-
174-
175-
var opList = new OperatorList(handler, self.pageIndex);
176-
try {
177-
handler.send('StartRenderPage', {
178-
transparency: partialEvaluator.hasBlendModes(self.resources),
179-
pageIndex: self.pageIndex
180-
});
181-
partialEvaluator.getOperatorList(contentStream, self.resources, opList);
182-
pageListPromise.resolve(opList);
183-
}
184-
catch(e) {
185-
pageListPromise.reject(e);
186-
}
187-
});
169+
try {
170+
var opList = new OperatorList(handler, this.pageIndex);
171+
partialEvaluator.getOperatorList(contentStream, this.resources, opList);
172+
pageListPromise.resolve(opList);
173+
174+
handler.send('StartRenderPage', {
175+
transparency: partialEvaluator.hasBlendModes(this.resources),
176+
pageIndex: this.pageIndex
177+
});
178+
} catch (ex) {
179+
reject(ex);
180+
}
181+
}.bind(this), reject);
188182

189183
var annotationsPromise = pdfManager.ensure(this, 'annotations');
190-
Promise.all([pageListPromise, annotationsPromise]).then(function(datas) {
191-
var pageOpList = datas[0];
192-
var annotations = datas[1];
184+
Promise.all([pageListPromise, annotationsPromise]).then(function(data) {
185+
var pageOpList = data[0];
186+
var annotations = data[1];
193187

194188
if (annotations.length === 0) {
195189
pageOpList.flush(true);
196190
promise.resolve(pageOpList);
197-
return;
191+
return promise;
198192
}
199193

200194
var annotationsReadyPromise = Annotation.appendToOperatorList(

base/display/metadata.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,18 @@ var Metadata = (PDFJS.Metadata = (function MetadataClosure() {
4545
}
4646

4747
function Metadata(meta) {
48-
if (typeof meta === 'string') {
48+
this.metadata = {};
49+
if (typeof meta === 'string') {
4950
// Ghostscript produces invalid metadata
5051
meta = fixMetadata(meta);
51-
52-
var parser = new DOMParser();
53-
meta = parser.parseFromString(meta, 'application/xml');
54-
} else if (!(meta instanceof Document)) {
55-
error('Metadata: Invalid metadata object');
56-
}
57-
58-
this.metaDocument = meta;
59-
this.metadata = {};
60-
this.parse();
52+
meta = meta.trim();
53+
if (meta.startsWith('<') && meta.endsWith('>')) {
54+
var parser = new DOMParser();
55+
meta = parser.parseFromString(meta, 'application/xml');
56+
this.metaDocument = meta;
57+
this.parse();
58+
}
59+
}
6160
}
6261

6362
Metadata.prototype = {

base/shared/util.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,8 @@ function error(msg) {
197197
} else {
198198
//log('Error: ' + msg);
199199
}
200-
//log(backtrace());
201-
//PDFJS.LogManager.notify('error', msg);
200+
// log(backtrace());
201+
PDFJS.LogManager.notify('error', msg);
202202
throw new Error(msg);
203203
}
204204

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"test:jest": "jest --config ./jest.config.json",
3838
"test": "jest --config ./jest.config.json && npm run parse-r && npm run parse-fd",
3939
"test:forms": "cd ./test && sh p2j.forms.sh",
40-
"test:misc": "cd ./test && sh p2j.one.sh misc . \"Expected: 13 success, 4 fail exception with stack trace\" ",
40+
"test:misc": "cd ./test && sh p2j.one.sh misc . \"Expected: 13 success, 5 fail exception with stack trace\" ",
4141
"parse": "./bin/pdf2json.js -f ./test/pdf/fd/form/F1040.pdf -o ./test/target/fd/form",
4242
"parse-s": "./bin/pdf2json.js -f ./test/pdf/fd/form/F1040.pdf -o ./test/target/fd/form -s",
4343
"parse-t": "./bin/pdf2json.js -f ./test/pdf/fd/form/F1040.pdf -o ./test/target/fd/form -s -t",
@@ -48,7 +48,7 @@
4848
"parse-tb": "./bin/pdf2json.js -f ./test/pdf/misc/i242_testingWithTable.pdf -o ./test/target/misc",
4949
"parse-tc": "./bin/pdf2json.js -f ./test/pdf/misc/i293_pdfpac.pdf -o ./test/target/misc",
5050
"parse-rectFix": "./bin/pdf2json.js -f ./test/pdf/misc/pr298_rect_fix_from_upstream.pdf -o ./test/target/misc",
51-
"parse-e": "./bin/pdf2json.js -f ./test/pdf/misc/i43_encrypted.pdf -o ./test/target/misc",
51+
"parse-e": "./bin/pdf2json.js -f ./test/pdf/misc/i373_err_broken.pdf -o ./test/target/misc",
5252
"build:rollup": "rollup -c ./rollup.config.js",
5353
"build:bundle-pdfjs-base": "node rollup/bundle-pdfjs-base.js",
5454
"build": "npm run build:bundle-pdfjs-base && npm run build:rollup",

test/pdf/misc/i373_err_broken.pdf

67.1 KB
Binary file not shown.

0 commit comments

Comments
 (0)