diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 3e836ce16ca4a..ecef46302b802 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -4606,6 +4606,10 @@ class PartialEvaluator { if (typeof italicAngle !== "number") { italicAngle = 0; } + let fontWeight = descriptor.get("FontWeight"); + if (typeof fontWeight !== "number") { + fontWeight = 400; + } const properties = { type, @@ -4630,6 +4634,7 @@ class PartialEvaluator { capHeight, flags, italicAngle, + fontWeight, isType3Font, cssFontInfo, scaleFactors: glyphScaleFactors, diff --git a/src/core/fonts.js b/src/core/fonts.js index 97ea14c70fd62..19f2c795e0c70 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -1042,6 +1042,16 @@ class Font { this.fontMatrix = properties.fontMatrix; this.bbox = properties.bbox; this.defaultEncoding = properties.defaultEncoding; + if (typeof properties.fontWeight === "number") { + if (properties.fontWeight === 900) { + this.black = true; + } else if (properties.fontWeight >= 700) { + this.bold = true; + } + } + if (typeof properties.italicAngle === "number" && properties.italicAngle) { + this.italic = true; + } this.toUnicode = properties.toUnicode; this.toFontChar = []; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 75b11be7dc1a2..49765227286af 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -752,3 +752,4 @@ !bug1937438_af_from_latex.pdf !bug1937438_from_word.pdf !bug1937438_mml_from_latex.pdf +!translated_fonts_weight.pdf \ No newline at end of file diff --git a/test/pdfs/translated_fonts_weight.pdf b/test/pdfs/translated_fonts_weight.pdf new file mode 100644 index 0000000000000..1359cb3f67ad1 Binary files /dev/null and b/test/pdfs/translated_fonts_weight.pdf differ diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index a8e0fbc07e68c..5d53689ecc842 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -3309,6 +3309,46 @@ describe("api", function () { await loadingTask.destroy(); }); }); + + describe("Fonts", function () { + it("set black/bold/italic properties to translated fonts", async function () { + const loadingTask = getDocument( + buildGetDocumentParams("translated_fonts_weight.pdf") + ); + const pdfDoc = await loadingTask.promise; + const page = await pdfDoc.getPage(1); + await page.getOperatorList(); + + const fontsMap = Array.from(page.commonObjs); + const fonts = fontsMap.map(entry => entry[1]); + + expect(fonts[0].black).toEqual(undefined); + expect(fonts[0].bold).toEqual(undefined); + expect(fonts[0].italic).toEqual(undefined); + + expect(fonts[1].black).toEqual(undefined); + expect(fonts[1].bold).toEqual(true); + expect(fonts[1].italic).toEqual(undefined); + + expect(fonts[2].black).toEqual(undefined); + expect(fonts[2].bold).toEqual(undefined); + expect(fonts[2].italic).toEqual(true); + + expect(fonts[3].black).toEqual(undefined); + expect(fonts[3].bold).toEqual(true); + expect(fonts[3].italic).toEqual(true); + + expect(fonts[4].black).toEqual(true); + expect(fonts[4].bold).toEqual(undefined); + expect(fonts[4].italic).toEqual(undefined); + + expect(fonts[5].black).toEqual(true); + expect(fonts[5].bold).toEqual(undefined); + expect(fonts[5].italic).toEqual(true); + + await loadingTask.destroy(); + }); + }); }); describe("Page", function () {