Fuzzy-match the fontName, for TrueType Collection fonts, where the "name"-table is wrong (issue 13193)
The fontName, as defined in the PDF document, cannot be found in *any* of the "name"-tables in the TrueType Collection font. To work-around that, this patch adds a *fallback* code-path to allow using an approximately matching fontName rather than outright failing.
This commit is contained in:
parent
6ddc297170
commit
f986ccdf0e
@ -1554,6 +1554,8 @@ var Font = (function FontClosure() {
|
|||||||
|
|
||||||
function readTrueTypeCollectionData(ttc, fontName) {
|
function readTrueTypeCollectionData(ttc, fontName) {
|
||||||
const { numFonts, offsetTable } = readTrueTypeCollectionHeader(ttc);
|
const { numFonts, offsetTable } = readTrueTypeCollectionHeader(ttc);
|
||||||
|
const fontNameParts = fontName.split("+");
|
||||||
|
let fallbackData;
|
||||||
|
|
||||||
for (let i = 0; i < numFonts; i++) {
|
for (let i = 0; i < numFonts; i++) {
|
||||||
ttc.pos = (ttc.start || 0) + offsetTable[i];
|
ttc.pos = (ttc.start || 0) + offsetTable[i];
|
||||||
@ -1569,16 +1571,42 @@ var Font = (function FontClosure() {
|
|||||||
|
|
||||||
for (let j = 0, jj = nameTable.length; j < jj; j++) {
|
for (let j = 0, jj = nameTable.length; j < jj; j++) {
|
||||||
for (let k = 0, kk = nameTable[j].length; k < kk; k++) {
|
for (let k = 0, kk = nameTable[j].length; k < kk; k++) {
|
||||||
const nameEntry = nameTable[j][k];
|
const nameEntry =
|
||||||
if (nameEntry && nameEntry.replace(/\s/g, "") === fontName) {
|
nameTable[j][k] && nameTable[j][k].replace(/\s/g, "");
|
||||||
|
if (!nameEntry) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (nameEntry === fontName) {
|
||||||
return {
|
return {
|
||||||
header: potentialHeader,
|
header: potentialHeader,
|
||||||
tables: potentialTables,
|
tables: potentialTables,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (fontNameParts.length < 2) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (const part of fontNameParts) {
|
||||||
|
if (nameEntry === part) {
|
||||||
|
fallbackData = {
|
||||||
|
name: part,
|
||||||
|
header: potentialHeader,
|
||||||
|
tables: potentialTables,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (fallbackData) {
|
||||||
|
warn(
|
||||||
|
`TrueType Collection does not contain "${fontName}" font, ` +
|
||||||
|
`falling back to "${fallbackData.name}" font instead.`
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
header: fallbackData.header,
|
||||||
|
tables: fallbackData.tables,
|
||||||
|
};
|
||||||
|
}
|
||||||
throw new FormatError(
|
throw new FormatError(
|
||||||
`TrueType Collection does not contain "${fontName}" font.`
|
`TrueType Collection does not contain "${fontName}" font.`
|
||||||
);
|
);
|
||||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -385,6 +385,7 @@
|
|||||||
!issue9278.pdf
|
!issue9278.pdf
|
||||||
!annotation-text-without-popup.pdf
|
!annotation-text-without-popup.pdf
|
||||||
!annotation-underline.pdf
|
!annotation-underline.pdf
|
||||||
|
!issue13193.pdf
|
||||||
!annotation-underline-without-appearance.pdf
|
!annotation-underline-without-appearance.pdf
|
||||||
!issue269_2.pdf
|
!issue269_2.pdf
|
||||||
!annotation-strikeout.pdf
|
!annotation-strikeout.pdf
|
||||||
|
BIN
test/pdfs/issue13193.pdf
Normal file
BIN
test/pdfs/issue13193.pdf
Normal file
Binary file not shown.
@ -3095,6 +3095,12 @@
|
|||||||
"link": true,
|
"link": true,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "issue13193",
|
||||||
|
"file": "pdfs/issue13193.pdf",
|
||||||
|
"md5": "38cf058f58b7dc5dc54e1602580936a7",
|
||||||
|
"rounds": 1,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "issue1655",
|
{ "id": "issue1655",
|
||||||
"file": "pdfs/issue1655r.pdf",
|
"file": "pdfs/issue1655r.pdf",
|
||||||
"md5": "569f48449ba57c15c4f9ade151a651c5",
|
"md5": "569f48449ba57c15c4f9ade151a651c5",
|
||||||
|
Loading…
Reference in New Issue
Block a user