[Editor] Avoid conflicts between new persistent refs and the ones created 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.
This commit is contained in:
Calixte Denizet 2023-12-04 20:49:15 +01:00
parent 795c63e400
commit ae5828c968
6 changed files with 52 additions and 0 deletions

View File

@ -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);

View File

@ -44,6 +44,7 @@ class XRef {
this._pendingRefs = new RefSet();
this._newPersistentRefNum = null;
this._newTemporaryRefNum = null;
this._persistentRefsCache = null;
}
getNewPersistentRef(obj) {
@ -63,6 +64,19 @@ 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 *temporarily* clear the cache, see `resetNewTemporaryRef` below,
// 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);
}
@ -70,6 +84,12 @@ class XRef {
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) {

View File

@ -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();

View File

@ -619,3 +619,4 @@
!issue17069.pdf
!issue17215.pdf
!bug1863910.pdf
!bug1865341.pdf

BIN
test/pdfs/bug1865341.pdf Executable file

Binary file not shown.

View File

@ -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
}
}
}
]