From 9ed5eef6d7283ae2ef47f992fea8da25487dc544 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Wed, 1 Apr 2026 13:10:24 +0200 Subject: [PATCH] Fix the annotation base transform before drawing it It fixes #7821. We do something similar for before drawing XObjects. --- src/display/canvas.js | 3 +++ test/pdfs/.gitignore | 1 + test/pdfs/issue7821.pdf | Bin 0 -> 8500 bytes test/test_manifest.json | 7 +++++++ 4 files changed, 11 insertions(+) create mode 100755 test/pdfs/issue7821.pdf diff --git a/src/display/canvas.js b/src/display/canvas.js index aad6f94df..2d807cd51 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -2858,8 +2858,10 @@ class CanvasGraphics { this.ctx.canvas.height ); + this.baseTransformStack.push(this.baseTransform); this.transform(opIdx, ...transform); this.transform(opIdx, ...matrix); + this.baseTransform = getCurrentTransform(this.ctx); } endAnnotation(opIdx) { @@ -2871,6 +2873,7 @@ class CanvasGraphics { delete this.annotationCanvas.savedCtx; delete this.annotationCanvas; } + this.baseTransform = this.baseTransformStack.pop(); } paintImageMaskXObject(opIdx, img) { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 598cf869e..f75ed2f4d 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -897,3 +897,4 @@ !tiling_patterns_variations.pdf !function_based_shading.pdf !issue16091.pdf +!issue7821.pdf diff --git a/test/pdfs/issue7821.pdf b/test/pdfs/issue7821.pdf new file mode 100755 index 0000000000000000000000000000000000000000..646cba636a8c59ff4c203fcb69fe45a88e8675a2 GIT binary patch literal 8500 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