Skip to content

Commit

Permalink
[Editor] Avoid conflicts between new persistent refs and the ones cre…
Browse files Browse the repository at this point in the history
…ated when saving (bug 1865341)

When a pdf as a FreeText without appearance, we use a fake font in order to render it
and that leads to create few new refs for the font.
But then when we're saving, we create some new refs which start at the same number
as the previous created ones.
Consequently, when saving we're using some wrong objects (like a font) to check if
we're able to render the newly added FreeText.
In order to fix this bug, we just remove the persistent refs (which are only used
when rendering/printing) during the saving.
  • Loading branch information
calixteman committed Dec 4, 2023
1 parent a3637e6 commit 837f1c3
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/core/font_substitutions.js
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,10 @@ function getFontSubstitution(
baseFontName,
standardFontName
) {
if (baseFontName.startsWith("InvalidPDFjsFont_")) {
return null;
}

// It's possible to have a font name with spaces, commas or dashes, hence we
// just replace them by a dash.
baseFontName = normalizeFontName(baseFontName);
Expand Down
20 changes: 20 additions & 0 deletions src/core/xref.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class XRef {
this._pendingRefs = new RefSet();
this._newPersistentRefNum = null;
this._newTemporaryRefNum = null;
this._persistentRefsCache = null;
}

getNewPersistentRef(obj) {
Expand All @@ -63,13 +64,32 @@ class XRef {
// stream.
if (this._newTemporaryRefNum === null) {
this._newTemporaryRefNum = this.entries.length || 1;
if (this._newPersistentRefNum) {
this._persistentRefsCache = new Map();
for (
let i = this._newTemporaryRefNum;
i < this._newPersistentRefNum;
i++
) {
// We clean the cache to avoid any conflict with the refs created
// during saving.
this._persistentRefsCache.set(i, this._cacheMap.get(i));
this._cacheMap.delete(i);
}
}
}
return Ref.get(this._newTemporaryRefNum++, 0);
}

resetNewTemporaryRef() {
// Called once saving is finished.
this._newTemporaryRefNum = null;
if (this._persistentRefsCache) {
for (const [num, obj] of this._persistentRefsCache) {
this._cacheMap.set(num, obj);
}
}
this._persistentRefsCache = null;
}

setStartXRef(startXRef) {
Expand Down
6 changes: 6 additions & 0 deletions test/driver.js
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,12 @@ class Driver {
if (!task.annotationStorage) {
throw new Error("Missing `annotationStorage` entry.");
}
if (task.loadAnnotations) {
for (let num = 1; num <= doc.numPages; num++) {
const page = await doc.getPage(num);
await page.getAnnotations({ intent: "display" });
}
}
doc.annotationStorage.setAll(task.annotationStorage);

const data = await doc.saveDocument();
Expand Down
1 change: 1 addition & 0 deletions test/pdfs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -619,3 +619,4 @@
!issue17069.pdf
!issue17215.pdf
!bug1863910.pdf
!bug1865341.pdf
Binary file added test/pdfs/bug1865341.pdf
Binary file not shown.
21 changes: 21 additions & 0 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -8381,5 +8381,26 @@
"link": true,
"type": "eq",
"annotations": true
},
{
"id": "bug1865341",
"file": "pdfs/bug1865341.pdf",
"md5": "e241b6d1dc493df73e77e3eeabc71721",
"rounds": 1,
"type": "eq",
"save": true,
"print": true,
"loadAnnotations": true,
"annotationStorage": {
"pdfjs_internal_editor_0": {
"annotationType": 3,
"color": [255, 0, 0],
"fontSize": 10,
"value": "Załącznik",
"pageIndex": 0,
"rect": [ 238, 629, 287, 649],
"rotation": 0
}
}
}
]

0 comments on commit 837f1c3

Please sign in to comment.