Skip to content

Commit d7c1f82

Browse files
committed
Handling of rotated and scaled text relative to document.
1 parent 9cce723 commit d7c1f82

File tree

5 files changed

+40
-61
lines changed

5 files changed

+40
-61
lines changed

src/UI/edit.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
findSVGAtPoint,
1414
getOffsetAnnotationRect,
1515
getMetadata,
16-
scaleDown,
1716
scaleUp,
1817
convertToSvgPoint
1918
} from './utils';

src/UI/rect.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
enableUserSelect,
88
findSVGAtPoint,
99
getMetadata,
10-
screenToPdf
10+
convertToSvgRect
1111
} from './utils';
1212

1313
let _enabled = false;
@@ -171,12 +171,12 @@ function saveRect(type, rects, color) {
171171
offset = r.height / 2;
172172
}
173173

174-
return screenToPdf(svg, {
174+
return convertToSvgRect({
175175
y: (r.top + offset) - boundingRect.top,
176176
x: r.left - boundingRect.left,
177177
width: r.width,
178178
height: r.height
179-
});
179+
}, svg);
180180
}).filter((r) => r.width > 0 && r.height > 0 && r.x > -1 && r.y > -1)
181181
};
182182

src/UI/text.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import {
44
BORDER_COLOR,
55
findSVGAtPoint,
66
getMetadata,
7-
scaleDown,
8-
screenToPdf
7+
convertToSvgPoint
98
} from './utils';
109

1110
let _enabled = false;
@@ -71,21 +70,22 @@ function saveText() {
7170
if (!svg) {
7271
return;
7372
}
73+
let height = _textSize;
7474

75-
let { documentId, pageNumber } = getMetadata(svg);
75+
let { documentId, pageNumber, viewport } = getMetadata(svg);
7676
let rect = svg.getBoundingClientRect();
77-
let annotation = Object.assign({
77+
let pt = convertToSvgPoint([
78+
clientX - rect.left,
79+
clientY - rect.top + height], svg, viewport);
80+
let annotation = {
7881
type: 'textbox',
7982
size: _textSize,
8083
color: _textColor,
81-
content: input.value.trim()
82-
}, scaleDown(svg, {
83-
x: clientX - rect.left,
84-
y: clientY - rect.top,
85-
width: input.offsetWidth,
86-
height: input.offsetHeight
87-
})
88-
);
84+
content: input.value.trim(),
85+
x: pt[0],
86+
y: pt[1],
87+
rotation: -viewport.rotation
88+
}
8989

9090
PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation)
9191
.then((annotation) => {

src/UI/utils.js

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -134,53 +134,24 @@ export function scaleUp(svg, rect) {
134134
return result;
135135
}
136136

137-
export function screenToPdf(svg, rect) {
138-
let result = {};
139-
let { viewport } = getMetadata(svg);
140-
141-
let xform = [ 1, 0, 0, 1, 0, 0 ];
142-
let trans = getTranslation(viewport);
143-
xform = scale(xform, viewport.scale, viewport.scale);
144-
xform = rotate(xform, viewport.rotation);
145-
xform = translate(xform, trans.x, trans.y);
146-
137+
export function convertToSvgRect(rect, svg, viewport) {
147138
var pt1 = [rect.x, rect.y];
148139
var pt2 = [rect.x + rect.width, rect.y + rect.height];
149140

150-
pt1 = applyInverseTransform(pt1, xform);
151-
pt2 = applyInverseTransform(pt2, xform);
152-
153-
var width = Math.abs(pt2[0] - pt1[0]);
154-
var height = Math.abs(pt2[1] - pt1[1]);
141+
pt1 = convertToSvgPoint(pt1, svg, viewport);
142+
pt2 = convertToSvgPoint(pt2, svg, viewport);
155143

156-
switch (viewport.rotation % 360) {
157-
case 0:
158-
result.x = pt1[0];
159-
result.y = pt1[1];
160-
break;
161-
case 90:
162-
result.x = pt1[0];
163-
result.y = pt1[1] - height;
164-
break;
165-
case 180:
166-
result.x = pt1[0] - width;
167-
result.y = pt1[1] - height;
168-
break;
169-
case 270:
170-
result.x = pt1[0] - width;
171-
result.y = pt1[1];
172-
break;
173-
}
174-
175-
result.width = width;
176-
result.height = height;
177-
178-
return result;
144+
return {
145+
x: Math.min(pt1[0], pt2[0]),
146+
y: Math.min(pt1[1], pt2[1]),
147+
width: Math.abs(pt2[0] - pt1[0]),
148+
height: Math.abs(pt2[1] - pt1[1])
149+
};
179150
}
180151

181-
export function convertToSvgPoint(pt, svg) {
152+
export function convertToSvgPoint(pt, svg, viewport) {
182153
let result = {};
183-
let { viewport } = getMetadata(svg);
154+
viewport = viewport || getMetadata(svg).viewport;
184155

185156
let xform = [ 1, 0, 0, 1, 0, 0 ];
186157
xform = scale(xform, viewport.scale, viewport.scale);

src/render/renderText.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,24 @@ import normalizeColor from '../utils/normalizeColor';
99
* @return {SVGTextElement} A text to be rendered
1010
*/
1111
export default function renderText(a) {
12-
var text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
12+
13+
// Text should be rendered at 0 degrees relative to
14+
// document rotation
15+
let text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
16+
let x = a.x;
17+
let y = a.y;
1318

1419
setAttributes(text, {
15-
x: a.x,
16-
y: a.y + parseInt(a.size, 10),
20+
x: x,
21+
y: y,
1722
fill: normalizeColor(a.color || '#000'),
18-
fontSize: a.size
23+
fontSize: a.size,
24+
transform: `rotate(${a.rotation}, ${x}, ${y})`
1925
});
2026
text.innerHTML = a.content;
2127

22-
return text;
28+
var g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
29+
g.appendChild(text);
30+
31+
return g;
2332
}

0 commit comments

Comments
 (0)