Hallo zusammen,
bietet ED in der Version 2.2.5 auch die Möglichkeit benutzerdefinierte Stempel zu speichern? Leider verschwinden die bei uns immer nach der erneuten Anmeldung in Enaio.
Beste Grüße,
Christian
Hallo zusammen,
bietet ED in der Version 2.2.5 auch die Möglichkeit benutzerdefinierte Stempel zu speichern? Leider verschwinden die bei uns immer nach der erneuten Anmeldung in Enaio.
Beste Grüße,
Christian
Hallo @cschulze,
das ist jetzt wirklich ein grosser Zufall. Eine OS Tochter hatte mich um ein Beispiel gebeten. Dieses Beispiel speichert die Daten über eine Methode des AppConnectors benutzerspezifisch in die enaio Datenbank. Prinzipiell kann man dies natürlich auch anders umsetzten.
Hier das Beispiel:
/*
Dieser Interceptor speichert und lädt die Custom Stempel.
*/
class PersistStamps {
stampsLoaded = false;
tool = null;
STORAGE_KEY_CUSTOM = "ed-stamps-custom";
// Beim starten der Editor Instanz
initEditorConfiguration(instance) {
const { documentViewer } = instance.Core;
// Stempel Tool holen
this.tool = documentViewer.getTool('AnnotationCreateRubberStamp');
// Immer speichern wenn ein Stempel hinzugefügt, geändert oder gelöscht wird
this.tool.addEventListener('stampsUpdated', (stampData) => {
this.saveStamps();
});
// Nachdem das Dokument geladen wurde, prüfen ob die gespecherten Stempel schon importiert wurden.
documentViewer.addEventListener('documentLoaded', () => {
// Nur einmal laden
if(this.stampsLoaded){
return;
}
this.loadStamps();
this.stampsLoaded = true;
});
}
// Methode zum speichern der Stempel
async saveStamps() {
// Nur speichern, wenn das erste Dokument geladen wurde
if(!this.stampsLoaded){
return;
}
const data = {
type: 80,
name: this.STORAGE_KEY_CUSTOM,
value: JSON.stringify(this.tool.getCustomStamps()),
};
const response = await fetch(`/osrest/api/session/settings/custom/save`, {
method: 'POST',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json',
},
});
// Prüfen ob die Signature gespeichert werden konnte
if (response.status == 204) {
console.log('Stamps saved');
} else {
console.error(response);
}
}
// Methode zum laden der Stempel
async loadStamps() {
const customStampsResponse = await fetch(`/osrest/api/session/settings/custom/load?type=80&name=${this.STORAGE_KEY_CUSTOM}` );
// Prüfen ob das laden erfolgreich war
if (customStampsResponse.status == 200) {
const customStamps = await customStampsResponse.json();
if (customStamps.value) {
// Import der Stempel in embedded documents
const customStampsValue = JSON.parse(customStamps.value);
await this.tool.setCustomStamps(customStampsValue);
console.log('Custom Stamps loaded');
}
} else {
console.error(response);
}
}
}
// Registrierung des Interceptors
window.ed.registerInterceptor(new PersistStamps());
Hallo @uw ,
besten Dank für die schnelle Rückmeldung.
Das sieht sehr gut aus.
Der Stempel wird jedoch nicht richtig gespeichert.
Bei uns wird nur der Hintergrund gespeichert, aber der Stempeltext ist nach einem Neustart des Enaio-Client wieder verschwunden.
Ich kann aber keine Fehlermeldungen in den Logs finden, die hier vielleicht weiterhelfen könnten.
Beste Grüße,
Christian Schulze
Hallo @uw
ich hoffe Sie sind erfolgreich in das neue Jahr gestartet ![]()
Ich habe mich mit dem Thema noch einmal auseinander gesetzt.
Dabei ist mir aufgefallen, dass das Problem an der Schriftfarbe liegt.
Alle Stempel die ich erstelle, welche mit weißer Schrift versehen sind, bei denen wird die Schrift nicht gespeichert und nach Client-Neustart nur der gewählte Hintergrund angezeigt.
Erstelle ich einen Stempel mit einer anders farbigen Schriftart, wird dieser korrekt gespeichert und kann immer wieder verwendet werden.
Gruß,
Christian
Hallo @cschulze, vielen Dank für das Update. Ich nehme das gerne als Testfall auf und hoffe, dass wir uns dazu in der nächsten Woche äussern können.
Dieses Thema würde uns auch interessieren. Gibt es hierzu schon Neuigkeiten?
Die PDF Editor Library scheint leider einen Bug zu haben. Diese liefert bei der Farbe Weiss im Stempel JSON die Textfarbe als "textColor": { "R": 255, "G": 255, "B": 255, "A": 1 } statt #FFFFFF. Wenn man diese dann wieder importiert, wird diese Farbe falsche interpretiert. Diesen Fehler werde ich an den Hersteller melden.
Zwischenzeitlich habe ich aber das Beispiel entsprechend angepasst:
/*
Dieser Interceptor speichert und lädt die Custom Stempel.
* 2024-06-04: Stempelschriftfarbe bei weiss wird korrigiert
*/
class PersistStamps {
stampsLoaded = false;
tool = null;
STORAGE_KEY_CUSTOM = "ed-stamps-custom";
// Beim starten der Editor Instanz
initEditorConfiguration(instance) {
const { documentViewer } = instance.Core;
// Stempel Tool holen
this.tool = documentViewer.getTool('AnnotationCreateRubberStamp');
// Immer speichern wenn ein Stempel hinzugefügt, geändert oder gelöscht wird
this.tool.addEventListener('stampsUpdated', (stampData) => {
this.saveStamps();
});
// Nachdem das Dokument geladen wurde, prüfen ob die gespecherten Stempel schon importiert wurden.
documentViewer.addEventListener('documentLoaded', () => {
// Nur einmal laden
if(this.stampsLoaded){
return;
}
this.loadStamps();
this.stampsLoaded = true;
});
}
// Methode zum speichern der Stempel
async saveStamps() {
// Nur speichern, wenn das erste Dokument geladen wurde
if(!this.stampsLoaded){
return;
}
const stamps = this.tool.getCustomStamps();
for(const stamp of stamps){
stamp.textColor = this.convertColor(stamp.textColor);
}
const data = {
type: 80,
name: this.STORAGE_KEY_CUSTOM,
value: JSON.stringify(stamps),
};
const response = await fetch(`/osrest/api/session/settings/custom/save`, {
method: 'POST',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json',
},
});
// Prüfen ob die Signature gespeichert werden konnte
if (response.status == 204) {
console.log('Stamps saved');
} else {
console.error(response);
}
}
// Methode zum laden der Stempel
async loadStamps() {
const customStampsResponse = await fetch(`/osrest/api/session/settings/custom/load?type=80&name=${this.STORAGE_KEY_CUSTOM}` );
// Prüfen ob das laden erfolgreich war
if (customStampsResponse.status == 200) {
const customStamps = await customStampsResponse.json();
if (customStamps.value) {
// Import der Stempel in embedded documents
const customStampsValue = JSON.parse(customStamps.value);
await this.tool.setCustomStamps(customStampsValue);
console.log('Custom Stamps loaded');
}
} else {
console.error(response);
}
}
convertColor(color) {
const zeroPad = (num, places) => String(num).padStart(places, '0');
if(color instanceof Object){
return ("#" + zeroPad(color.R.toString(16)) + zeroPad(color.G.toString(16)) + zeroPad(color.B.toString(16))).toUpperCase();
} else {
return color;
}
}
}
// Registrierung des Interceptors
window.ed.registerInterceptor(new PersistStamps());
Guten Tag,
kann man hier evtl. die Standard Farben von 00000 und FFFFF auf 00001 und FFFFE einstellen? Es wäre optisch immer noch schwarz und weiß, die schriften würden aber nicht mehr verloren gehen.
Oder gibt es mittlerweile eine Lösung für das Problem mit den festen Textfarben?
LG
Max Bitzer
Hallo @MaxBitzer,
ich habe es gerade nochmals geprüft. Leider scheint der Fehler immer noch vorhanden zu sein. Mit dem Workaround durch die convertColor sollte es aber funktionieren.
An sich sollte dadurch die Schrift problemlos sichtbar sein. In meinem Test ist keine Textfarbe verloren gegangen. Können Sie prüfen, oder der Interceptor korrekt geladen wird?
Liebe Grüsse
Uli
Hallo @uw
also mit Schwarz als Schrift ist es gar kein Problem. Die Weiße Schrift klappt bei mir aber nicht. Es wird bei mir dann wieder nur die Hintergrundfarbe des Stempels angezeigt, jedoch nur in der Stempel Vorschau, wenn ich den Stempel selektiere und einfügen möchte, kann ich die Schrift auch sehen.
Hier ein Beispiel:
LG
Max Bitzer
Hallo @MaxBitzer,
wenn ich es gerade richtig verstehe, dann verwendest du bereits die neue UI.
Also mit ed.ui-legacy: false. Hier scheint es bei den Stempeln ein etwas andere Verhalten zu geben.
Ich habe daher den Interceptor etwas angepasst (sollte in beiden Varianten gehen):
/*
Dieser Interceptor speichert und lädt die Custom Stempel.
*/
class PersistStamps {
stampsLoaded = false;
tool = null;
STORAGE_KEY_CUSTOM = "ed-stamps-custom";
// Beim starten der Editor Instanz
initEditorConfiguration(instance) {
const { documentViewer } = instance.Core;
// Stempel Tool holen
this.tool = documentViewer.getTool('AnnotationCreateRubberStamp');
// Immer speichern wenn ein Stempel hinzugefügt, geändert oder gelöscht wird
this.tool.addEventListener('stampsUpdated', (stampData) => {
this.saveStamps();
});
// Nachdem das Dokument geladen wurde, prüfen ob die gespecherten Stempel schon importiert wurden.
documentViewer.addEventListener('documentLoaded', () => {
// Nur einmal laden
if(this.stampsLoaded){
return;
}
this.loadStamps();
this.stampsLoaded = true;
});
}
// Methode zum speichern der Stempel
async saveStamps() {
// Nur speichern, wenn das erste Dokument geladen wurde
if(!this.stampsLoaded){
return;
}
const stamps = this.tool.getCustomStamps();
for(const stamp of stamps){
stamp.textColor = this.convertColor(stamp.textColor);
}
const data = {
type: 80,
name: this.STORAGE_KEY_CUSTOM,
value: JSON.stringify(stamps),
};
const response = await fetch(`/osrest/api/session/settings/custom/save`, {
method: 'POST',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json',
},
});
// Prüfen ob die Signature gespeichert werden konnte
if (response.status == 204) {
console.log('Stamps saved');
} else {
console.error(response);
}
}
// Methode zum laden der Stempel
async loadStamps() {
const customStampsResponse = await fetch(`/osrest/api/session/settings/custom/load?type=80&name=${this.STORAGE_KEY_CUSTOM}` );
// Prüfen ob das laden erfolgreich war
if (customStampsResponse.status == 200) {
const customStamps = await customStampsResponse.json();
if (customStamps.value) {
// Import der Stempel in embedded documents
const customStampsValue = JSON.parse(customStamps.value);
for(const customStamp of customStampsValue){
customStamp.textColor = this.convertColor(customStamp.textColor);
}
await this.tool.setCustomStamps(customStampsValue);
console.log('Custom Stamps loaded');
}
} else {
console.error(response);
}
}
convertColor(color) {
const zeroPad = (num, places) => String(num).padStart(places, '0');
if(color instanceof Object){
return ("#" + zeroPad(color.R.toString(16)) + zeroPad(color.G.toString(16)) + zeroPad(color.B.toString(16))).toUpperCase();
} else {
return color;
}
}
}
// Registrierung des Interceptors
window.ed.registerInterceptor(new PersistStamps());
Der Unterschied ist, dass ich nun auch beim laden die Stempelfarbe nochmals korrigiere, falls diese im falschen Format kommt.
Grundsätzlich ist es bei der Verwendung der Interceptoren etwas einfacher, wenn Sie noch die Legacy-UI verwenden. Hintergrund ist, dass die API von Apryse sich hier leider etwas verändert hat. Grundsätzich ist es aber möglich, auch die neue API zu verwenden.
Mit freundlichen Grüssen
Uli
Guten Tag @uw
super, das war im Prinzip schon alles was ich gebraucht hatte. Finde mich erst noch rein.
Vielen Dank für die Unterstützung!
LG
Max Bitzer
Hallo,
gibt es auch die Möglichkeit, den Stempeltext auf mehrere Zeilen zu verteilen, z.B. durch Einbau eines Trennzeichens? Meine Kolleg:innen haben tw. sehr textintensive Stempel…
Hallo @steschach, die Stempel sind erstmal nur so. Was man machen kann, ist mit einem Interceptor eigene Stempelfunktionen aus mehrzeiligen Texten inkl. Rahmen. Das lohnt sich noch mehr, wenn die Stempeltexte variabel sind, z. B. da sie sich auf Inhalte aus den Metadaten des aktiven Dokuments beziehen.
Eine Alternative sind Bildstempel, aus einer SVG- oder PNG-Datei geladene Stempel können beliebig formatierte Inhalte anzeigen, vergleiche hier ganz unten: