Stempel speichern

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 :slight_smile:
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());
3 „Gefällt mir“

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

1 „Gefällt mir“

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

1 „Gefällt mir“

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: