react-pdf-highlighter-plus 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +411 -0
- package/dist/esm/components/AreaHighlight.d.ts +82 -0
- package/dist/esm/components/AreaHighlight.js +109 -0
- package/dist/esm/components/AreaHighlight.js.map +1 -0
- package/dist/esm/components/DrawingCanvas.d.ts +48 -0
- package/dist/esm/components/DrawingCanvas.js +277 -0
- package/dist/esm/components/DrawingCanvas.js.map +1 -0
- package/dist/esm/components/DrawingHighlight.d.ts +70 -0
- package/dist/esm/components/DrawingHighlight.js +164 -0
- package/dist/esm/components/DrawingHighlight.js.map +1 -0
- package/dist/esm/components/FreetextHighlight.d.ts +112 -0
- package/dist/esm/components/FreetextHighlight.js +193 -0
- package/dist/esm/components/FreetextHighlight.js.map +1 -0
- package/dist/esm/components/HighlightLayer.d.ts +49 -0
- package/dist/esm/components/HighlightLayer.js +37 -0
- package/dist/esm/components/HighlightLayer.js.map +1 -0
- package/dist/esm/components/ImageHighlight.d.ts +63 -0
- package/dist/esm/components/ImageHighlight.js +65 -0
- package/dist/esm/components/ImageHighlight.js.map +1 -0
- package/dist/esm/components/MonitoredHighlightContainer.d.ts +37 -0
- package/dist/esm/components/MonitoredHighlightContainer.js +42 -0
- package/dist/esm/components/MonitoredHighlightContainer.js.map +1 -0
- package/dist/esm/components/MouseMonitor.d.ts +34 -0
- package/dist/esm/components/MouseMonitor.js +30 -0
- package/dist/esm/components/MouseMonitor.js.map +1 -0
- package/dist/esm/components/MouseSelection.d.ts +66 -0
- package/dist/esm/components/MouseSelection.js +122 -0
- package/dist/esm/components/MouseSelection.js.map +1 -0
- package/dist/esm/components/PdfHighlighter.d.ts +184 -0
- package/dist/esm/components/PdfHighlighter.js +410 -0
- package/dist/esm/components/PdfHighlighter.js.map +1 -0
- package/dist/esm/components/PdfLoader.d.ts +55 -0
- package/dist/esm/components/PdfLoader.js +57 -0
- package/dist/esm/components/PdfLoader.js.map +1 -0
- package/dist/esm/components/ShapeCanvas.d.ts +51 -0
- package/dist/esm/components/ShapeCanvas.js +205 -0
- package/dist/esm/components/ShapeCanvas.js.map +1 -0
- package/dist/esm/components/ShapeHighlight.d.ts +107 -0
- package/dist/esm/components/ShapeHighlight.js +140 -0
- package/dist/esm/components/ShapeHighlight.js.map +1 -0
- package/dist/esm/components/SignaturePad.d.ts +40 -0
- package/dist/esm/components/SignaturePad.js +138 -0
- package/dist/esm/components/SignaturePad.js.map +1 -0
- package/dist/esm/components/TextHighlight.d.ts +93 -0
- package/dist/esm/components/TextHighlight.js +115 -0
- package/dist/esm/components/TextHighlight.js.map +1 -0
- package/dist/esm/components/TipContainer.d.ts +27 -0
- package/dist/esm/components/TipContainer.js +58 -0
- package/dist/esm/components/TipContainer.js.map +1 -0
- package/dist/esm/contexts/HighlightContext.d.ts +44 -0
- package/dist/esm/contexts/HighlightContext.js +16 -0
- package/dist/esm/contexts/HighlightContext.js.map +1 -0
- package/dist/esm/contexts/PdfHighlighterContext.d.ts +89 -0
- package/dist/esm/contexts/PdfHighlighterContext.js +16 -0
- package/dist/esm/contexts/PdfHighlighterContext.js.map +1 -0
- package/dist/esm/index.d.ts +19 -0
- package/dist/esm/index.js +19 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/coordinates.d.ts +16 -0
- package/dist/esm/lib/coordinates.js +69 -0
- package/dist/esm/lib/coordinates.js.map +1 -0
- package/dist/esm/lib/export-pdf.d.ts +81 -0
- package/dist/esm/lib/export-pdf.js +511 -0
- package/dist/esm/lib/export-pdf.js.map +1 -0
- package/dist/esm/lib/get-bounding-rect.d.ts +3 -0
- package/dist/esm/lib/get-bounding-rect.js +35 -0
- package/dist/esm/lib/get-bounding-rect.js.map +1 -0
- package/dist/esm/lib/get-client-rects.d.ts +3 -0
- package/dist/esm/lib/get-client-rects.js +43 -0
- package/dist/esm/lib/get-client-rects.js.map +1 -0
- package/dist/esm/lib/group-highlights-by-page.d.ts +6 -0
- package/dist/esm/lib/group-highlights-by-page.js +23 -0
- package/dist/esm/lib/group-highlights-by-page.js.map +1 -0
- package/dist/esm/lib/optimize-client-rects.d.ts +3 -0
- package/dist/esm/lib/optimize-client-rects.js +65 -0
- package/dist/esm/lib/optimize-client-rects.js.map +1 -0
- package/dist/esm/lib/pdfjs-dom.d.ts +9 -0
- package/dist/esm/lib/pdfjs-dom.js +55 -0
- package/dist/esm/lib/pdfjs-dom.js.map +1 -0
- package/dist/esm/lib/screenshot.d.ts +4 -0
- package/dist/esm/lib/screenshot.js +24 -0
- package/dist/esm/lib/screenshot.js.map +1 -0
- package/dist/esm/style/AreaHighlight.css +134 -0
- package/dist/esm/style/DrawingCanvas.css +62 -0
- package/dist/esm/style/DrawingHighlight.css +184 -0
- package/dist/esm/style/FreetextHighlight.css +249 -0
- package/dist/esm/style/ImageHighlight.css +97 -0
- package/dist/esm/style/MouseSelection.css +15 -0
- package/dist/esm/style/PdfHighlighter.css +77 -0
- package/dist/esm/style/ShapeCanvas.css +47 -0
- package/dist/esm/style/ShapeHighlight.css +182 -0
- package/dist/esm/style/SignaturePad.css +83 -0
- package/dist/esm/style/TextHighlight.css +199 -0
- package/dist/esm/style/pdf_viewer.css +41 -0
- package/dist/esm/types.d.ts +213 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
import "pdfjs-dist/web/pdf_viewer.css";
|
|
2
|
+
import "../style/PdfHighlighter.css";
|
|
3
|
+
import "../style/pdf_viewer.css";
|
|
4
|
+
import debounce from "lodash.debounce";
|
|
5
|
+
import React, { useLayoutEffect, useRef, useState, } from "react";
|
|
6
|
+
import { createRoot } from "react-dom/client";
|
|
7
|
+
import { PdfHighlighterContext, } from "../contexts/PdfHighlighterContext";
|
|
8
|
+
import { scaledToViewport, viewportPositionToScaled } from "../lib/coordinates";
|
|
9
|
+
import getBoundingRect from "../lib/get-bounding-rect";
|
|
10
|
+
import getClientRects from "../lib/get-client-rects";
|
|
11
|
+
import groupHighlightsByPage from "../lib/group-highlights-by-page";
|
|
12
|
+
import { asElement, findOrCreateContainerLayer, getPageFromElement, getPagesFromRange, getWindow, isHTMLElement, } from "../lib/pdfjs-dom";
|
|
13
|
+
import { DrawingCanvas } from "./DrawingCanvas";
|
|
14
|
+
import { HighlightLayer } from "./HighlightLayer";
|
|
15
|
+
import { MouseSelection } from "./MouseSelection";
|
|
16
|
+
import { ShapeCanvas } from "./ShapeCanvas";
|
|
17
|
+
import { TipContainer } from "./TipContainer";
|
|
18
|
+
let EventBus, PDFLinkService, PDFViewer;
|
|
19
|
+
(async () => {
|
|
20
|
+
// Due to breaking changes in PDF.js 4.0.189. See issue #17228
|
|
21
|
+
const pdfjs = await import("pdfjs-dist/web/pdf_viewer.mjs");
|
|
22
|
+
EventBus = pdfjs.EventBus;
|
|
23
|
+
PDFLinkService = pdfjs.PDFLinkService;
|
|
24
|
+
PDFViewer = pdfjs.PDFViewer;
|
|
25
|
+
})();
|
|
26
|
+
const SCROLL_MARGIN = 10;
|
|
27
|
+
const DEFAULT_SCALE_VALUE = "auto";
|
|
28
|
+
const DEFAULT_TEXT_SELECTION_COLOR = "rgba(153,193,218,255)";
|
|
29
|
+
const findOrCreateHighlightLayer = (textLayer) => {
|
|
30
|
+
return findOrCreateContainerLayer(textLayer, "PdfHighlighter__highlight-layer");
|
|
31
|
+
};
|
|
32
|
+
const disableTextSelection = (viewer, flag) => {
|
|
33
|
+
viewer.viewer?.classList.toggle("PdfHighlighter--disable-selection", flag);
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* This is a large-scale PDF viewer component designed to facilitate
|
|
37
|
+
* highlighting. It should be used as a child to a {@link PdfLoader} to ensure
|
|
38
|
+
* proper document loading. This does not itself render any highlights, but
|
|
39
|
+
* instead its child should be the container component for each individual
|
|
40
|
+
* highlight. This component will be provided appropriate HighlightContext for
|
|
41
|
+
* rendering.
|
|
42
|
+
*
|
|
43
|
+
* @category Component
|
|
44
|
+
*/
|
|
45
|
+
export const PdfHighlighter = ({ highlights, onScrollAway, pdfScaleValue = DEFAULT_SCALE_VALUE, onSelection: onSelectionFinished, onCreateGhostHighlight, onRemoveGhostHighlight, selectionTip, enableAreaSelection, areaSelectionMode, mouseSelectionStyle, pdfDocument, children, textSelectionColor = DEFAULT_TEXT_SELECTION_COLOR, utilsRef, style, enableFreetextCreation, onFreetextClick, enableImageCreation, onImageClick, enableDrawingMode, onDrawingComplete, onDrawingCancel, drawingStrokeColor = "#000000", drawingStrokeWidth = 3, enableShapeMode, onShapeComplete, onShapeCancel, shapeStrokeColor = "#000000", shapeStrokeWidth = 2, }) => {
|
|
46
|
+
// State
|
|
47
|
+
const [tip, setTip] = useState(null);
|
|
48
|
+
const [isViewerReady, setIsViewerReady] = useState(false);
|
|
49
|
+
// Refs
|
|
50
|
+
const containerNodeRef = useRef(null);
|
|
51
|
+
const highlightBindingsRef = useRef({});
|
|
52
|
+
const ghostHighlightRef = useRef(null);
|
|
53
|
+
const selectionRef = useRef(null);
|
|
54
|
+
const scrolledToHighlightIdRef = useRef(null);
|
|
55
|
+
const isAreaSelectionInProgressRef = useRef(false);
|
|
56
|
+
const isEditInProgressRef = useRef(false);
|
|
57
|
+
const updateTipPositionRef = useRef(() => { });
|
|
58
|
+
const eventBusRef = useRef(new EventBus());
|
|
59
|
+
const linkServiceRef = useRef(new PDFLinkService({
|
|
60
|
+
eventBus: eventBusRef.current,
|
|
61
|
+
externalLinkTarget: 2,
|
|
62
|
+
}));
|
|
63
|
+
const resizeObserverRef = useRef(null);
|
|
64
|
+
const viewerRef = useRef(null);
|
|
65
|
+
// Initialise PDF Viewer
|
|
66
|
+
useLayoutEffect(() => {
|
|
67
|
+
if (!containerNodeRef.current)
|
|
68
|
+
return;
|
|
69
|
+
const debouncedDocumentInit = debounce(() => {
|
|
70
|
+
viewerRef.current =
|
|
71
|
+
viewerRef.current ||
|
|
72
|
+
new PDFViewer({
|
|
73
|
+
container: containerNodeRef.current,
|
|
74
|
+
eventBus: eventBusRef.current,
|
|
75
|
+
textLayerMode: 2,
|
|
76
|
+
removePageBorders: true,
|
|
77
|
+
linkService: linkServiceRef.current,
|
|
78
|
+
});
|
|
79
|
+
viewerRef.current.setDocument(pdfDocument);
|
|
80
|
+
linkServiceRef.current.setDocument(pdfDocument);
|
|
81
|
+
linkServiceRef.current.setViewer(viewerRef.current);
|
|
82
|
+
setIsViewerReady(true);
|
|
83
|
+
}, 100);
|
|
84
|
+
debouncedDocumentInit();
|
|
85
|
+
return () => {
|
|
86
|
+
debouncedDocumentInit.cancel();
|
|
87
|
+
};
|
|
88
|
+
}, [document]);
|
|
89
|
+
// Initialise viewer event listeners
|
|
90
|
+
useLayoutEffect(() => {
|
|
91
|
+
if (!containerNodeRef.current)
|
|
92
|
+
return;
|
|
93
|
+
resizeObserverRef.current = new ResizeObserver(handleScaleValue);
|
|
94
|
+
resizeObserverRef.current.observe(containerNodeRef.current);
|
|
95
|
+
const doc = containerNodeRef.current.ownerDocument;
|
|
96
|
+
eventBusRef.current.on("textlayerrendered", renderHighlightLayers);
|
|
97
|
+
eventBusRef.current.on("pagesinit", handleScaleValue);
|
|
98
|
+
doc.addEventListener("keydown", handleKeyDown);
|
|
99
|
+
renderHighlightLayers();
|
|
100
|
+
return () => {
|
|
101
|
+
eventBusRef.current.off("pagesinit", handleScaleValue);
|
|
102
|
+
eventBusRef.current.off("textlayerrendered", renderHighlightLayers);
|
|
103
|
+
doc.removeEventListener("keydown", handleKeyDown);
|
|
104
|
+
resizeObserverRef.current?.disconnect();
|
|
105
|
+
};
|
|
106
|
+
}, [selectionTip, highlights, onSelectionFinished]);
|
|
107
|
+
// Event listeners
|
|
108
|
+
const handleScroll = () => {
|
|
109
|
+
onScrollAway && onScrollAway();
|
|
110
|
+
scrolledToHighlightIdRef.current = null;
|
|
111
|
+
renderHighlightLayers();
|
|
112
|
+
};
|
|
113
|
+
const handleMouseUp = () => {
|
|
114
|
+
const container = containerNodeRef.current;
|
|
115
|
+
const selection = getWindow(container).getSelection();
|
|
116
|
+
if (!container || !selection || selection.isCollapsed || !viewerRef.current)
|
|
117
|
+
return;
|
|
118
|
+
const range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null;
|
|
119
|
+
// Check the selected text is in the document, not the tip
|
|
120
|
+
if (!range || !container.contains(range.commonAncestorContainer))
|
|
121
|
+
return;
|
|
122
|
+
const pages = getPagesFromRange(range);
|
|
123
|
+
if (!pages || pages.length === 0)
|
|
124
|
+
return;
|
|
125
|
+
const rects = getClientRects(range, pages);
|
|
126
|
+
if (rects.length === 0)
|
|
127
|
+
return;
|
|
128
|
+
const viewportPosition = {
|
|
129
|
+
boundingRect: getBoundingRect(rects),
|
|
130
|
+
rects,
|
|
131
|
+
};
|
|
132
|
+
const scaledPosition = viewportPositionToScaled(viewportPosition, viewerRef.current);
|
|
133
|
+
const content = {
|
|
134
|
+
text: selection.toString().split("\n").join(" "), // Make all line breaks spaces
|
|
135
|
+
};
|
|
136
|
+
selectionRef.current = {
|
|
137
|
+
content,
|
|
138
|
+
type: "text",
|
|
139
|
+
position: scaledPosition,
|
|
140
|
+
makeGhostHighlight: () => {
|
|
141
|
+
ghostHighlightRef.current = {
|
|
142
|
+
content: content,
|
|
143
|
+
type: "text",
|
|
144
|
+
position: scaledPosition,
|
|
145
|
+
};
|
|
146
|
+
onCreateGhostHighlight &&
|
|
147
|
+
onCreateGhostHighlight(ghostHighlightRef.current);
|
|
148
|
+
clearTextSelection();
|
|
149
|
+
renderHighlightLayers();
|
|
150
|
+
return ghostHighlightRef.current;
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
onSelectionFinished && onSelectionFinished(selectionRef.current);
|
|
154
|
+
selectionTip &&
|
|
155
|
+
setTip({ position: viewportPosition, content: selectionTip });
|
|
156
|
+
};
|
|
157
|
+
const handleMouseDown = (event) => {
|
|
158
|
+
if (!isHTMLElement(event.target) ||
|
|
159
|
+
asElement(event.target).closest(".PdfHighlighter__tip-container") // Ignore selections on tip container
|
|
160
|
+
) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Check for freetext creation mode
|
|
164
|
+
if (enableFreetextCreation?.(event.nativeEvent) &&
|
|
165
|
+
onFreetextClick &&
|
|
166
|
+
!isEditInProgressRef.current) {
|
|
167
|
+
const target = asElement(event.target);
|
|
168
|
+
const page = getPageFromElement(target);
|
|
169
|
+
if (page && viewerRef.current) {
|
|
170
|
+
const pageRect = page.node.getBoundingClientRect();
|
|
171
|
+
const clickX = event.clientX - pageRect.left;
|
|
172
|
+
const clickY = event.clientY - pageRect.top;
|
|
173
|
+
// Default size for new freetext note
|
|
174
|
+
const defaultWidth = 150;
|
|
175
|
+
const defaultHeight = 80;
|
|
176
|
+
const viewportPosition = {
|
|
177
|
+
boundingRect: {
|
|
178
|
+
left: clickX,
|
|
179
|
+
top: clickY,
|
|
180
|
+
width: defaultWidth,
|
|
181
|
+
height: defaultHeight,
|
|
182
|
+
pageNumber: page.number,
|
|
183
|
+
},
|
|
184
|
+
rects: [],
|
|
185
|
+
};
|
|
186
|
+
const scaledPosition = viewportPositionToScaled(viewportPosition, viewerRef.current);
|
|
187
|
+
onFreetextClick(scaledPosition);
|
|
188
|
+
return; // Don't proceed with normal mousedown handling
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Check for image creation mode
|
|
192
|
+
if (enableImageCreation?.(event.nativeEvent) &&
|
|
193
|
+
onImageClick &&
|
|
194
|
+
!isEditInProgressRef.current) {
|
|
195
|
+
const target = asElement(event.target);
|
|
196
|
+
const page = getPageFromElement(target);
|
|
197
|
+
if (page && viewerRef.current) {
|
|
198
|
+
const pageRect = page.node.getBoundingClientRect();
|
|
199
|
+
const clickX = event.clientX - pageRect.left;
|
|
200
|
+
const clickY = event.clientY - pageRect.top;
|
|
201
|
+
// Default size for new image
|
|
202
|
+
const defaultWidth = 150;
|
|
203
|
+
const defaultHeight = 100;
|
|
204
|
+
const viewportPosition = {
|
|
205
|
+
boundingRect: {
|
|
206
|
+
left: clickX,
|
|
207
|
+
top: clickY,
|
|
208
|
+
width: defaultWidth,
|
|
209
|
+
height: defaultHeight,
|
|
210
|
+
pageNumber: page.number,
|
|
211
|
+
},
|
|
212
|
+
rects: [],
|
|
213
|
+
};
|
|
214
|
+
const scaledPosition = viewportPositionToScaled(viewportPosition, viewerRef.current);
|
|
215
|
+
onImageClick(scaledPosition);
|
|
216
|
+
return; // Don't proceed with normal mousedown handling
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
setTip(null);
|
|
220
|
+
clearTextSelection(); // TODO: Check if clearing text selection only if not clicking on tip breaks anything.
|
|
221
|
+
removeGhostHighlight();
|
|
222
|
+
toggleEditInProgress(false);
|
|
223
|
+
};
|
|
224
|
+
const handleKeyDown = (event) => {
|
|
225
|
+
if (event.code === "Escape") {
|
|
226
|
+
clearTextSelection();
|
|
227
|
+
removeGhostHighlight();
|
|
228
|
+
setTip(null);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
const handleScaleValue = () => {
|
|
232
|
+
if (viewerRef.current) {
|
|
233
|
+
viewerRef.current.currentScaleValue = pdfScaleValue.toString();
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
// Render Highlight layers
|
|
237
|
+
const renderHighlightLayer = (highlightBindings, pageNumber) => {
|
|
238
|
+
if (!viewerRef.current)
|
|
239
|
+
return;
|
|
240
|
+
highlightBindings.reactRoot.render(React.createElement(PdfHighlighterContext.Provider, { value: pdfHighlighterUtils },
|
|
241
|
+
React.createElement(HighlightLayer, { highlightsByPage: groupHighlightsByPage([
|
|
242
|
+
...highlights,
|
|
243
|
+
ghostHighlightRef.current,
|
|
244
|
+
]), pageNumber: pageNumber, scrolledToHighlightId: scrolledToHighlightIdRef.current, viewer: viewerRef.current, highlightBindings: highlightBindings, children: children })));
|
|
245
|
+
};
|
|
246
|
+
const renderHighlightLayers = () => {
|
|
247
|
+
if (!viewerRef.current)
|
|
248
|
+
return;
|
|
249
|
+
for (let pageNumber = 1; pageNumber <= pdfDocument.numPages; pageNumber++) {
|
|
250
|
+
const highlightBindings = highlightBindingsRef.current[pageNumber];
|
|
251
|
+
// Need to check if container is still attached to the DOM as PDF.js can unload pages.
|
|
252
|
+
if (highlightBindings?.container?.isConnected) {
|
|
253
|
+
renderHighlightLayer(highlightBindings, pageNumber);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
const { textLayer } = viewerRef.current.getPageView(pageNumber - 1) || {};
|
|
257
|
+
if (!textLayer)
|
|
258
|
+
continue; // Viewer hasn't rendered page yet
|
|
259
|
+
// textLayer.div for version >=3.0 and textLayer.textLayerDiv otherwise.
|
|
260
|
+
const highlightLayer = findOrCreateHighlightLayer(textLayer.div);
|
|
261
|
+
if (highlightLayer) {
|
|
262
|
+
const reactRoot = createRoot(highlightLayer);
|
|
263
|
+
highlightBindingsRef.current[pageNumber] = {
|
|
264
|
+
reactRoot,
|
|
265
|
+
container: highlightLayer,
|
|
266
|
+
textLayer: textLayer.div, // textLayer.div for version >=3.0 and textLayer.textLayerDiv otherwise.
|
|
267
|
+
};
|
|
268
|
+
renderHighlightLayer(highlightBindingsRef.current[pageNumber], pageNumber);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
// Utils
|
|
274
|
+
const isEditingOrHighlighting = () => {
|
|
275
|
+
return (Boolean(selectionRef.current) ||
|
|
276
|
+
Boolean(ghostHighlightRef.current) ||
|
|
277
|
+
isAreaSelectionInProgressRef.current ||
|
|
278
|
+
isEditInProgressRef.current);
|
|
279
|
+
};
|
|
280
|
+
const toggleEditInProgress = (flag) => {
|
|
281
|
+
if (flag !== undefined) {
|
|
282
|
+
isEditInProgressRef.current = flag;
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
isEditInProgressRef.current = !isEditInProgressRef.current;
|
|
286
|
+
}
|
|
287
|
+
// Disable text selection
|
|
288
|
+
if (viewerRef.current)
|
|
289
|
+
viewerRef.current.viewer?.classList.toggle("PdfHighlighter--disable-selection", isEditInProgressRef.current);
|
|
290
|
+
};
|
|
291
|
+
const removeGhostHighlight = () => {
|
|
292
|
+
if (onRemoveGhostHighlight && ghostHighlightRef.current)
|
|
293
|
+
onRemoveGhostHighlight(ghostHighlightRef.current);
|
|
294
|
+
ghostHighlightRef.current = null;
|
|
295
|
+
renderHighlightLayers();
|
|
296
|
+
};
|
|
297
|
+
const clearTextSelection = () => {
|
|
298
|
+
selectionRef.current = null;
|
|
299
|
+
const container = containerNodeRef.current;
|
|
300
|
+
const selection = getWindow(container).getSelection();
|
|
301
|
+
if (!container || !selection)
|
|
302
|
+
return;
|
|
303
|
+
selection.removeAllRanges();
|
|
304
|
+
};
|
|
305
|
+
const scrollToHighlight = (highlight) => {
|
|
306
|
+
const { boundingRect, usePdfCoordinates } = highlight.position;
|
|
307
|
+
const pageNumber = boundingRect.pageNumber;
|
|
308
|
+
// Remove scroll listener in case user auto-scrolls in succession.
|
|
309
|
+
viewerRef.current.container.removeEventListener("scroll", handleScroll);
|
|
310
|
+
const pageViewport = viewerRef.current.getPageView(pageNumber - 1).viewport;
|
|
311
|
+
viewerRef.current.scrollPageIntoView({
|
|
312
|
+
pageNumber,
|
|
313
|
+
destArray: [
|
|
314
|
+
null, // null since we pass pageNumber already as an arg
|
|
315
|
+
{ name: "XYZ" },
|
|
316
|
+
...pageViewport.convertToPdfPoint(0, // Default x coord
|
|
317
|
+
scaledToViewport(boundingRect, pageViewport, usePdfCoordinates).top -
|
|
318
|
+
SCROLL_MARGIN),
|
|
319
|
+
0, // Default z coord
|
|
320
|
+
],
|
|
321
|
+
});
|
|
322
|
+
scrolledToHighlightIdRef.current = highlight.id;
|
|
323
|
+
renderHighlightLayers();
|
|
324
|
+
// wait for scrolling to finish
|
|
325
|
+
setTimeout(() => {
|
|
326
|
+
viewerRef.current.container.addEventListener("scroll", handleScroll, {
|
|
327
|
+
once: true,
|
|
328
|
+
});
|
|
329
|
+
}, 100);
|
|
330
|
+
};
|
|
331
|
+
const pdfHighlighterUtils = {
|
|
332
|
+
isEditingOrHighlighting,
|
|
333
|
+
getCurrentSelection: () => selectionRef.current,
|
|
334
|
+
getGhostHighlight: () => ghostHighlightRef.current,
|
|
335
|
+
removeGhostHighlight,
|
|
336
|
+
toggleEditInProgress,
|
|
337
|
+
isEditInProgress: () => isEditInProgressRef.current,
|
|
338
|
+
isSelectionInProgress: () => Boolean(selectionRef.current) || isAreaSelectionInProgressRef.current,
|
|
339
|
+
scrollToHighlight,
|
|
340
|
+
getViewer: () => viewerRef.current,
|
|
341
|
+
getTip: () => tip,
|
|
342
|
+
setTip,
|
|
343
|
+
updateTipPosition: updateTipPositionRef.current,
|
|
344
|
+
};
|
|
345
|
+
utilsRef(pdfHighlighterUtils);
|
|
346
|
+
// Check if freetext or image mode is active for cursor styling
|
|
347
|
+
const isFreetextMode = enableFreetextCreation?.({}) ?? false;
|
|
348
|
+
const isImageMode = enableImageCreation?.({}) ?? false;
|
|
349
|
+
// Build class name based on active modes
|
|
350
|
+
let containerClassName = 'PdfHighlighter';
|
|
351
|
+
if (isFreetextMode)
|
|
352
|
+
containerClassName += ' PdfHighlighter--freetext-mode';
|
|
353
|
+
if (isImageMode)
|
|
354
|
+
containerClassName += ' PdfHighlighter--image-mode';
|
|
355
|
+
if (enableDrawingMode)
|
|
356
|
+
containerClassName += ' PdfHighlighter--drawing-mode';
|
|
357
|
+
if (enableShapeMode)
|
|
358
|
+
containerClassName += ' PdfHighlighter--shape-mode';
|
|
359
|
+
if (areaSelectionMode)
|
|
360
|
+
containerClassName += ' PdfHighlighter--area-mode';
|
|
361
|
+
return (React.createElement(PdfHighlighterContext.Provider, { value: pdfHighlighterUtils },
|
|
362
|
+
React.createElement("div", { ref: containerNodeRef, className: containerClassName, onPointerDown: handleMouseDown, onPointerUp: handleMouseUp, style: style },
|
|
363
|
+
React.createElement("div", { className: "pdfViewer" }),
|
|
364
|
+
React.createElement("style", null, `
|
|
365
|
+
.textLayer ::selection {
|
|
366
|
+
background: ${textSelectionColor};
|
|
367
|
+
}
|
|
368
|
+
`),
|
|
369
|
+
isViewerReady && (React.createElement(TipContainer, { viewer: viewerRef.current, updateTipPositionRef: updateTipPositionRef })),
|
|
370
|
+
isViewerReady && enableAreaSelection && (React.createElement(MouseSelection, { viewer: viewerRef.current, onChange: (isVisible) => (isAreaSelectionInProgressRef.current = isVisible), enableAreaSelection: enableAreaSelection, style: mouseSelectionStyle, onDragStart: () => disableTextSelection(viewerRef.current, true), onReset: () => {
|
|
371
|
+
selectionRef.current = null;
|
|
372
|
+
disableTextSelection(viewerRef.current, false);
|
|
373
|
+
}, onSelection: (viewportPosition, scaledPosition, image, resetSelection) => {
|
|
374
|
+
selectionRef.current = {
|
|
375
|
+
content: { image },
|
|
376
|
+
type: "area",
|
|
377
|
+
position: scaledPosition,
|
|
378
|
+
makeGhostHighlight: () => {
|
|
379
|
+
ghostHighlightRef.current = {
|
|
380
|
+
position: scaledPosition,
|
|
381
|
+
type: "area",
|
|
382
|
+
content: { image },
|
|
383
|
+
};
|
|
384
|
+
onCreateGhostHighlight &&
|
|
385
|
+
onCreateGhostHighlight(ghostHighlightRef.current);
|
|
386
|
+
resetSelection();
|
|
387
|
+
renderHighlightLayers();
|
|
388
|
+
return ghostHighlightRef.current;
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
onSelectionFinished && onSelectionFinished(selectionRef.current);
|
|
392
|
+
selectionTip &&
|
|
393
|
+
setTip({ position: viewportPosition, content: selectionTip });
|
|
394
|
+
} })),
|
|
395
|
+
isViewerReady && enableDrawingMode && (React.createElement(DrawingCanvas, { isActive: enableDrawingMode, strokeColor: drawingStrokeColor, strokeWidth: drawingStrokeWidth, viewer: viewerRef.current, onComplete: (dataUrl, position, strokes) => {
|
|
396
|
+
console.log("PdfHighlighter: Drawing complete");
|
|
397
|
+
onDrawingComplete?.(dataUrl, position, strokes);
|
|
398
|
+
}, onCancel: () => {
|
|
399
|
+
console.log("PdfHighlighter: Drawing cancelled");
|
|
400
|
+
onDrawingCancel?.();
|
|
401
|
+
} })),
|
|
402
|
+
isViewerReady && enableShapeMode && (React.createElement(ShapeCanvas, { isActive: !!enableShapeMode, shapeType: enableShapeMode, strokeColor: shapeStrokeColor, strokeWidth: shapeStrokeWidth, viewer: viewerRef.current, onComplete: (position, shape) => {
|
|
403
|
+
console.log("PdfHighlighter: Shape complete", shape.shapeType);
|
|
404
|
+
onShapeComplete?.(position, shape);
|
|
405
|
+
}, onCancel: () => {
|
|
406
|
+
console.log("PdfHighlighter: Shape cancelled");
|
|
407
|
+
onShapeCancel?.();
|
|
408
|
+
} })))));
|
|
409
|
+
};
|
|
410
|
+
//# sourceMappingURL=PdfHighlighter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfHighlighter.js","sourceRoot":"","sources":["../../../src/components/PdfHighlighter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React, { ReactNode } from "react";
|
|
2
|
+
import { OnProgressParameters, type PDFDocumentProxy } from "pdfjs-dist";
|
|
3
|
+
import { DocumentInitParameters, TypedArray } from "pdfjs-dist/types/src/display/api";
|
|
4
|
+
/**
|
|
5
|
+
* The props type for {@link PdfLoader}.
|
|
6
|
+
*
|
|
7
|
+
* @category Component Properties
|
|
8
|
+
*/
|
|
9
|
+
export interface PdfLoaderProps {
|
|
10
|
+
/**
|
|
11
|
+
* The document to be loaded by PDF.js.
|
|
12
|
+
* If you need to pass HTTP headers, auth parameters,
|
|
13
|
+
* or other pdf settings, do it through here.
|
|
14
|
+
*/
|
|
15
|
+
document: string | URL | TypedArray | DocumentInitParameters;
|
|
16
|
+
/**
|
|
17
|
+
* Callback to render content before the PDF document is loaded.
|
|
18
|
+
*
|
|
19
|
+
* @param progress - PDF.js progress status.
|
|
20
|
+
* @returns - Component to be rendered in space of the PDF document while loading.
|
|
21
|
+
*/
|
|
22
|
+
beforeLoad?(progress: OnProgressParameters): ReactNode;
|
|
23
|
+
/**
|
|
24
|
+
* Component to render in the case of any PDF loading errors.
|
|
25
|
+
*
|
|
26
|
+
* @param error - PDF loading error.
|
|
27
|
+
* @returns - Component to be rendered in space of the PDF document.
|
|
28
|
+
*/
|
|
29
|
+
errorMessage?(error: Error): ReactNode;
|
|
30
|
+
/**
|
|
31
|
+
* Child components to use/render the loaded PDF document.
|
|
32
|
+
*
|
|
33
|
+
* @param pdfDocument - The loaded PDF document.
|
|
34
|
+
* @returns - Component to render once PDF document is loaded.
|
|
35
|
+
*/
|
|
36
|
+
children(pdfDocument: PDFDocumentProxy): ReactNode;
|
|
37
|
+
/**
|
|
38
|
+
* Callback triggered whenever an error occurs.
|
|
39
|
+
*
|
|
40
|
+
* @param error - PDF Loading error triggering the event.
|
|
41
|
+
* @returns - Component to be rendered in space of the PDF document.
|
|
42
|
+
*/
|
|
43
|
+
onError?(error: Error): void;
|
|
44
|
+
/**
|
|
45
|
+
* NOTE: This will be applied to all PdfLoader instances.
|
|
46
|
+
* If you want to only apply a source to this instance, use the document parameters.
|
|
47
|
+
*/
|
|
48
|
+
workerSrc?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A component for loading a PDF document and passing it to a child.
|
|
52
|
+
*
|
|
53
|
+
* @category Component
|
|
54
|
+
*/
|
|
55
|
+
export declare const PdfLoader: ({ document, beforeLoad, errorMessage, children, onError, workerSrc, }: PdfLoaderProps) => React.ReactNode;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
2
|
+
import { GlobalWorkerOptions, getDocument } from "pdfjs-dist";
|
|
3
|
+
const DEFAULT_BEFORE_LOAD = (progress) => (React.createElement("div", { style: { color: "black" } },
|
|
4
|
+
"Loading ",
|
|
5
|
+
Math.floor((progress.loaded / progress.total) * 100),
|
|
6
|
+
"%"));
|
|
7
|
+
const DEFAULT_ERROR_MESSAGE = (error) => (React.createElement("div", { style: { color: "black" } }, error.message));
|
|
8
|
+
const DEFAULT_ON_ERROR = (error) => {
|
|
9
|
+
throw new Error(`Error loading PDF document: ${error.message}!`);
|
|
10
|
+
};
|
|
11
|
+
const DEFAULT_WORKER_SRC = "https://unpkg.com/pdfjs-dist@4.4.168/build/pdf.worker.min.mjs";
|
|
12
|
+
/**
|
|
13
|
+
* A component for loading a PDF document and passing it to a child.
|
|
14
|
+
*
|
|
15
|
+
* @category Component
|
|
16
|
+
*/
|
|
17
|
+
export const PdfLoader = ({ document, beforeLoad = DEFAULT_BEFORE_LOAD, errorMessage = DEFAULT_ERROR_MESSAGE, children, onError = DEFAULT_ON_ERROR, workerSrc = DEFAULT_WORKER_SRC, }) => {
|
|
18
|
+
const pdfLoadingTaskRef = useRef(null);
|
|
19
|
+
const pdfDocumentRef = useRef(null);
|
|
20
|
+
const [error, setError] = useState(null);
|
|
21
|
+
const [loadingProgress, setLoadingProgress] = useState(null);
|
|
22
|
+
// Intitialise document
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
GlobalWorkerOptions.workerSrc = workerSrc;
|
|
25
|
+
pdfLoadingTaskRef.current = getDocument(document);
|
|
26
|
+
pdfLoadingTaskRef.current.onProgress = (progress) => {
|
|
27
|
+
setLoadingProgress(progress.loaded > progress.total ? null : progress);
|
|
28
|
+
};
|
|
29
|
+
pdfLoadingTaskRef.current.promise
|
|
30
|
+
.then((pdfDocument) => {
|
|
31
|
+
pdfDocumentRef.current = pdfDocument;
|
|
32
|
+
})
|
|
33
|
+
.catch((error) => {
|
|
34
|
+
if (error.message != "Worker was destroyed") {
|
|
35
|
+
setError(error);
|
|
36
|
+
onError(error);
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
.finally(() => {
|
|
40
|
+
setLoadingProgress(null);
|
|
41
|
+
});
|
|
42
|
+
return () => {
|
|
43
|
+
if (pdfLoadingTaskRef.current) {
|
|
44
|
+
pdfLoadingTaskRef.current.destroy();
|
|
45
|
+
}
|
|
46
|
+
if (pdfDocumentRef.current) {
|
|
47
|
+
pdfDocumentRef.current.destroy();
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}, [document]);
|
|
51
|
+
return error
|
|
52
|
+
? errorMessage(error)
|
|
53
|
+
: loadingProgress
|
|
54
|
+
? beforeLoad(loadingProgress)
|
|
55
|
+
: pdfDocumentRef.current && children(pdfDocumentRef.current);
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=PdfLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfLoader.js","sourceRoot":"","sources":["../../../src/components/PdfLoader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAa,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAwB,WAAW,EAAsD,MAAM,YAAY,CAAC;AAGxI,MAAM,mBAAmB,GAAG,CAAC,QAA8B,EAAE,EAAE,CAAC,CAC9D,6BAAK,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;;IACnB,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;QACzD,CACP,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,CAC9C,6BAAK,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAG,KAAK,CAAC,OAAO,CAAO,CACtD,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAAE,EAAE;IACxC,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,kBAAkB,GACtB,+DAA+D,CAAC;AAsDlE;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,QAAQ,EACR,UAAU,GAAG,mBAAmB,EAChC,YAAY,GAAG,qBAAqB,EACpC,QAAQ,EACR,OAAO,GAAG,gBAAgB,EAC1B,SAAS,GAAG,kBAAkB,GACf,EAAE,EAAE;IACnB,MAAM,iBAAiB,GAAG,MAAM,CAAgC,IAAI,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IAE7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GACzC,QAAQ,CAA8B,IAAI,CAAC,CAAC;IAE9C,uBAAuB;IACvB,SAAS,CAAC,GAAG,EAAE;QACb,mBAAmB,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1C,iBAAiB,CAAC,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClD,iBAAiB,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,QAA8B,EAAE,EAAE;YACxE,kBAAkB,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC,CAAC;QAEF,iBAAiB,CAAC,OAAO,CAAC,OAAO;aAC9B,IAAI,CAAC,CAAC,WAA6B,EAAE,EAAE;YACtC,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;QACvC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;YACtB,IAAI,KAAK,CAAC,OAAO,IAAI,sBAAsB,EAAE,CAAC;gBAC5C,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE;YACV,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACtC,CAAC;YAED,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACnC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,KAAK;QACV,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;QACrB,CAAC,CAAC,eAAe;YACf,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC;YAC7B,CAAC,CAAC,cAAc,CAAC,OAAO,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACnE,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ShapeType, ShapeData, ScaledPosition } from "../types";
|
|
3
|
+
import "../style/ShapeCanvas.css";
|
|
4
|
+
import type { PDFViewer as TPDFViewer } from "pdfjs-dist/web/pdf_viewer.mjs";
|
|
5
|
+
/**
|
|
6
|
+
* The props type for {@link ShapeCanvas}.
|
|
7
|
+
*
|
|
8
|
+
* @category Component Properties
|
|
9
|
+
*/
|
|
10
|
+
export interface ShapeCanvasProps {
|
|
11
|
+
/**
|
|
12
|
+
* Whether shape mode is active.
|
|
13
|
+
*/
|
|
14
|
+
isActive: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The type of shape to create.
|
|
17
|
+
*/
|
|
18
|
+
shapeType: ShapeType;
|
|
19
|
+
/**
|
|
20
|
+
* Stroke color for the shape.
|
|
21
|
+
* @default "#000000"
|
|
22
|
+
*/
|
|
23
|
+
strokeColor?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Stroke width for the shape.
|
|
26
|
+
* @default 2
|
|
27
|
+
*/
|
|
28
|
+
strokeWidth?: number;
|
|
29
|
+
/**
|
|
30
|
+
* The PDF viewer instance.
|
|
31
|
+
*/
|
|
32
|
+
viewer: InstanceType<typeof TPDFViewer>;
|
|
33
|
+
/**
|
|
34
|
+
* Callback when shape creation is complete.
|
|
35
|
+
*
|
|
36
|
+
* @param position - Scaled position of the shape on the page.
|
|
37
|
+
* @param shape - The shape data.
|
|
38
|
+
*/
|
|
39
|
+
onComplete: (position: ScaledPosition, shape: ShapeData) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Callback when shape creation is cancelled.
|
|
42
|
+
*/
|
|
43
|
+
onCancel: () => void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A transparent overlay for creating shape annotations on PDF pages.
|
|
47
|
+
* Supports mouse and touch input with click-and-drag to define shape bounds.
|
|
48
|
+
*
|
|
49
|
+
* @category Component
|
|
50
|
+
*/
|
|
51
|
+
export declare const ShapeCanvas: ({ isActive, shapeType, strokeColor, strokeWidth, viewer, onComplete, onCancel, }: ShapeCanvasProps) => React.JSX.Element | null;
|