diff --git a/src/core/annotation.js b/src/core/annotation.js index b1dcde48b..b49500e75 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -92,6 +92,9 @@ class AnnotationFactory { case 'Popup': return new PopupAnnotation(parameters); + case 'FreeText': + return new FreeTextAnnotation(parameters); + case 'Line': return new LineAnnotation(parameters); @@ -964,6 +967,14 @@ class PopupAnnotation extends Annotation { } } +class FreeTextAnnotation extends MarkupAnnotation { + constructor(parameters) { + super(parameters); + + this.data.annotationType = AnnotationType.FREETEXT; + } +} + class LineAnnotation extends MarkupAnnotation { constructor(parameters) { super(parameters); diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index 4f7c9c77d..ad6f14e73 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -71,6 +71,9 @@ class AnnotationElementFactory { case AnnotationType.POPUP: return new PopupAnnotationElement(parameters); + case AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case AnnotationType.LINE: return new LineAnnotationElement(parameters); @@ -807,6 +810,30 @@ class PopupElement { } } +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + const isRenderable = !!(parameters.data.hasPopup || + parameters.data.title || parameters.data.contents); + super(parameters, isRenderable, /* ignoreBorder = */ true); + } + + /** + * Render the free text annotation's HTML element in the empty container. + * + * @public + * @memberof FreeTextAnnotationElement + * @returns {HTMLSectionElement} + */ + render() { + this.container.className = 'freeTextAnnotation'; + + if (!this.data.hasPopup) { + this._createPopup(this.container, null, this.data); + } + return this.container; + } +} + class LineAnnotationElement extends AnnotationElement { constructor(parameters) { let isRenderable = !!(parameters.data.hasPopup || diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 499695089..fd0935f1a 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -323,6 +323,7 @@ !annotation-strikeout.pdf !annotation-squiggly.pdf !annotation-highlight.pdf +!annotation-freetext.pdf !annotation-line.pdf !annotation-square-circle.pdf !annotation-stamp.pdf diff --git a/test/pdfs/annotation-freetext.pdf b/test/pdfs/annotation-freetext.pdf new file mode 100755 index 000000000..771fb9f93 Binary files /dev/null and b/test/pdfs/annotation-freetext.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index c6051b8f4..e889b9d4e 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -4007,6 +4007,13 @@ "type": "eq", "annotations": true }, + { "id": "annotation-freetext", + "file": "pdfs/annotation-freetext.pdf", + "md5": "6ca19ce632ead3aed08f22e588510e2f", + "rounds": 1, + "type": "eq", + "annotations": true + }, { "id": "annotation-line", "file": "pdfs/annotation-line.pdf", "md5": "fde60608be2748f10fb6522cba425ca1", diff --git a/web/annotation_layer_builder.css b/web/annotation_layer_builder.css index acb6d8d3d..191360f7e 100644 --- a/web/annotation_layer_builder.css +++ b/web/annotation_layer_builder.css @@ -183,6 +183,7 @@ .annotationLayer .underlineAnnotation, .annotationLayer .squigglyAnnotation, .annotationLayer .strikeoutAnnotation, +.annotationLayer .freeTextAnnotation, .annotationLayer .lineAnnotation svg line, .annotationLayer .squareAnnotation svg rect, .annotationLayer .circleAnnotation svg ellipse,