lib-firas-digi 0.0.1

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.
@@ -0,0 +1,420 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, Component, EventEmitter, Output, ViewChild, ViewEncapsulation, Input } from '@angular/core';
3
+ import * as i1 from 'ngx-extended-pdf-viewer';
4
+ import { pdfDefaultOptions, NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer';
5
+ import { PDFDocument } from 'pdf-lib';
6
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
7
+ import * as i2 from '@angular/common';
8
+ import { NgIf, CommonModule, NgFor } from '@angular/common';
9
+ import SignaturePad from 'signature_pad';
10
+ import * as i1$1 from '@angular/router';
11
+
12
+ class LibFirasDigiService {
13
+ constructor() { }
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibFirasDigiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
15
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibFirasDigiService, providedIn: 'root' });
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibFirasDigiService, decorators: [{
18
+ type: Injectable,
19
+ args: [{
20
+ providedIn: 'root'
21
+ }]
22
+ }], ctorParameters: () => [] });
23
+
24
+ class LibFirasDigiComponent {
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibFirasDigiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: LibFirasDigiComponent, isStandalone: true, selector: "lib-lib-firas-digi", ngImport: i0, template: `
27
+ <p>
28
+ lib-firas-digi works!
29
+ </p>
30
+ `, isInline: true, styles: [""] });
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibFirasDigiComponent, decorators: [{
33
+ type: Component,
34
+ args: [{ selector: 'lib-lib-firas-digi', standalone: true, imports: [], template: `
35
+ <p>
36
+ lib-firas-digi works!
37
+ </p>
38
+ ` }]
39
+ }] });
40
+
41
+ class PdfSignatureComponent {
42
+ signaturePad;
43
+ activeTab = 'upload';
44
+ canvas;
45
+ closed = new EventEmitter();
46
+ selectedFile;
47
+ previewUrl = null;
48
+ fileName = '';
49
+ isImage = false;
50
+ ngAfterViewInit() {
51
+ if (this.activeTab === 'draw' && this.canvas) {
52
+ this.initSignaturePad();
53
+ }
54
+ }
55
+ initSignaturePad() {
56
+ if (!this.canvas)
57
+ return;
58
+ this.signaturePad = new SignaturePad(this.canvas.nativeElement, {
59
+ minWidth: 1,
60
+ penColor: 'black',
61
+ });
62
+ }
63
+ setActiveTab(tab) {
64
+ this.activeTab = tab;
65
+ if (tab === 'draw') {
66
+ setTimeout(() => {
67
+ this.initSignaturePad();
68
+ });
69
+ }
70
+ }
71
+ saveSignature() {
72
+ let base64 = null;
73
+ if (this.signaturePad && !this.signaturePad.isEmpty()) {
74
+ base64 = this.signaturePad.toDataURL();
75
+ }
76
+ if (this.previewUrl) {
77
+ base64 = this.previewUrl;
78
+ }
79
+ if (!base64) {
80
+ return;
81
+ }
82
+ this.closed.emit({ confirmed: true, image: base64 });
83
+ }
84
+ clear() {
85
+ this.signaturePad.clear();
86
+ }
87
+ onDragOver(event) {
88
+ event.preventDefault();
89
+ event.stopPropagation();
90
+ }
91
+ onDragLeave(event) {
92
+ event.preventDefault();
93
+ event.stopPropagation();
94
+ }
95
+ onDrop(event) {
96
+ event.preventDefault();
97
+ event.stopPropagation();
98
+ if (event.dataTransfer && event.dataTransfer.files.length > 0) {
99
+ this.handleFile(event.dataTransfer.files[0]);
100
+ }
101
+ }
102
+ onFileSelected(event) {
103
+ const file = event.target.files[0];
104
+ if (file) {
105
+ this.handleFile(file);
106
+ }
107
+ }
108
+ handleFile(file) {
109
+ this.selectedFile = file;
110
+ this.fileName = file.name;
111
+ this.isImage = file.type.startsWith('image/');
112
+ const reader = new FileReader();
113
+ reader.onload = () => {
114
+ this.previewUrl = reader.result;
115
+ };
116
+ reader.readAsDataURL(file);
117
+ }
118
+ uploadFile() {
119
+ if (!this.selectedFile)
120
+ return;
121
+ const formData = new FormData();
122
+ formData.append('file', this.selectedFile);
123
+ }
124
+ close(confirmed = false) {
125
+ this.closed.emit({ confirmed });
126
+ }
127
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfSignatureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
128
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: PdfSignatureComponent, isStandalone: true, selector: "app-pdf-signature", outputs: { closed: "closed" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true }], ngImport: i0, template: "<div class=\"dialog-wrapper\" style=\"background: white;\">\r\n\r\n <div class=\"tabs-header flex\">\r\n <button type=\"button\" [class.active]=\"activeTab === 'upload'\" (click)=\"setActiveTab('upload')\" class=\"tab-btn\">\r\n UPLOAD\r\n </button>\r\n <button type=\"button\" [class.active]=\"activeTab === 'draw'\" (click)=\"setActiveTab('draw')\" class=\"tab-btn\">\r\n DRAW\r\n </button>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"activeTab === 'upload'\" class=\"tab-content\">\r\n <div class=\"drop-zone px-2\" [class.with-image]=\"previewUrl\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"$event.stopPropagation()\">\r\n <span>Drag and drop here</span>\r\n <ng-container *ngIf=\"previewUrl\">\r\n <img *ngIf=\"isImage\" [src]=\"previewUrl\" class=\"preview-img\" />\r\n <p *ngIf=\"!isImage\">{{ fileName }}</p>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!previewUrl\">\r\n <input type=\"file\" (change)=\"onFileSelected($event)\" class=\"input_files\"/>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab === 'draw'\" class=\"tab-content\">\r\n <div class=\"signature-container\">\r\n <canvas #canvas width=\"450\" height=\"150\" style=\"width: 99%; border: 1px solid #ccc;\"></canvas>\r\n </div>\r\n <button type=\"button\" (click)=\"clear()\" mat-flat-button color=\"primary\">\r\n X\r\n </button>\r\n </div>\r\n\r\n <div class=\"dialog-footer mx-2\">\r\n <div class=\"buttons-row\">\r\n <div class=\"buttons-row\">\r\n <button type=\"button\" class=\"btn btn-cancel\" (click)=\"close(false)\">\r\n Close\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveSignature()\">\r\n SIGN\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: [".signature-container{background:#fff}canvas{background:transparent!important}.dialog-wrapper{display:flex;flex-direction:column;height:100%;min-height:100%}.tabs-container{flex:1 1 auto;overflow-y:auto}.dialog-footer{padding:10px 10px 10px 30px;border-top:1px solid #ddd;display:flex;justify-content:flex-end;position:sticky;bottom:0}.buttons-row{display:flex;justify-content:space-between;width:30%;gap:10px}.drop-zone{width:98%;height:200px;border:2px dashed #888;border-radius:10px;text-align:center;position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;padding:4px}.drop-zone.with-image{border:2px solid #888}.drop-zone.dragover{background:#e0f3ff;border-color:#2196f3}.preview-img{width:100%;height:100%;object-fit:contain}.footer{display:flex;justify-content:space-between;border-top:1px solid #ddd;padding:10px}.preview{width:100%;margin-top:10px}.signature-container canvas{width:100%}.input_files{padding-right:120px!important}.tabs-header{display:flex;border-bottom:1px solid #ccc;margin-bottom:8px}.tab-btn{padding:8px 16px;border:none;background:none;cursor:pointer}.tab-btn.active{border-bottom:2px solid #1976d2;font-weight:700}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type:
129
+ // RouterModule,
130
+ ReactiveFormsModule }], encapsulation: i0.ViewEncapsulation.None });
131
+ }
132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfSignatureComponent, decorators: [{
133
+ type: Component,
134
+ args: [{ selector: 'app-pdf-signature', imports: [
135
+ NgIf,
136
+ CommonModule,
137
+ FormsModule,
138
+ // RouterModule,
139
+ ReactiveFormsModule,
140
+ ], standalone: true, encapsulation: ViewEncapsulation.None, template: "<div class=\"dialog-wrapper\" style=\"background: white;\">\r\n\r\n <div class=\"tabs-header flex\">\r\n <button type=\"button\" [class.active]=\"activeTab === 'upload'\" (click)=\"setActiveTab('upload')\" class=\"tab-btn\">\r\n UPLOAD\r\n </button>\r\n <button type=\"button\" [class.active]=\"activeTab === 'draw'\" (click)=\"setActiveTab('draw')\" class=\"tab-btn\">\r\n DRAW\r\n </button>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"activeTab === 'upload'\" class=\"tab-content\">\r\n <div class=\"drop-zone px-2\" [class.with-image]=\"previewUrl\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"$event.stopPropagation()\">\r\n <span>Drag and drop here</span>\r\n <ng-container *ngIf=\"previewUrl\">\r\n <img *ngIf=\"isImage\" [src]=\"previewUrl\" class=\"preview-img\" />\r\n <p *ngIf=\"!isImage\">{{ fileName }}</p>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!previewUrl\">\r\n <input type=\"file\" (change)=\"onFileSelected($event)\" class=\"input_files\"/>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab === 'draw'\" class=\"tab-content\">\r\n <div class=\"signature-container\">\r\n <canvas #canvas width=\"450\" height=\"150\" style=\"width: 99%; border: 1px solid #ccc;\"></canvas>\r\n </div>\r\n <button type=\"button\" (click)=\"clear()\" mat-flat-button color=\"primary\">\r\n X\r\n </button>\r\n </div>\r\n\r\n <div class=\"dialog-footer mx-2\">\r\n <div class=\"buttons-row\">\r\n <div class=\"buttons-row\">\r\n <button type=\"button\" class=\"btn btn-cancel\" (click)=\"close(false)\">\r\n Close\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveSignature()\">\r\n SIGN\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: [".signature-container{background:#fff}canvas{background:transparent!important}.dialog-wrapper{display:flex;flex-direction:column;height:100%;min-height:100%}.tabs-container{flex:1 1 auto;overflow-y:auto}.dialog-footer{padding:10px 10px 10px 30px;border-top:1px solid #ddd;display:flex;justify-content:flex-end;position:sticky;bottom:0}.buttons-row{display:flex;justify-content:space-between;width:30%;gap:10px}.drop-zone{width:98%;height:200px;border:2px dashed #888;border-radius:10px;text-align:center;position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;padding:4px}.drop-zone.with-image{border:2px solid #888}.drop-zone.dragover{background:#e0f3ff;border-color:#2196f3}.preview-img{width:100%;height:100%;object-fit:contain}.footer{display:flex;justify-content:space-between;border-top:1px solid #ddd;padding:10px}.preview{width:100%;margin-top:10px}.signature-container canvas{width:100%}.input_files{padding-right:120px!important}.tabs-header{display:flex;border-bottom:1px solid #ccc;margin-bottom:8px}.tab-btn{padding:8px 16px;border:none;background:none;cursor:pointer}.tab-btn.active{border-bottom:2px solid #1976d2;font-weight:700}\n"] }]
141
+ }], propDecorators: { canvas: [{
142
+ type: ViewChild,
143
+ args: ['canvas', { static: false }]
144
+ }], closed: [{
145
+ type: Output
146
+ }] } });
147
+
148
+ class PdfInfoComponent {
149
+ signatureImg;
150
+ floatingSignature;
151
+ pdfSrc = '';
152
+ imageDataURL = '';
153
+ pdfBlocked = true;
154
+ sidebarOpen = true;
155
+ signMode = false;
156
+ showSignature = true;
157
+ signatureLoaded = false;
158
+ signatures = [];
159
+ zoom = 100;
160
+ showDialog = false;
161
+ currentPdfBytes;
162
+ constructor() {
163
+ pdfDefaultOptions.textLayerMode = 1;
164
+ }
165
+ ngAfterViewInit() {
166
+ // ViewChild references are now available after view initialization
167
+ // Access them here if needed
168
+ }
169
+ async onFileSelected(event) {
170
+ const input = event.target;
171
+ if (!input.files || input.files.length === 0)
172
+ return;
173
+ const file = input.files[0];
174
+ const arrayBuffer = await file.arrayBuffer();
175
+ this.currentPdfBytes = new Uint8Array(arrayBuffer);
176
+ this.pdfSrc = URL.createObjectURL(file);
177
+ }
178
+ addSignature() {
179
+ this.showDialog = true;
180
+ }
181
+ onDialogClosed(event) {
182
+ this.showDialog = false;
183
+ if (event.confirmed && event.image) {
184
+ this.imageDataURL = event.image;
185
+ this.signMode = true;
186
+ }
187
+ }
188
+ onPdfClick(event) {
189
+ const target = event.target;
190
+ if (target.closest('.signature-box'))
191
+ return;
192
+ if (!this.signMode || !this.imageDataURL)
193
+ return;
194
+ const pageEl = event.target.closest('.page');
195
+ if (!pageEl)
196
+ return;
197
+ const pageNumber = Number(pageEl.dataset['pageNumber']);
198
+ const pageRect = pageEl.getBoundingClientRect();
199
+ const transform = getComputedStyle(pageEl).transform;
200
+ const scale = transform && transform !== 'none'
201
+ ? new DOMMatrixReadOnly(transform).a
202
+ : 1;
203
+ const domX = event.clientX - pageRect.left;
204
+ const domY = event.clientY - pageRect.top;
205
+ const width = (pageRect.width / scale) * 0.15;
206
+ const height = width * 0.35;
207
+ const sig = { pageNumber, domX, domY, width, height };
208
+ this.signatures.push(sig);
209
+ this.createDraggableSignatureBox(sig);
210
+ this.signMode = false;
211
+ }
212
+ createDraggableSignatureBox(sig) {
213
+ const pageEl = document.querySelector(`.pdfViewer .page[data-page-number="${sig.pageNumber}"]`);
214
+ if (!pageEl)
215
+ return;
216
+ pageEl.style.position = 'relative';
217
+ const box = document.createElement('div');
218
+ box.className = 'signature-box';
219
+ box.style.position = 'absolute';
220
+ box.style.left = `${sig.domX}px`;
221
+ box.style.top = `${sig.domY}px`;
222
+ box.style.width = `${sig.width}px`;
223
+ box.style.height = `${sig.height}px`;
224
+ box.style.zIndex = '9999';
225
+ box.style.border = '2px dashed #1976d2';
226
+ box.style.background = 'rgba(25, 118, 210, 0.05)';
227
+ const img = document.createElement('img');
228
+ img.src = this.imageDataURL;
229
+ img.style.width = '100%';
230
+ img.style.height = '100%';
231
+ img.style.pointerEvents = 'none';
232
+ const handle = document.createElement('div');
233
+ handle.classList.add('resize-handle');
234
+ handle.style.position = 'absolute';
235
+ handle.style.right = '-7px';
236
+ handle.style.bottom = '-7px';
237
+ handle.style.width = '18px';
238
+ handle.style.height = '18px';
239
+ handle.style.backgroundColor = 'rgba(25, 118, 210, 0.2)';
240
+ handle.style.border = '2px solid rgba(25, 118, 210, 0.9)';
241
+ handle.style.borderRadius = '4px';
242
+ handle.style.cursor = 'se-resize';
243
+ handle.style.zIndex = '10000';
244
+ handle.textContent = '+';
245
+ box.appendChild(img);
246
+ box.appendChild(handle);
247
+ pageEl.appendChild(box);
248
+ this.makeDraggable(box, pageEl, sig);
249
+ this.makeResizable(box, sig);
250
+ }
251
+ makeDraggable(box, container, sig) {
252
+ let startX = 0;
253
+ let startY = 0;
254
+ let origX = 0;
255
+ let origY = 0;
256
+ box.addEventListener('pointerdown', (e) => {
257
+ if (e.target.classList.contains('resize-handle'))
258
+ return;
259
+ e.preventDefault();
260
+ e.stopPropagation();
261
+ box.setPointerCapture(e.pointerId);
262
+ startX = e.clientX;
263
+ startY = e.clientY;
264
+ origX = box.offsetLeft;
265
+ origY = box.offsetTop;
266
+ const scale = this.getPdfScale(container);
267
+ const move = (ev) => {
268
+ const dx = (ev.clientX - startX) / scale;
269
+ const dy = (ev.clientY - startY) / scale;
270
+ box.style.left = origX + dx + 'px';
271
+ box.style.top = origY + dy + 'px';
272
+ sig.domX = origX + dx;
273
+ sig.domY = origY + dy;
274
+ };
275
+ const up = () => {
276
+ box.releasePointerCapture(e.pointerId);
277
+ document.removeEventListener('pointermove', move);
278
+ document.removeEventListener('pointerup', up);
279
+ };
280
+ document.addEventListener('pointermove', move);
281
+ document.addEventListener('pointerup', up);
282
+ });
283
+ }
284
+ makeResizable(box, sig) {
285
+ const handle = box.querySelector('.resize-handle');
286
+ if (!handle)
287
+ return;
288
+ handle.addEventListener('pointerdown', (e) => {
289
+ e.preventDefault();
290
+ e.stopPropagation();
291
+ handle.setPointerCapture(e.pointerId);
292
+ const startX = e.clientX;
293
+ const startWidth = sig.width;
294
+ const move = (ev) => {
295
+ const dx = ev.clientX - startX;
296
+ const newWidth = Math.max(60, startWidth + dx);
297
+ const newHeight = newWidth * 0.35;
298
+ sig.width = newWidth;
299
+ sig.height = newHeight;
300
+ box.style.width = newWidth + 'px';
301
+ box.style.height = newHeight + 'px';
302
+ };
303
+ const up = () => {
304
+ handle.releasePointerCapture(e.pointerId);
305
+ document.removeEventListener('pointermove', move);
306
+ document.removeEventListener('pointerup', up);
307
+ };
308
+ document.addEventListener('pointermove', move);
309
+ document.addEventListener('pointerup', up);
310
+ });
311
+ }
312
+ getPdfScale(pageEl) {
313
+ const transform = getComputedStyle(pageEl).transform;
314
+ return transform && transform !== 'none'
315
+ ? new DOMMatrixReadOnly(transform).a
316
+ : 1;
317
+ }
318
+ async addAllSignaturesToPdf() {
319
+ if (!this.signatures.length || !this.imageDataURL)
320
+ return;
321
+ const existingPdfBytes = await fetch(this.pdfSrc).then(res => res.arrayBuffer());
322
+ const pdfDoc = await PDFDocument.load(existingPdfBytes);
323
+ const pages = pdfDoc.getPages();
324
+ const base64Data = this.imageDataURL.split(',')[1];
325
+ const imageBytes = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));
326
+ const pngImage = await pdfDoc.embedPng(imageBytes);
327
+ for (const sig of this.signatures) {
328
+ const page = pages[sig.pageNumber - 1];
329
+ if (!page)
330
+ continue;
331
+ const pageEl = document.querySelector(`.pdfViewer .page[data-page-number="${sig.pageNumber}"]`);
332
+ const pageRect = pageEl.getBoundingClientRect();
333
+ const scale = pageRect.width / page.getWidth();
334
+ const pdfX = sig.domX / scale;
335
+ const pdfY = page.getHeight() - sig.domY / scale - sig.height / scale;
336
+ const pdfW = sig.width / scale;
337
+ const pdfH = sig.height / scale;
338
+ page.drawImage(pngImage, {
339
+ x: pdfX,
340
+ y: pdfY,
341
+ width: pdfW,
342
+ height: pdfH
343
+ });
344
+ }
345
+ const pdfBytes = await pdfDoc.save();
346
+ const pdfBytesNormal = new Uint8Array(pdfBytes);
347
+ const blob = new Blob([pdfBytesNormal], { type: 'application/pdf' });
348
+ this.pdfSrc = URL.createObjectURL(blob);
349
+ }
350
+ finalizeSignature() {
351
+ this.signMode = false;
352
+ }
353
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
354
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: PdfInfoComponent, isStandalone: true, selector: "app-pdf-info", inputs: { pdfSrc: "pdfSrc" }, viewQueries: [{ propertyName: "signatureImg", first: true, predicate: ["signatureImg"], descendants: true }, { propertyName: "floatingSignature", first: true, predicate: ["floatingSignature"], descendants: true }], ngImport: i0, template: "<div>\r\n <img #signatureImg [src]=\"imageDataURL || ''\" style=\"display: none; position: absolute; visibility: hidden; width: 0; height: 0;\" />\r\n <img #floatingSignature [src]=\"imageDataURL || ''\" style=\"display: none; position: absolute; visibility: hidden; width: 0; height: 0;\" />\r\n \r\n <!-- <button *ngIf=\"pdfSrc\" (click)=\"showCoordinates()\">Show Coordinates</button> -->\r\n <button *ngIf=\"pdfSrc\" (click)=\"addSignature()\">Add Signature</button>\r\n <button *ngIf=\"pdfSrc\" (click)=\"addAllSignaturesToPdf()\">Save Signature</button>\r\n <input type=\"file\" (change)=\"onFileSelected($event)\" accept=\"application/pdf\" />\r\n\r\n <div class=\"popup-backdrop\" *ngIf=\"showDialog\">\r\n <app-pdf-signature\r\n class=\"popup-content\"\r\n (click)=\"$event.stopPropagation()\"\r\n (closed)=\"onDialogClosed($event)\">\r\n </app-pdf-signature>\r\n </div>\r\n\r\n <div class=\"container\" [hidden]=\"!pdfSrc\">\r\n <div class=\"content\">\r\n <ngx-extended-pdf-viewer\r\n [src]=\"pdfSrc\"\r\n [textLayer]=\"false\"\r\n [page]=\"0\"\r\n [(zoom)]=\"zoom\"\r\n [showHandToolButton]=\"true\"\r\n [showOpenFileButton]=\"false\"\r\n [enableDragAndDrop]=\"false\"\r\n (click)=\"onPdfClick($event)\">\r\n</ngx-extended-pdf-viewer>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".container,.content{position:relative}.signature-box{position:absolute;border:2px dashed #1976d2;cursor:move;box-sizing:border-box;background:#1976d20d;z-index:9999}.signature-box img{width:100%;height:100%;pointer-events:none}.resize-handle{position:absolute;width:18px;height:18px;right:-9px;bottom:-9px;background:#1976d233;border:2px solid rgba(25,118,210,.9);border-radius:4px;display:flex;align-items:center;justify-content:center;font-weight:700;cursor:se-resize;-webkit-user-select:none;user-select:none;z-index:10000}.popup-backdrop{position:fixed;inset:0;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.popup-content{background:#fff;border-radius:8px;width:520px;max-width:95%;max-height:90vh;overflow:hidden;box-shadow:0 10px 40px #0000004d}\n"], dependencies: [{ kind: "ngmodule", type: NgxExtendedPdfViewerModule }, { kind: "component", type: i1.NgxExtendedPdfViewerComponent, selector: "ngx-extended-pdf-viewer", inputs: ["customFindbarInputArea", "customToolbar", "customFindbar", "customFindbarButtons", "customPdfViewer", "customSecondaryToolbar", "customSidebar", "customThumbnail", "customFreeFloatingBar", "showFreeFloatingBar", "enableDragAndDrop", "forceUsingLegacyES5", "formData", "disableForms", "pageViewMode", "scrollMode", "authorization", "httpHeaders", "contextMenuAllowed", "enablePrint", "enablePrintAutoRotate", "forceFullReloadOfJavaScriptCode", "showTextEditor", "showStampEditor", "showCommentEditor", "showDrawEditor", "showHighlightEditor", "showSignatureEditor", "logLevel", "minifiedJSLibraries", "printResolution", "rotation", "src", "base64Src", "minHeight", "height", "backgroundColor", "pdfBackgroundColor", "filenameForDownload", "ignoreKeyboard", "ignoreKeys", "acceptKeys", "imageResourcesPath", "localeFolderPath", "language", "listenToURL", "nameddest", "password", "replaceBrowserPrint", "useInlineScripts", "showUnverifiedSignatures", "startTabindex", "showSidebarButton", "sidebarVisible", "activeSidebarView", "findbarVisible", "propertiesDialogVisible", "showFindButton", "showFindHighlightAll", "showFindMatchCase", "showFindMultiple", "showFindRegexp", "showFindEntireWord", "showFindMatchDiacritics", "showFindResultsCount", "showFindMessages", "showMovePageButton", "showPagingButtons", "showFirstAndLastPageButtons", "showPreviousAndNextPageButtons", "showPageNumber", "showPageLabel", "showZoomButtons", "showZoomDropdown", "showPresentationModeButton", "showOpenFileButton", "showPrintButton", "showDownloadButton", "theme", "showToolbar", "showSecondaryToolbarButton", "showSinglePageModeButton", "showVerticalScrollButton", "showHorizontalScrollButton", "showWrappedScrollButton", "showInfiniteScrollButton", "showBookModeButton", "showRotateButton", "showRotateCwButton", "showRotateCcwButton", "handTool", "showHandToolButton", "showSpreadButton", "showPropertiesButton", "showBorders", "spread", "showScrollingButtons", "page", "pageLabel", "textLayer", "zoom", "zoomLevels", "maxZoom", "minZoom", "mobileFriendlyZoom"], outputs: ["annotationEditorEvent", "formDataChange", "pageViewModeChange", "progress", "srcChange", "scrollModeChange", "afterPrint", "beforePrint", "currentZoomFactor", "rotationChange", "annotationLayerRendered", "annotationEditorLayerRendered", "xfaLayerRendered", "outlineLoaded", "attachmentsloaded", "layersloaded", "sidebarVisibleChange", "activeSidebarViewChange", "findbarVisibleChange", "propertiesDialogVisibleChange", "handToolChange", "spreadChange", "thumbnailDrawn", "pageChange", "pageLabelChange", "pagesLoaded", "pageRender", "pageRendered", "pdfDownloaded", "pdfLoaded", "pdfLoadingStarts", "pdfLoadingFailed", "textLayerRendered", "annotationEditorModeChanged", "updateFindMatchesCount", "updateFindState", "zoomChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdfSignatureComponent, selector: "app-pdf-signature", outputs: ["closed"] }] });
355
+ }
356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfInfoComponent, decorators: [{
357
+ type: Component,
358
+ args: [{ selector: 'app-pdf-info', standalone: true, imports: [
359
+ NgxExtendedPdfViewerModule,
360
+ FormsModule,
361
+ ReactiveFormsModule,
362
+ CommonModule,
363
+ NgIf,
364
+ PdfSignatureComponent
365
+ ], template: "<div>\r\n <img #signatureImg [src]=\"imageDataURL || ''\" style=\"display: none; position: absolute; visibility: hidden; width: 0; height: 0;\" />\r\n <img #floatingSignature [src]=\"imageDataURL || ''\" style=\"display: none; position: absolute; visibility: hidden; width: 0; height: 0;\" />\r\n \r\n <!-- <button *ngIf=\"pdfSrc\" (click)=\"showCoordinates()\">Show Coordinates</button> -->\r\n <button *ngIf=\"pdfSrc\" (click)=\"addSignature()\">Add Signature</button>\r\n <button *ngIf=\"pdfSrc\" (click)=\"addAllSignaturesToPdf()\">Save Signature</button>\r\n <input type=\"file\" (change)=\"onFileSelected($event)\" accept=\"application/pdf\" />\r\n\r\n <div class=\"popup-backdrop\" *ngIf=\"showDialog\">\r\n <app-pdf-signature\r\n class=\"popup-content\"\r\n (click)=\"$event.stopPropagation()\"\r\n (closed)=\"onDialogClosed($event)\">\r\n </app-pdf-signature>\r\n </div>\r\n\r\n <div class=\"container\" [hidden]=\"!pdfSrc\">\r\n <div class=\"content\">\r\n <ngx-extended-pdf-viewer\r\n [src]=\"pdfSrc\"\r\n [textLayer]=\"false\"\r\n [page]=\"0\"\r\n [(zoom)]=\"zoom\"\r\n [showHandToolButton]=\"true\"\r\n [showOpenFileButton]=\"false\"\r\n [enableDragAndDrop]=\"false\"\r\n (click)=\"onPdfClick($event)\">\r\n</ngx-extended-pdf-viewer>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".container,.content{position:relative}.signature-box{position:absolute;border:2px dashed #1976d2;cursor:move;box-sizing:border-box;background:#1976d20d;z-index:9999}.signature-box img{width:100%;height:100%;pointer-events:none}.resize-handle{position:absolute;width:18px;height:18px;right:-9px;bottom:-9px;background:#1976d233;border:2px solid rgba(25,118,210,.9);border-radius:4px;display:flex;align-items:center;justify-content:center;font-weight:700;cursor:se-resize;-webkit-user-select:none;user-select:none;z-index:10000}.popup-backdrop{position:fixed;inset:0;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.popup-content{background:#fff;border-radius:8px;width:520px;max-width:95%;max-height:90vh;overflow:hidden;box-shadow:0 10px 40px #0000004d}\n"] }]
366
+ }], ctorParameters: () => [], propDecorators: { signatureImg: [{
367
+ type: ViewChild,
368
+ args: ['signatureImg', { static: false }]
369
+ }], floatingSignature: [{
370
+ type: ViewChild,
371
+ args: ['floatingSignature', { static: false }]
372
+ }], pdfSrc: [{
373
+ type: Input
374
+ }] } });
375
+
376
+ class PdfExplorerComponent {
377
+ router;
378
+ pdfFiles = [
379
+ { name: 'Sample PDF 1', src: 'assets/pdfs/sample1.pdf' },
380
+ { name: 'User Guide', src: 'assets/pdfs/user-guide.pdf' },
381
+ { name: 'Project Report', src: 'assets/pdfs/project-report.pdf' },
382
+ { name: 'Project Report', src: 'assets/pdfs/project-report.pdf' },
383
+ { name: 'Project Report', src: 'assets/pdfs/project-report.pdf' },
384
+ ];
385
+ constructor(router) {
386
+ this.router = router;
387
+ }
388
+ openPdf(pdf) {
389
+ // Navigate to pdf-info page and pass file src
390
+ this.router.navigate(['/pdf-info'], { state: { pdfSrc: pdf.src } });
391
+ }
392
+ onFileUpload(event) {
393
+ const file = event.target.files[0];
394
+ console.log(file);
395
+ if (file && file.type === 'application/pdf') {
396
+ const fileURL = URL.createObjectURL(file);
397
+ this.router.navigate(['/pdf-info'], { state: { pdfSrc: fileURL } });
398
+ }
399
+ else {
400
+ alert('Please upload a valid PDF file.');
401
+ }
402
+ }
403
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfExplorerComponent, deps: [{ token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Component });
404
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: PdfExplorerComponent, isStandalone: true, selector: "app-pdf-explorer", ngImport: i0, template: "<div style=\"display: flex;\r\nflex-direction: column; gap: 10px; align-items: start; margin-top: 20px;\">\r\n <div style=\"display: flex; flex-direction: row; align-items: baseline; gap: 15px; border: 1px solid #3e3e3e3e; min-width: 100%; padding-inline: 10px;\">\r\n <h1 class=\"text-2xl font-bold mb-4\">PDF Explorer</h1>\r\n <span class=\"mb-4\">(Click on a PDF file to view its details.)</span>\r\n </div>\r\n <div class=\"max-w-md mx-auto mt-8 p-4\">\r\n <h2 class=\"text-xl font-bold mb-4\">PDF Files</h2>\r\n <input type=\"file\" name=\"\" id=\"\" (change)=\"onFileUpload($event)\" />\r\n <ul class=\"border border-gray-200 rounded-lg divide-y divide-gray-200\">\r\n <li *ngFor=\"let pdf of pdfFiles\" class=\"px-4 py-3 hover:bg-gray-100 cursor-pointer\" style=\"cursor: pointer; padding-inline: 4px;\" (click)=\"openPdf(pdf)\">\r\n {{ pdf.name }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
405
+ }
406
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PdfExplorerComponent, decorators: [{
407
+ type: Component,
408
+ args: [{ selector: 'app-pdf-explorer', standalone: true, imports: [NgFor], template: "<div style=\"display: flex;\r\nflex-direction: column; gap: 10px; align-items: start; margin-top: 20px;\">\r\n <div style=\"display: flex; flex-direction: row; align-items: baseline; gap: 15px; border: 1px solid #3e3e3e3e; min-width: 100%; padding-inline: 10px;\">\r\n <h1 class=\"text-2xl font-bold mb-4\">PDF Explorer</h1>\r\n <span class=\"mb-4\">(Click on a PDF file to view its details.)</span>\r\n </div>\r\n <div class=\"max-w-md mx-auto mt-8 p-4\">\r\n <h2 class=\"text-xl font-bold mb-4\">PDF Files</h2>\r\n <input type=\"file\" name=\"\" id=\"\" (change)=\"onFileUpload($event)\" />\r\n <ul class=\"border border-gray-200 rounded-lg divide-y divide-gray-200\">\r\n <li *ngFor=\"let pdf of pdfFiles\" class=\"px-4 py-3 hover:bg-gray-100 cursor-pointer\" style=\"cursor: pointer; padding-inline: 4px;\" (click)=\"openPdf(pdf)\">\r\n {{ pdf.name }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>" }]
409
+ }], ctorParameters: () => [{ type: i1$1.Router }] });
410
+
411
+ /*
412
+ * Public API Surface of lib-firas-digi
413
+ */
414
+
415
+ /**
416
+ * Generated bundle index. Do not edit.
417
+ */
418
+
419
+ export { LibFirasDigiComponent, LibFirasDigiService, PdfExplorerComponent, PdfInfoComponent, PdfSignatureComponent };
420
+ //# sourceMappingURL=lib-firas-digi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib-firas-digi.mjs","sources":["../../../projects/lib-firas-digi/src/lib/lib-firas-digi.service.ts","../../../projects/lib-firas-digi/src/lib/lib-firas-digi.component.ts","../../../projects/lib-firas-digi/src/lib/pdf-signature/pdf-signature.component.ts","../../../projects/lib-firas-digi/src/lib/pdf-signature/pdf-signature.component.html","../../../projects/lib-firas-digi/src/lib/pdf-info/pdf-info.component.ts","../../../projects/lib-firas-digi/src/lib/pdf-info/pdf-info.component.html","../../../projects/lib-firas-digi/src/lib/pdf-explorer/pdf-explorer.component.ts","../../../projects/lib-firas-digi/src/lib/pdf-explorer/pdf-explorer.component.html","../../../projects/lib-firas-digi/src/public-api.ts","../../../projects/lib-firas-digi/src/lib-firas-digi.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LibFirasDigiService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-lib-firas-digi',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <p>\r\n lib-firas-digi works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class LibFirasDigiComponent {\r\n\r\n}\r\n","import { Component, ElementRef, ViewChild, AfterViewInit, ViewEncapsulation } from '@angular/core';\r\nimport SignaturePad from 'signature_pad';\r\nimport { EventEmitter, Output } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n// import { RouterModule } from '@angular/router';\r\nimport { CommonModule, NgIf } from '@angular/common';\r\n@Component({\r\n selector: 'app-pdf-signature',\r\n imports: [\r\n\r\n NgIf,\r\n CommonModule,\r\n FormsModule,\r\n // RouterModule,\r\n ReactiveFormsModule,\r\n ],\r\n templateUrl: './pdf-signature.component.html',\r\n styleUrl: './pdf-signature.component.scss',\r\n standalone: true,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PdfSignatureComponent implements AfterViewInit {\r\n\r\n signaturePad!: SignaturePad;\r\n activeTab: 'upload' | 'draw' = 'upload';\r\n @ViewChild('canvas', { static: false }) canvas!: ElementRef<HTMLCanvasElement>;\r\n @Output() closed = new EventEmitter<{ confirmed: boolean, image?: string }>();\r\n\r\n selectedFile!: File | null;\r\n previewUrl: string | ArrayBuffer | null = null;\r\n fileName = '';\r\n isImage = false;\r\n\r\n ngAfterViewInit() {\r\n if (this.activeTab === 'draw' && this.canvas) {\r\n this.initSignaturePad();\r\n }\r\n }\r\n initSignaturePad() {\r\n if (!this.canvas) return;\r\n this.signaturePad = new SignaturePad(this.canvas.nativeElement, {\r\n minWidth: 1,\r\n penColor: 'black',\r\n });\r\n }\r\n setActiveTab(tab: 'upload' | 'draw') {\r\n this.activeTab = tab;\r\n\r\n if (tab === 'draw') {\r\n setTimeout(() => {\r\n this.initSignaturePad();\r\n });\r\n }\r\n }\r\n\r\n saveSignature() {\r\n let base64: string | null = null;\r\n\r\n if (this.signaturePad && !this.signaturePad.isEmpty()) {\r\n base64 = this.signaturePad.toDataURL();\r\n }\r\n if (this.previewUrl) {\r\n base64 = this.previewUrl as string;\r\n }\r\n if (!base64) {\r\n return;\r\n }\r\n\r\n this.closed.emit({ confirmed: true, image: base64 });\r\n }\r\n\r\n\r\n clear() {\r\n this.signaturePad.clear();\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (event.dataTransfer && event.dataTransfer.files.length > 0) {\r\n this.handleFile(event.dataTransfer.files[0]);\r\n }\r\n }\r\n\r\n onFileSelected(event: any) {\r\n const file = event.target.files[0];\r\n if (file) {\r\n this.handleFile(file);\r\n }\r\n }\r\n\r\n handleFile(file: File) {\r\n this.selectedFile = file;\r\n this.fileName = file.name;\r\n this.isImage = file.type.startsWith('image/');\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n this.previewUrl = reader.result;\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n uploadFile() {\r\n if (!this.selectedFile) return;\r\n\r\n const formData = new FormData();\r\n formData.append('file', this.selectedFile);\r\n }\r\n close(confirmed: boolean = false) {\r\n this.closed.emit({ confirmed });\r\n }\r\n}\r\n","<div class=\"dialog-wrapper\" style=\"background: white;\">\r\n\r\n <div class=\"tabs-header flex\">\r\n <button type=\"button\" [class.active]=\"activeTab === 'upload'\" (click)=\"setActiveTab('upload')\" class=\"tab-btn\">\r\n UPLOAD\r\n </button>\r\n <button type=\"button\" [class.active]=\"activeTab === 'draw'\" (click)=\"setActiveTab('draw')\" class=\"tab-btn\">\r\n DRAW\r\n </button>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"activeTab === 'upload'\" class=\"tab-content\">\r\n <div class=\"drop-zone px-2\" [class.with-image]=\"previewUrl\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"$event.stopPropagation()\">\r\n <span>Drag and drop here</span>\r\n <ng-container *ngIf=\"previewUrl\">\r\n <img *ngIf=\"isImage\" [src]=\"previewUrl\" class=\"preview-img\" />\r\n <p *ngIf=\"!isImage\">{{ fileName }}</p>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!previewUrl\">\r\n <input type=\"file\" (change)=\"onFileSelected($event)\" class=\"input_files\"/>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab === 'draw'\" class=\"tab-content\">\r\n <div class=\"signature-container\">\r\n <canvas #canvas width=\"450\" height=\"150\" style=\"width: 99%; border: 1px solid #ccc;\"></canvas>\r\n </div>\r\n <button type=\"button\" (click)=\"clear()\" mat-flat-button color=\"primary\">\r\n X\r\n </button>\r\n </div>\r\n\r\n <div class=\"dialog-footer mx-2\">\r\n <div class=\"buttons-row\">\r\n <div class=\"buttons-row\">\r\n <button type=\"button\" class=\"btn btn-cancel\" (click)=\"close(false)\">\r\n Close\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveSignature()\">\r\n SIGN\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n","import {\n Component,\n ElementRef,\n Input,\n ViewChild,\n AfterViewInit,\n} from '@angular/core';\nimport {\n NgxExtendedPdfViewerModule,\n TextLayerRenderedEvent,\n pdfDefaultOptions,\n} from 'ngx-extended-pdf-viewer';\nimport { PDFDocument } from 'pdf-lib';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule, NgIf } from '@angular/common';\nimport { PdfSignatureComponent } from '../pdf-signature/pdf-signature.component';\n\n@Component({\n selector: 'app-pdf-info',\n templateUrl: './pdf-info.component.html',\n styleUrls: ['./pdf-info.component.css'],\n standalone: true,\n imports: [\n NgxExtendedPdfViewerModule,\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgIf,\n PdfSignatureComponent\n ],\n})\nexport class PdfInfoComponent implements AfterViewInit {\n @ViewChild('signatureImg', { static: false })\n signatureImg?: ElementRef<HTMLImageElement>;\n\n @ViewChild('floatingSignature', { static: false })\n floatingSignature?: ElementRef<HTMLImageElement>;\n\n @Input() pdfSrc: string = '';\n imageDataURL: string = '';\n\n pdfBlocked = true;\n sidebarOpen: boolean = true;\n signMode: boolean = false;\n showSignature: boolean = true;\n signatureLoaded = false;\n\n signatures: Signature[] = [];\n zoom: any = 100;\n showDialog = false;\n currentPdfBytes!: Uint8Array;\n\n constructor() {\n pdfDefaultOptions.textLayerMode = 1;\n }\n\n ngAfterViewInit(): void {\n // ViewChild references are now available after view initialization\n // Access them here if needed\n }\n\n async onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const file = input.files[0];\n const arrayBuffer = await file.arrayBuffer();\n this.currentPdfBytes = new Uint8Array(arrayBuffer);\n\n this.pdfSrc = URL.createObjectURL(file);\n }\n\n addSignature() {\n this.showDialog = true;\n }\n\n onDialogClosed(event: { confirmed: boolean; image?: string }) {\n this.showDialog = false;\n if (event.confirmed && event.image) {\n this.imageDataURL = event.image;\n this.signMode = true;\n }\n }\n\n onPdfClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if(target.closest('.signature-box')) return;\n if (!this.signMode || !this.imageDataURL) return;\n\n const pageEl = (event.target as HTMLElement).closest('.page') as HTMLElement;\n if (!pageEl) return;\n\n const pageNumber = Number(pageEl.dataset['pageNumber']);\n const pageRect = pageEl.getBoundingClientRect();\n\n const transform = getComputedStyle(pageEl).transform;\n const scale = transform && transform !== 'none'\n ? new DOMMatrixReadOnly(transform).a\n : 1;\n\n const domX = event.clientX - pageRect.left;\n const domY = event.clientY - pageRect.top;\n\n const width = (pageRect.width / scale) * 0.15;\n const height = width * 0.35;\n\n const sig: Signature = { pageNumber, domX, domY, width, height };\n\n this.signatures.push(sig);\n this.createDraggableSignatureBox(sig);\n\n this.signMode = false;\n }\n\n createDraggableSignatureBox(sig: Signature) {\n const pageEl = document.querySelector(\n `.pdfViewer .page[data-page-number=\"${sig.pageNumber}\"]`\n ) as HTMLElement;\n\n if (!pageEl) return;\n\n pageEl.style.position = 'relative';\n\n const box = document.createElement('div');\n box.className = 'signature-box';\n box.style.position = 'absolute';\n box.style.left = `${sig.domX}px`;\n box.style.top = `${sig.domY}px`;\n box.style.width = `${sig.width}px`;\n box.style.height = `${sig.height}px`;\n box.style.zIndex = '9999';\n box.style.border = '2px dashed #1976d2';\n box.style.background = 'rgba(25, 118, 210, 0.05)';\n\n const img = document.createElement('img');\n img.src = this.imageDataURL;\n img.style.width = '100%';\n img.style.height = '100%';\n img.style.pointerEvents = 'none';\n\n const handle = document.createElement('div');\n handle.classList.add('resize-handle');\n handle.style.position = 'absolute';\n handle.style.right = '-7px';\n handle.style.bottom = '-7px';\n handle.style.width = '18px';\n handle.style.height = '18px';\n handle.style.backgroundColor = 'rgba(25, 118, 210, 0.2)';\n handle.style.border = '2px solid rgba(25, 118, 210, 0.9)';\n handle.style.borderRadius = '4px';\n handle.style.cursor = 'se-resize';\n handle.style.zIndex = '10000';\n handle.textContent = '+';\n\n box.appendChild(img);\n box.appendChild(handle);\n pageEl.appendChild(box);\n\n this.makeDraggable(box, pageEl, sig);\n this.makeResizable(box, sig);\n }\n\n makeDraggable(box: HTMLElement, container: HTMLElement, sig: Signature) {\n let startX = 0;\n let startY = 0;\n let origX = 0;\n let origY = 0;\n\n box.addEventListener('pointerdown', (e: PointerEvent) => {\n if ((e.target as HTMLElement).classList.contains('resize-handle')) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n box.setPointerCapture(e.pointerId);\n\n startX = e.clientX;\n startY = e.clientY;\n origX = box.offsetLeft;\n origY = box.offsetTop;\n\n const scale = this.getPdfScale(container);\n\n const move = (ev: PointerEvent) => {\n const dx = (ev.clientX - startX) / scale;\n const dy = (ev.clientY - startY) / scale;\n\n box.style.left = origX + dx + 'px';\n box.style.top = origY + dy + 'px';\n\n sig.domX = origX + dx;\n sig.domY = origY + dy;\n };\n\n const up = () => {\n box.releasePointerCapture(e.pointerId);\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n });\n }\n\n makeResizable(box: HTMLElement, sig: Signature) {\n const handle = box.querySelector('.resize-handle') as HTMLElement;\n if (!handle) return;\n\n handle.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n handle.setPointerCapture(e.pointerId);\n\n const startX = e.clientX;\n const startWidth = sig.width;\n\n const move = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const newWidth = Math.max(60, startWidth + dx);\n const newHeight = newWidth * 0.35;\n\n sig.width = newWidth;\n sig.height = newHeight;\n\n box.style.width = newWidth + 'px';\n box.style.height = newHeight + 'px';\n };\n\n const up = () => {\n handle.releasePointerCapture(e.pointerId);\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n });\n }\n\n getPdfScale(pageEl: HTMLElement): number {\n const transform = getComputedStyle(pageEl).transform;\n return transform && transform !== 'none'\n ? new DOMMatrixReadOnly(transform).a\n : 1;\n }\n\n async addAllSignaturesToPdf() {\n if (!this.signatures.length || !this.imageDataURL) return;\n\n const existingPdfBytes = await fetch(this.pdfSrc).then(res => res.arrayBuffer());\n const pdfDoc = await PDFDocument.load(existingPdfBytes);\n const pages = pdfDoc.getPages();\n\n const base64Data = this.imageDataURL.split(',')[1];\n const imageBytes = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));\n const pngImage = await pdfDoc.embedPng(imageBytes);\n\n for (const sig of this.signatures) {\n const page = pages[sig.pageNumber - 1];\n if (!page) continue;\n\n const pageEl = document.querySelector(\n `.pdfViewer .page[data-page-number=\"${sig.pageNumber}\"]`\n ) as HTMLElement;\n const pageRect = pageEl.getBoundingClientRect();\n\n const scale = pageRect.width / page.getWidth();\n\n const pdfX = sig.domX / scale;\n const pdfY = page.getHeight() - sig.domY / scale - sig.height / scale;\n const pdfW = sig.width / scale;\n const pdfH = sig.height / scale;\n\n page.drawImage(pngImage, {\n x: pdfX,\n y: pdfY,\n width: pdfW,\n height: pdfH\n });\n }\n\nconst pdfBytes = await pdfDoc.save();\n\nconst pdfBytesNormal = new Uint8Array(pdfBytes);\n\nconst blob = new Blob([pdfBytesNormal], { type: 'application/pdf' });\nthis.pdfSrc = URL.createObjectURL(blob);\n\n\n }\n\n finalizeSignature() {\n this.signMode = false;\n }\n}\n\ninterface Signature {\n pageNumber: number;\n domX: number;\n domY: number;\n width: number;\n height: number;\n}\n","<div>\r\n <img #signatureImg [src]=\"imageDataURL || ''\" style=\"display: none; position: absolute; visibility: hidden; width: 0; height: 0;\" />\r\n <img #floatingSignature [src]=\"imageDataURL || ''\" style=\"display: none; position: absolute; visibility: hidden; width: 0; height: 0;\" />\r\n \r\n <!-- <button *ngIf=\"pdfSrc\" (click)=\"showCoordinates()\">Show Coordinates</button> -->\r\n <button *ngIf=\"pdfSrc\" (click)=\"addSignature()\">Add Signature</button>\r\n <button *ngIf=\"pdfSrc\" (click)=\"addAllSignaturesToPdf()\">Save Signature</button>\r\n <input type=\"file\" (change)=\"onFileSelected($event)\" accept=\"application/pdf\" />\r\n\r\n <div class=\"popup-backdrop\" *ngIf=\"showDialog\">\r\n <app-pdf-signature\r\n class=\"popup-content\"\r\n (click)=\"$event.stopPropagation()\"\r\n (closed)=\"onDialogClosed($event)\">\r\n </app-pdf-signature>\r\n </div>\r\n\r\n <div class=\"container\" [hidden]=\"!pdfSrc\">\r\n <div class=\"content\">\r\n <ngx-extended-pdf-viewer\r\n [src]=\"pdfSrc\"\r\n [textLayer]=\"false\"\r\n [page]=\"0\"\r\n [(zoom)]=\"zoom\"\r\n [showHandToolButton]=\"true\"\r\n [showOpenFileButton]=\"false\"\r\n [enableDragAndDrop]=\"false\"\r\n (click)=\"onPdfClick($event)\">\r\n</ngx-extended-pdf-viewer>\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgFor } from '@angular/common';\nimport { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'app-pdf-explorer',\n templateUrl: './pdf-explorer.component.html',\n styleUrls: ['./pdf-explorer.component.css'],\n standalone: true,\n imports: [NgFor]\n})\nexport class PdfExplorerComponent {\n pdfFiles = [\n { name: 'Sample PDF 1', src: 'assets/pdfs/sample1.pdf' },\n { name: 'User Guide', src: 'assets/pdfs/user-guide.pdf' },\n { name: 'Project Report', src: 'assets/pdfs/project-report.pdf' },\n { name: 'Project Report', src: 'assets/pdfs/project-report.pdf' },\n { name: 'Project Report', src: 'assets/pdfs/project-report.pdf' },\n\n ];\n\n constructor(private router: Router) { }\n\n openPdf(pdf: { name: string; src: string }) {\n // Navigate to pdf-info page and pass file src\n this.router.navigate(['/pdf-info'], { state: { pdfSrc: pdf.src } });\n }\n\n onFileUpload(event: any) {\n const file = event.target.files[0];\n console.log(file);\n\n if (file && file.type === 'application/pdf') {\n const fileURL = URL.createObjectURL(file);\n this.router.navigate(['/pdf-info'], { state: { pdfSrc: fileURL } });\n } else {\n alert('Please upload a valid PDF file.');\n }\n\n }\n}\n","<div style=\"display: flex;\r\nflex-direction: column; gap: 10px; align-items: start; margin-top: 20px;\">\r\n <div style=\"display: flex; flex-direction: row; align-items: baseline; gap: 15px; border: 1px solid #3e3e3e3e; min-width: 100%; padding-inline: 10px;\">\r\n <h1 class=\"text-2xl font-bold mb-4\">PDF Explorer</h1>\r\n <span class=\"mb-4\">(Click on a PDF file to view its details.)</span>\r\n </div>\r\n <div class=\"max-w-md mx-auto mt-8 p-4\">\r\n <h2 class=\"text-xl font-bold mb-4\">PDF Files</h2>\r\n <input type=\"file\" name=\"\" id=\"\" (change)=\"onFileUpload($event)\" />\r\n <ul class=\"border border-gray-200 rounded-lg divide-y divide-gray-200\">\r\n <li *ngFor=\"let pdf of pdfFiles\" class=\"px-4 py-3 hover:bg-gray-100 cursor-pointer\" style=\"cursor: pointer; padding-inline: 4px;\" (click)=\"openPdf(pdf)\">\r\n {{ pdf.name }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>","/*\r\n * Public API Surface of lib-firas-digi\r\n */\r\n\r\nexport * from './lib/lib-firas-digi.service';\r\nexport * from './lib/lib-firas-digi.component';\r\nexport * from './lib/pdf-info/pdf-info.component';\r\nexport * from './lib/pdf-signature/pdf-signature.component';\r\nexport * from './lib/pdf-explorer/pdf-explorer.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="lib-firas-digi" />
5
+ export * from './public-api';
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class LibFirasDigiComponent {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<LibFirasDigiComponent, never>;
4
+ static ɵcmp: i0.ɵɵComponentDeclaration<LibFirasDigiComponent, "lib-lib-firas-digi", never, {}, {}, never, never, true, never>;
5
+ }
@@ -0,0 +1,6 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class LibFirasDigiService {
3
+ constructor();
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<LibFirasDigiService, never>;
5
+ static ɵprov: i0.ɵɵInjectableDeclaration<LibFirasDigiService>;
6
+ }
@@ -0,0 +1,17 @@
1
+ import { Router } from '@angular/router';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PdfExplorerComponent {
4
+ private router;
5
+ pdfFiles: {
6
+ name: string;
7
+ src: string;
8
+ }[];
9
+ constructor(router: Router);
10
+ openPdf(pdf: {
11
+ name: string;
12
+ src: string;
13
+ }): void;
14
+ onFileUpload(event: any): void;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<PdfExplorerComponent, never>;
16
+ static ɵcmp: i0.ɵɵComponentDeclaration<PdfExplorerComponent, "app-pdf-explorer", never, {}, {}, never, never, true, never>;
17
+ }
@@ -0,0 +1,42 @@
1
+ import { ElementRef, AfterViewInit } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PdfInfoComponent implements AfterViewInit {
4
+ signatureImg?: ElementRef<HTMLImageElement>;
5
+ floatingSignature?: ElementRef<HTMLImageElement>;
6
+ pdfSrc: string;
7
+ imageDataURL: string;
8
+ pdfBlocked: boolean;
9
+ sidebarOpen: boolean;
10
+ signMode: boolean;
11
+ showSignature: boolean;
12
+ signatureLoaded: boolean;
13
+ signatures: Signature[];
14
+ zoom: any;
15
+ showDialog: boolean;
16
+ currentPdfBytes: Uint8Array;
17
+ constructor();
18
+ ngAfterViewInit(): void;
19
+ onFileSelected(event: Event): Promise<void>;
20
+ addSignature(): void;
21
+ onDialogClosed(event: {
22
+ confirmed: boolean;
23
+ image?: string;
24
+ }): void;
25
+ onPdfClick(event: MouseEvent): void;
26
+ createDraggableSignatureBox(sig: Signature): void;
27
+ makeDraggable(box: HTMLElement, container: HTMLElement, sig: Signature): void;
28
+ makeResizable(box: HTMLElement, sig: Signature): void;
29
+ getPdfScale(pageEl: HTMLElement): number;
30
+ addAllSignaturesToPdf(): Promise<void>;
31
+ finalizeSignature(): void;
32
+ static ɵfac: i0.ɵɵFactoryDeclaration<PdfInfoComponent, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<PdfInfoComponent, "app-pdf-info", never, { "pdfSrc": { "alias": "pdfSrc"; "required": false; }; }, {}, never, never, true, never>;
34
+ }
35
+ interface Signature {
36
+ pageNumber: number;
37
+ domX: number;
38
+ domY: number;
39
+ width: number;
40
+ height: number;
41
+ }
42
+ export {};