XFA - An image can be a stream in the pdf (bug 1718521) - hrefs can be found in catalog > Names > XFAImages
This commit is contained in:
parent
fcd4c8151c
commit
5cdee80c8e
@ -915,6 +915,22 @@ class Catalog {
|
|||||||
return shadow(this, "attachments", attachments);
|
return shadow(this, "attachments", attachments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get xfaImages() {
|
||||||
|
const obj = this._catDict.get("Names");
|
||||||
|
let xfaImages = null;
|
||||||
|
|
||||||
|
if (obj instanceof Dict && obj.has("XFAImages")) {
|
||||||
|
const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref);
|
||||||
|
for (const [key, value] of nameTree.getAll()) {
|
||||||
|
if (!xfaImages) {
|
||||||
|
xfaImages = new Dict(this.xref);
|
||||||
|
}
|
||||||
|
xfaImages.set(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return shadow(this, "xfaImages", xfaImages);
|
||||||
|
}
|
||||||
|
|
||||||
_collectJavaScript() {
|
_collectJavaScript() {
|
||||||
const obj = this._catDict.get("Names");
|
const obj = this._catDict.get("Names");
|
||||||
let javaScript = null;
|
let javaScript = null;
|
||||||
|
@ -869,6 +869,28 @@ class PDFDocument {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async loadXfaImages() {
|
||||||
|
const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages");
|
||||||
|
if (!xfaImagesDict) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const keys = xfaImagesDict.getKeys();
|
||||||
|
const objectLoader = new ObjectLoader(xfaImagesDict, keys, this.xref);
|
||||||
|
await objectLoader.load();
|
||||||
|
|
||||||
|
const xfaImages = new Map();
|
||||||
|
for (const key of keys) {
|
||||||
|
const stream = xfaImagesDict.get(key);
|
||||||
|
if (!isStream(stream)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
xfaImages.set(key, stream.getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
this.xfaFactory.setImages(xfaImages);
|
||||||
|
}
|
||||||
|
|
||||||
async loadXfaFonts(handler, task) {
|
async loadXfaFonts(handler, task) {
|
||||||
const acroForm = await this.pdfManager.ensureCatalog("acroForm");
|
const acroForm = await this.pdfManager.ensureCatalog("acroForm");
|
||||||
if (!acroForm) {
|
if (!acroForm) {
|
||||||
|
@ -77,6 +77,10 @@ class BasePdfManager {
|
|||||||
return this.pdfDocument.loadXfaFonts(handler, task);
|
return this.pdfDocument.loadXfaFonts(handler, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadXfaImages() {
|
||||||
|
return this.pdfDocument.loadXfaImages();
|
||||||
|
}
|
||||||
|
|
||||||
serializeXfaData(annotationStorage) {
|
serializeXfaData(annotationStorage) {
|
||||||
return this.pdfDocument.serializeXfaData(annotationStorage);
|
return this.pdfDocument.serializeXfaData(annotationStorage);
|
||||||
}
|
}
|
||||||
|
@ -191,12 +191,15 @@ class WorkerMessageHandler {
|
|||||||
if (isPureXfa) {
|
if (isPureXfa) {
|
||||||
const task = new WorkerTask("loadXfaFonts");
|
const task = new WorkerTask("loadXfaFonts");
|
||||||
startWorkerTask(task);
|
startWorkerTask(task);
|
||||||
await pdfManager
|
await Promise.all([
|
||||||
.loadXfaFonts(handler, task)
|
pdfManager
|
||||||
.catch(reason => {
|
.loadXfaFonts(handler, task)
|
||||||
// Ignore errors, to allow the document to load.
|
.catch(reason => {
|
||||||
})
|
// Ignore errors, to allow the document to load.
|
||||||
.then(() => finishWorkerTask(task));
|
})
|
||||||
|
.then(() => finishWorkerTask(task)),
|
||||||
|
pdfManager.loadXfaImages(),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const [numPages, fingerprints] = await Promise.all([
|
const [numPages, fingerprints] = await Promise.all([
|
||||||
|
@ -61,6 +61,10 @@ class XFAFactory {
|
|||||||
return this.dims.length;
|
return this.dims.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setImages(images) {
|
||||||
|
this.form[$globalData].images = images;
|
||||||
|
}
|
||||||
|
|
||||||
setFonts(fonts) {
|
setFonts(fonts) {
|
||||||
this.form[$globalData].fontFinder = new FontFinder(fonts);
|
this.form[$globalData].fontFinder = new FontFinder(fonts);
|
||||||
const missingFonts = [];
|
const missingFonts = [];
|
||||||
|
@ -2932,56 +2932,59 @@ class Image extends StringObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[$toHTML]() {
|
[$toHTML]() {
|
||||||
if (this.href || !this[$content]) {
|
let buffer =
|
||||||
// TODO: href can be a Name referring to an internal stream
|
this[$globalData].images && this[$globalData].images.get(this.href);
|
||||||
// containing a picture.
|
if (!buffer && (this.href || !this[$content])) {
|
||||||
// In general, we don't get remote data and use what we have
|
// In general, we don't get remote data and use what we have
|
||||||
// in the pdf itself, so no picture for non null href.
|
// in the pdf itself, so no picture for non null href.
|
||||||
return HTMLResult.EMPTY;
|
return HTMLResult.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Firefox doesn't support natively tiff (and tif) format.
|
if (!buffer && this.transferEncoding === "base64") {
|
||||||
if (this.transferEncoding === "base64") {
|
buffer = stringToBytes(atob(this[$content]));
|
||||||
const buffer = stringToBytes(atob(this[$content]));
|
|
||||||
const blob = new Blob([buffer], { type: this.contentType });
|
|
||||||
let style;
|
|
||||||
switch (this.aspect) {
|
|
||||||
case "fit":
|
|
||||||
case "actual":
|
|
||||||
// TODO: check what to do with actual.
|
|
||||||
// Normally we should return {auto, auto} for it but
|
|
||||||
// it implies some wrong rendering (see xfa_bug1716816.pdf).
|
|
||||||
break;
|
|
||||||
case "height":
|
|
||||||
style = {
|
|
||||||
width: "auto",
|
|
||||||
height: "100%",
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case "none":
|
|
||||||
style = {
|
|
||||||
width: "100%",
|
|
||||||
height: "100%",
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case "width":
|
|
||||||
style = {
|
|
||||||
width: "100%",
|
|
||||||
height: "auto",
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return HTMLResult.success({
|
|
||||||
name: "img",
|
|
||||||
attributes: {
|
|
||||||
class: ["xfaImage"],
|
|
||||||
style,
|
|
||||||
src: URL.createObjectURL(blob),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return HTMLResult.EMPTY;
|
if (!buffer) {
|
||||||
|
return HTMLResult.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Firefox doesn't support natively tiff (and tif) format.
|
||||||
|
const blob = new Blob([buffer], { type: this.contentType });
|
||||||
|
let style;
|
||||||
|
switch (this.aspect) {
|
||||||
|
case "fit":
|
||||||
|
case "actual":
|
||||||
|
// TODO: check what to do with actual.
|
||||||
|
// Normally we should return {auto, auto} for it but
|
||||||
|
// it implies some wrong rendering (see xfa_bug1716816.pdf).
|
||||||
|
break;
|
||||||
|
case "height":
|
||||||
|
style = {
|
||||||
|
width: "auto",
|
||||||
|
height: "100%",
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "none":
|
||||||
|
style = {
|
||||||
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "width":
|
||||||
|
style = {
|
||||||
|
width: "100%",
|
||||||
|
height: "auto",
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return HTMLResult.success({
|
||||||
|
name: "img",
|
||||||
|
attributes: {
|
||||||
|
class: ["xfaImage"],
|
||||||
|
style,
|
||||||
|
src: URL.createObjectURL(blob),
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
test/pdfs/xfa_bug1718521_1.pdf.link
Normal file
1
test/pdfs/xfa_bug1718521_1.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
https://bugzilla.mozilla.org/attachment.cgi?id=9229396
|
1
test/pdfs/xfa_bug1718521_2.pdf.link
Normal file
1
test/pdfs/xfa_bug1718521_2.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
https://bugzilla.mozilla.org/attachment.cgi?id=9229409
|
1
test/pdfs/xfa_bug1718521_3.pdf.link
Normal file
1
test/pdfs/xfa_bug1718521_3.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
https://bugzilla.mozilla.org/attachment.cgi?id=9229430
|
@ -938,6 +938,30 @@
|
|||||||
"lastPage": 2,
|
"lastPage": 2,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "xfa_bug1718521_1",
|
||||||
|
"file": "pdfs/xfa_bug1718521_1.pdf",
|
||||||
|
"md5": "9b89dd9e6a4c6c3258ca24debd806863",
|
||||||
|
"link": true,
|
||||||
|
"rounds": 1,
|
||||||
|
"enableXfa": true,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
|
{ "id": "xfa_bug1718521_2",
|
||||||
|
"file": "pdfs/xfa_bug1718521_2.pdf",
|
||||||
|
"md5": "c23beb39e1c91a780da9d4b60cbd157f",
|
||||||
|
"link": true,
|
||||||
|
"rounds": 1,
|
||||||
|
"enableXfa": true,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
|
{ "id": "xfa_bug1718521_3",
|
||||||
|
"file": "pdfs/xfa_bug1718521_3.pdf",
|
||||||
|
"md5": "5cc6fb1a65515518e3e64baa81e7a21e",
|
||||||
|
"link": true,
|
||||||
|
"rounds": 1,
|
||||||
|
"enableXfa": true,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "xfa_bug1718735",
|
{ "id": "xfa_bug1718735",
|
||||||
"file": "pdfs/xfa_bug1718735.pdf",
|
"file": "pdfs/xfa_bug1718735.pdf",
|
||||||
"md5": "1001f5c02c026943cbd37f646725d82f",
|
"md5": "1001f5c02c026943cbd37f646725d82f",
|
||||||
|
Loading…
Reference in New Issue
Block a user