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.
- package/README.md +24 -0
- package/esm2022/lib/lib-firas-digi.component.mjs +19 -0
- package/esm2022/lib/lib-firas-digi.service.mjs +14 -0
- package/esm2022/lib/pdf-explorer/pdf-explorer.component.mjs +39 -0
- package/esm2022/lib/pdf-info/pdf-info.component.mjs +237 -0
- package/esm2022/lib/pdf-signature/pdf-signature.component.mjs +114 -0
- package/esm2022/lib-firas-digi.mjs +5 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/lib-firas-digi.mjs +420 -0
- package/fesm2022/lib-firas-digi.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/lib-firas-digi.component.d.ts +5 -0
- package/lib/lib-firas-digi.service.d.ts +6 -0
- package/lib/pdf-explorer/pdf-explorer.component.d.ts +17 -0
- package/lib/pdf-info/pdf-info.component.d.ts +42 -0
- package/lib/pdf-signature/pdf-signature.component.d.ts +31 -0
- package/package.json +25 -0
- package/public-api.d.ts +5 -0
|
@@ -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
|
+
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,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 {};
|