mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-26 10:08:06 +02:00
Don't save anything in XFA entry if no XFA! (bug 1732344)
- it aims to fix https://bugzilla.mozilla.org/show_bug.cgi?id=1732344 - rename some variables to have a more clear code; - and last but no least, add a unit test to test saving.
This commit is contained in:
parent
c914e9f0a6
commit
4b0538d07a
5 changed files with 60 additions and 32 deletions
|
@ -624,18 +624,18 @@ class WorkerMessageHandler {
|
|||
}
|
||||
|
||||
const xfa = (acroForm instanceof Dict && acroForm.get("XFA")) || null;
|
||||
let xfaDatasets = null;
|
||||
let hasDatasets = false;
|
||||
let xfaDatasetsRef = null;
|
||||
let hasXfaDatasetsEntry = false;
|
||||
if (Array.isArray(xfa)) {
|
||||
for (let i = 0, ii = xfa.length; i < ii; i += 2) {
|
||||
if (xfa[i] === "datasets") {
|
||||
xfaDatasets = xfa[i + 1];
|
||||
xfaDatasetsRef = xfa[i + 1];
|
||||
acroFormRef = null;
|
||||
hasDatasets = true;
|
||||
hasXfaDatasetsEntry = true;
|
||||
}
|
||||
}
|
||||
if (xfaDatasets === null) {
|
||||
xfaDatasets = xref.getNewRef();
|
||||
if (xfaDatasetsRef === null) {
|
||||
xfaDatasetsRef = xref.getNewRef();
|
||||
}
|
||||
} else if (xfa) {
|
||||
acroFormRef = null;
|
||||
|
@ -674,8 +674,9 @@ class WorkerMessageHandler {
|
|||
xrefInfo: newXrefInfo,
|
||||
newRefs,
|
||||
xref,
|
||||
datasetsRef: xfaDatasets,
|
||||
hasDatasets,
|
||||
hasXfa: !!xfa,
|
||||
xfaDatasetsRef,
|
||||
hasXfaDatasetsEntry,
|
||||
acroFormRef,
|
||||
acroForm,
|
||||
xfaData,
|
||||
|
|
|
@ -154,8 +154,8 @@ function writeXFADataForAcroform(str, newRefs) {
|
|||
|
||||
function updateXFA({
|
||||
xfaData,
|
||||
datasetsRef,
|
||||
hasDatasets,
|
||||
xfaDatasetsRef,
|
||||
hasXfaDatasetsEntry,
|
||||
acroFormRef,
|
||||
acroForm,
|
||||
newRefs,
|
||||
|
@ -166,7 +166,7 @@ function updateXFA({
|
|||
return;
|
||||
}
|
||||
|
||||
if (!hasDatasets) {
|
||||
if (!hasXfaDatasetsEntry) {
|
||||
if (!acroFormRef) {
|
||||
warn("XFA - Cannot save it");
|
||||
return;
|
||||
|
@ -178,7 +178,7 @@ function updateXFA({
|
|||
const oldXfa = acroForm.get("XFA");
|
||||
const newXfa = oldXfa.slice();
|
||||
newXfa.splice(2, 0, "datasets");
|
||||
newXfa.splice(3, 0, datasetsRef);
|
||||
newXfa.splice(3, 0, xfaDatasetsRef);
|
||||
|
||||
acroForm.set("XFA", newXfa);
|
||||
|
||||
|
@ -201,25 +201,25 @@ function updateXFA({
|
|||
}
|
||||
|
||||
if (xfaData === null) {
|
||||
const datasets = xref.fetchIfRef(datasetsRef);
|
||||
const datasets = xref.fetchIfRef(xfaDatasetsRef);
|
||||
xfaData = writeXFADataForAcroform(datasets.getString(), newRefs);
|
||||
}
|
||||
|
||||
const encrypt = xref.encrypt;
|
||||
if (encrypt) {
|
||||
const transform = encrypt.createCipherTransform(
|
||||
datasetsRef.num,
|
||||
datasetsRef.gen
|
||||
xfaDatasetsRef.num,
|
||||
xfaDatasetsRef.gen
|
||||
);
|
||||
xfaData = transform.encryptString(xfaData);
|
||||
}
|
||||
const data =
|
||||
`${datasetsRef.num} ${datasetsRef.gen} obj\n` +
|
||||
`${xfaDatasetsRef.num} ${xfaDatasetsRef.gen} obj\n` +
|
||||
`<< /Type /EmbeddedFile /Length ${xfaData.length}>>\nstream\n` +
|
||||
xfaData +
|
||||
"\nendstream\nendobj\n";
|
||||
|
||||
newRefs.push({ ref: datasetsRef, data });
|
||||
newRefs.push({ ref: xfaDatasetsRef, data });
|
||||
}
|
||||
|
||||
function incrementalUpdate({
|
||||
|
@ -227,22 +227,25 @@ function incrementalUpdate({
|
|||
xrefInfo,
|
||||
newRefs,
|
||||
xref = null,
|
||||
datasetsRef = null,
|
||||
hasDatasets = false,
|
||||
hasXfa = false,
|
||||
xfaDatasetsRef = null,
|
||||
hasXfaDatasetsEntry = false,
|
||||
acroFormRef = null,
|
||||
acroForm = null,
|
||||
xfaData = null,
|
||||
}) {
|
||||
updateXFA({
|
||||
xfaData,
|
||||
datasetsRef,
|
||||
hasDatasets,
|
||||
acroFormRef,
|
||||
acroForm,
|
||||
newRefs,
|
||||
xref,
|
||||
xrefInfo,
|
||||
});
|
||||
if (hasXfa) {
|
||||
updateXFA({
|
||||
xfaData,
|
||||
xfaDatasetsRef,
|
||||
hasXfaDatasetsEntry,
|
||||
acroFormRef,
|
||||
acroForm,
|
||||
newRefs,
|
||||
xref,
|
||||
xrefInfo,
|
||||
});
|
||||
}
|
||||
|
||||
const newXref = new Dict(null);
|
||||
const refForXrefTable = xrefInfo.newRef;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue