From c5083cda028963a5d12c2d4264ade904ea016930 Mon Sep 17 00:00:00 2001 From: Dominik Hufnagel Date: Thu, 21 Jan 2021 22:33:43 +0100 Subject: [PATCH] set font size and color on annotation layer use the default appearance to set the font size and color of a text annotation widget --- src/core/annotation.js | 17 ++++++------ src/display/annotation_layer.js | 45 +++++++++----------------------- test/pdfs/.gitignore | 1 + test/pdfs/pr12828.pdf | Bin 0 -> 16711 bytes test/test_manifest.json | 8 ++++++ 5 files changed, 30 insertions(+), 41 deletions(-) create mode 100644 test/pdfs/pr12828.pdf diff --git a/src/core/annotation.js b/src/core/annotation.js index 27de618b90dd2..1e32d56f43268 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -997,9 +997,7 @@ class WidgetAnnotation extends Annotation { data.defaultAppearance = isString(defaultAppearance) ? defaultAppearance : ""; - this._defaultAppearanceData = parseDefaultAppearance( - data.defaultAppearance - ); + data.defaultAppearanceData = parseDefaultAppearance(data.defaultAppearance); const fieldType = getInheritableProperty({ dict, key: "FT" }); data.fieldType = isName(fieldType) ? fieldType.name : null; @@ -1294,7 +1292,7 @@ class WidgetAnnotation extends Annotation { // Doing so prevents exceptions and allows saving/printing // the file as expected. this.data.defaultAppearance = "/Helvetica 0 Tf 0 g"; - this._defaultAppearanceData = parseDefaultAppearance( + this.data.defaultAppearanceData = parseDefaultAppearance( this.data.defaultAppearance ); } @@ -1377,7 +1375,7 @@ class WidgetAnnotation extends Annotation { }, }; - const { fontName, fontSize } = this._defaultAppearanceData; + const { fontName, fontSize } = this.data.defaultAppearanceData; await evaluator.handleSetFont( this._fieldResources.mergedResources, [fontName, fontSize], @@ -1392,9 +1390,9 @@ class WidgetAnnotation extends Annotation { } _computeFontSize(font, height) { - let fontSize = this._defaultAppearanceData.fontSize; + let fontSize = this.data.defaultAppearanceData.fontSize; if (!fontSize) { - const { fontColor, fontName } = this._defaultAppearanceData; + const { fontColor, fontName } = this.data.defaultAppearanceData; let capHeight; if (font.capHeight) { capHeight = font.capHeight; @@ -1456,7 +1454,7 @@ class WidgetAnnotation extends Annotation { PDFJSDev.test("!PRODUCTION || TESTING") ) { assert( - this._defaultAppearanceData, + this.data.defaultAppearanceData, "Expected `_defaultAppearanceData` to have been set." ); } @@ -1467,7 +1465,8 @@ class WidgetAnnotation extends Annotation { } = this._fieldResources; const fontNameStr = - this._defaultAppearanceData && this._defaultAppearanceData.fontName.name; + this.data.defaultAppearanceData && + this.data.defaultAppearanceData.fontName.name; if (!fontNameStr) { return localResources || Dict.empty; } diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index 25a8fda525673..2e8e5f5265946 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -595,7 +595,6 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { } render() { - const TEXT_ALIGNMENT = ["left", "center", "right"]; const storage = this.annotationStorage; const id = this.data.id; @@ -834,20 +833,9 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { element.textContent = this.data.fieldValue; element.style.verticalAlign = "middle"; element.style.display = "table-cell"; - - let font = null; - if ( - this.data.fontRefName && - this.page.commonObjs.has(this.data.fontRefName) - ) { - font = this.page.commonObjs.get(this.data.fontRefName); - } - this._setTextStyle(element, font); } - if (this.data.textAlignment !== null) { - element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; - } + this._setTextStyle(element); this.container.appendChild(element); return this.container; @@ -858,32 +846,25 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { * * @private * @param {HTMLDivElement} element - * @param {Object} font * @memberof TextWidgetAnnotationElement */ - _setTextStyle(element, font) { - // TODO: This duplicates some of the logic in CanvasGraphics.setFont(). + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { fontSize, fontColor } = this.data.defaultAppearanceData; const style = element.style; - style.fontSize = `${this.data.fontSize}px`; - style.direction = this.data.fontDirection < 0 ? "rtl" : "ltr"; - if (!font) { - return; + // TODO: If the font-size is zero, calculate it based on the height and + // width of the element. + // Not setting `style.fontSize` will use the default font-size for now. + if (fontSize) { + style.fontSize = `${fontSize}px`; } - let bold = "normal"; - if (font.black) { - bold = "900"; - } else if (font.bold) { - bold = "bold"; - } - style.fontWeight = bold; - style.fontStyle = font.italic ? "italic" : "normal"; + style.color = Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); - // Use a reasonable default font if the font doesn't specify a fallback. - const fontFamily = font.loadedName ? `"${font.loadedName}", ` : ""; - const fallbackName = font.fallbackName || "Helvetica, sans-serif"; - style.fontFamily = fontFamily + fallbackName; + if (this.data.textAlignment !== null) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } } } diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 2c72de34bd1cb..b53fb8b1ee61f 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -418,3 +418,4 @@ !issue11555.pdf !issue12337.pdf !pr12564.pdf +!pr12828.pdf diff --git a/test/pdfs/pr12828.pdf b/test/pdfs/pr12828.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f69caee844dce366f2aeb752192ef6ef52dd60c7 GIT binary patch literal 16711 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

ZrKEgM2MVnOO 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