Merge pull request #16188 from calixteman/bug1823296
Use the position of the previous xref stream if any when saving a pdf (bug 1823296)
This commit is contained in:
commit
8bfebf1c24
@ -660,6 +660,7 @@ class WorkerMessageHandler {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const lastXRefStreamPos = xref.lastXRefStreamPos;
|
||||||
newXrefInfo = {
|
newXrefInfo = {
|
||||||
rootRef: xref.trailer.getRaw("Root") || null,
|
rootRef: xref.trailer.getRaw("Root") || null,
|
||||||
encryptRef: xref.trailer.getRaw("Encrypt") || null,
|
encryptRef: xref.trailer.getRaw("Encrypt") || null,
|
||||||
@ -667,7 +668,8 @@ class WorkerMessageHandler {
|
|||||||
infoRef: xref.trailer.getRaw("Info") || null,
|
infoRef: xref.trailer.getRaw("Info") || null,
|
||||||
info: infoObj,
|
info: infoObj,
|
||||||
fileIds: xref.trailer.get("ID") || null,
|
fileIds: xref.trailer.get("ID") || null,
|
||||||
startXRef,
|
startXRef:
|
||||||
|
lastXRefStreamPos === null ? startXRef : lastXRefStreamPos,
|
||||||
filename,
|
filename,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -836,6 +838,11 @@ class WorkerMessageHandler {
|
|||||||
handler.on("GetXFADatasets", function (data) {
|
handler.on("GetXFADatasets", function (data) {
|
||||||
return pdfManager.ensureDoc("xfaDatasets");
|
return pdfManager.ensureDoc("xfaDatasets");
|
||||||
});
|
});
|
||||||
|
handler.on("GetXRefPrevValue", function (data) {
|
||||||
|
return pdfManager
|
||||||
|
.ensureXRef("trailer")
|
||||||
|
.then(trailer => trailer.get("Prev"));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return workerHandlerName;
|
return workerHandlerName;
|
||||||
|
@ -756,6 +756,11 @@ class XRef {
|
|||||||
throw new XRefParseException();
|
throw new XRefParseException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get lastXRefStreamPos() {
|
||||||
|
const pos = Object.keys(this.xrefstms);
|
||||||
|
return pos.length === 0 ? null : Math.max(...pos);
|
||||||
|
}
|
||||||
|
|
||||||
getEntry(i) {
|
getEntry(i) {
|
||||||
const xrefEntry = this.entries[i];
|
const xrefEntry = this.entries[i];
|
||||||
if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
|
if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
|
||||||
|
@ -777,6 +777,11 @@ class PDFDocumentProxy {
|
|||||||
return this._transport.getXFADatasets();
|
return this._transport.getXFADatasets();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
Object.defineProperty(this, "getXRefPrevValue", {
|
||||||
|
value: () => {
|
||||||
|
return this._transport.getXRefPrevValue();
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2397,6 +2402,11 @@ class WorkerTransport {
|
|||||||
return this.messageHandler.sendWithPromise("GetXFADatasets", null);
|
return this.messageHandler.sendWithPromise("GetXFADatasets", null);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
Object.defineProperty(this, "getXRefPrevValue", {
|
||||||
|
value: () => {
|
||||||
|
return this.messageHandler.sendWithPromise("GetXRefPrevValue", null);
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
test/pdfs/bug1823296.pdf.link
Normal file
2
test/pdfs/bug1823296.pdf.link
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
https://bugzilla.mozilla.org/attachment.cgi?id=9324226
|
||||||
|
|
@ -7496,5 +7496,12 @@
|
|||||||
"md5": "d95a83a868671a03cbf322f16b2e2b9d",
|
"md5": "d95a83a868671a03cbf322f16b2e2b9d",
|
||||||
"link": true,
|
"link": true,
|
||||||
"type": "other"
|
"type": "other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bug1823296",
|
||||||
|
"file": "pdfs/bug1823296.pdf",
|
||||||
|
"md5": "f71e89ebe3d6e75e0c83ce41cd72df1f",
|
||||||
|
"link": true,
|
||||||
|
"type": "other"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
AnnotationEditorType,
|
||||||
AnnotationMode,
|
AnnotationMode,
|
||||||
AnnotationType,
|
AnnotationType,
|
||||||
createPromiseCapability,
|
createPromiseCapability,
|
||||||
@ -1976,6 +1977,35 @@ describe("api", function () {
|
|||||||
await loadingTask.destroy();
|
await loadingTask.destroy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("write a a new annotation, save the pdf and check that the prev entry in xref stream is correct", async function () {
|
||||||
|
if (isNodeJS) {
|
||||||
|
pending("Linked test-cases are not supported in Node.js.");
|
||||||
|
}
|
||||||
|
|
||||||
|
let loadingTask = getDocument(buildGetDocumentParams("bug1823296.pdf"));
|
||||||
|
let pdfDoc = await loadingTask.promise;
|
||||||
|
pdfDoc.annotationStorage.setValue("pdfjs_internal_editor_0", {
|
||||||
|
annotationType: AnnotationEditorType.FREETEXT,
|
||||||
|
rect: [12, 34, 56, 78],
|
||||||
|
rotation: 0,
|
||||||
|
fontSize: 10,
|
||||||
|
color: [0, 0, 0],
|
||||||
|
value: "Hello PDF.js World!",
|
||||||
|
pageIndex: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = await pdfDoc.saveDocument();
|
||||||
|
await loadingTask.destroy();
|
||||||
|
|
||||||
|
loadingTask = getDocument(data);
|
||||||
|
pdfDoc = await loadingTask.promise;
|
||||||
|
const xrefPrev = await pdfDoc.getXRefPrevValue();
|
||||||
|
|
||||||
|
expect(xrefPrev).toEqual(143954);
|
||||||
|
|
||||||
|
await loadingTask.destroy();
|
||||||
|
});
|
||||||
|
|
||||||
describe("Cross-origin", function () {
|
describe("Cross-origin", function () {
|
||||||
let loadingTask;
|
let loadingTask;
|
||||||
function _checkCanLoad(expectSuccess, filename, options) {
|
function _checkCanLoad(expectSuccess, filename, options) {
|
||||||
|
Loading…
Reference in New Issue
Block a user