Interceptor-Beispiel: Dokumente splitten - Seiten trennen in Embedded Documents

Hallo @MaxBitzer,

das hatte ich übersehen :slight_smile:
Freut mich, das es jetzt klappt.

Grüsse
Uli

Hallo zusammen. Gibt es eine Möglichkeit den Interceptor so anzupassen, dass die Metadaten des Dokuments von von der Indexdatenmaske für die neuen Dokumente übernommen werden?

Danke und viele Grüße,

Christian

Hallo zusammen. Wir haben uns das Thema auch noch einmal angeschaut. Problematisch ist in der aktuellen Version, dass ein benötigtes Pflichtfeld beim Auftrennen nicht vorbelegt ist.
Gibt es eine Möglichkeit, den Interecptor so anzupassen, dass das Pflichtfeld gefüllt oder ignoriert wird?

Danke und beste Grüße,

Christian

Hallo @cschulze, die ursprüngliche Skript-Version hatte über alle Felder von fetch(/api/dms/objects/search/native) iteriert und damit kein Problem mit Pflichtfeldern, denke ich.

Ich kenne die genauen Begebenheiten der ObjDef (Pflichtfelder, Schlüsselfelder) nicht, die Interceptoren sind deshalb immer mehr als Beispiel zu verstehen.

Bestünde hier bei eventuell weitergehendem Anpassungsbedarf allenfalls die Möglichkeit, das betreffende OS-Systemhaus einzubeziehen?

Hallo @rk

danke für die Rückmeldung.

Sie haben recht. In der vorherigen Version funktionierte der Interceptor auch bei Pflichtfeldern ohne Probleme.

Jetzt wird im dms service folgender Fehler ausgeworfen:
dmsservice.7981 : 2026-06-22T11:36:27.977+02:00 ERROR 16920 — [dms] [nio-7981-exec-7] c.o.e.dms.web.rest.ObjectsController : Could not create or update object [DmsObject(properties={system:parentId=DmsObjectProperty(columnNames=null, value=2484, alias=null, type=null), system:objectTypeId=DmsObjectProperty(columnNames=null, value=262149, alias=null, type=null)}, children=null, options=null, contentStreams=[DmsContentStream(cid=cid_1, length=null, mimeType=application/pdf, fileName=content.pdf, digest=null, contentStreamId=null, repositoryId=null, range=null, inputStream=null, archivePath=null)], highlight=null, allowedChildObjectTypeIds=null, renditions=null, permissions=null)]. Cause: The underlying server job failed.

Und im Serverlog wird folgende Meldung protokolliert:

ServiceManager

Besteht vielleicht die Möglichkeit dem neuen Interceptor auch die „native“ Variante mitzugeben um das Problem zu umgehen?

Beste Grüße,

Christian Schulze

Hallo zusammen,

ich habe den DMS Aufruf um eine Option ergänzt, die Pflichtfelder ignorieren sollte:

let currentInfo = null;
let currentViewer = null;
let extractPagesInterceptor = {
  initEditorConfiguration(instance, config) {
    let { documentViewer, annotationManager } = instance.Core;
    let getMetadata = async (typeId, id) => {
      const rawResponse = await fetch(`/api/dms/objects/`+id, {
        method: 'GET'});
      let result = await rawResponse.json();
	  
	  let request = {
        query: {
          statement : 'SELECT system:SDREG_ID, system:SDSTA_ID FROM ' +result.objects[0].properties["system:objectTypeId"].localName + ' WHERE system:objectId='+result.objects[0].properties["system:objectId"].value,
          maxItems: 1
        }
      };
      const rawResponse1 = await fetch(`/api/dms/objects/search`, {
        method: 'POST',
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(request),
      });
      let result1 = await rawResponse1.json();
      return result1.objects[0];
    };
    let insert = async (properties, blob) => {
      let data = {
        objects: [
          {
            properties: properties,
            options: {
              CHECKOBLIGATION: 0,
            },
            contentStreams: [
              {
                mimeType: 'application/pdf',
                fileName: 'content.pdf',
                cid: 'cid_1',
              },
            ],
          },
        ],
      };
      const formData = new FormData();
      formData.append('data', new Blob([JSON.stringify(data)], { type: 'application/json' }), 'data.json');
      formData.append('cid_1', blob, 'content.pdf');
      const rawResponse = await fetch(`/api/dms/objects`, {
        method: 'POST',
        headers: {
          Accept: 'application/json',
        },
        body: formData,
      });
      return await rawResponse.json();
    };
    let confirm = (ranges) => {
      return new Promise(async (resolve, reject) => {
        let ui = instance.UI;
        let message = 'Das Dokument wird bei den folgenden Seiten aufgetrennt: \r\n\r\n';
        for (let range of ranges) {
          message += `- Von Seite ${range.start} bis ${range.end}\r\n`;
        }
        let result = await ui.showWarningMessage({
          title: 'Dokument auftrennen',
          message: message,
          confirmBtnText: 'Aufteilen',
          secondaryBtnText: 'Abbrechen',
          onConfirm: async () => {
            resolve(true);
          },
          onSecondary: async () => {
            resolve(false);
          },
          onCancel: () => {
            resolve(false);
          },
        });
      });
    };
    let success = (ranges) => {
        return new Promise(async (resolve, reject) => {
          let ui = instance.UI;
          let message = 'Das Dokument wurde erfolgreich aufgetrennt';
          let result = await ui.showWarningMessage({
            title: 'Auftrennung abgeschlossen',
            message: message,
            confirmBtnText: 'ok',
            onConfirm: async () => {
              resolve(true);
            },
            onCancel: () => {
              resolve(false);
            },
          });
        });
      };
    let extract = (from, to) => {
      return new Promise(async (resolve, reject) => {
        let doc = documentViewer.getDocument();
        let pagesToExtract = [];
        for (let i = from; i <= to; i++) {
          pagesToExtract.push(i);
        }
        let annotList = annotationManager.getAnnotationsList().filter((annot) => pagesToExtract.indexOf(annot.PageNumber) > -1);
        let xfdfString = await annotationManager.exportAnnotations({ annotList });
        let data = await doc.extractPages(pagesToExtract, xfdfString);
        let arr = new Uint8Array(data);
        let blob = new Blob([arr], { type: 'application/pdf' });
        resolve(blob);
      });
    };
    let pad = (num, places) => {
      return String(num).padStart(places, '0');
    };
    let onClick = async (selectedPageNumbers) => {
      if (selectedPageNumbers.length < 2) {
        instance.UI.showErrorMessage("Selectieren Sie mindestens zwei Seiten");
        return;
      }
      let pageCount = documentViewer.getPageCount();
      let ranges = [];
      for (let i = 0; i < selectedPageNumbers.length; i++) {
        let start = selectedPageNumbers[i];
        let end = selectedPageNumbers.length > i + 1 ? selectedPageNumbers[i + 1] - 1 : pageCount;
        ranges.push({ start: start, end: end });
      }
      let result = await confirm(ranges);
      if (!result) {
        return;
      }
      let sourceMetadata = await getMetadata(currentInfo.typeId, currentInfo.id);
      for (range of ranges) {
        let blob = await extract(range.start, range.end);
        let parentId = sourceMetadata.properties['system:SDREG_ID'].value != "0" ? sourceMetadata.properties['system:SDREG_ID'].value : sourceMetadata.properties['system:SDSTA_ID'].value;
        let properties = {
          'system:parentId': {
            value: parentId,
          },
          'system:objectTypeId': {
            value: currentInfo.typeId
          },
          //Name: { value: sourceMetadata.properties.Name.value + ' ' + pad(range.start, 4) + ' - ' + pad(range.end, 4) },
          //Type: { value: sourceMetadata.properties.Type.value },
        };
        for(let name of Object.keys(sourceMetadata.properties)){
            if(!name.startsWith("system:")){
                properties[name] = sourceMetadata.properties[name];
            }
        }
        await insert(properties, blob);
      }
      await success(ranges);
    };
    let buttons = [
      {
        type: 'customPageOperation',
        header: 'enaio',
        dataElement: 'customPageOperations',
        operations: [
          {
            title: 'Dokument auftrennen',
            img: '../../interceptors/scissors-solid.svg',
            onClick: async (selectedPageNumbers) => {
              await onClick(selectedPageNumbers);
            },
            dataElement: 'customPageOperationButton',
          },
        ],
      },
      { type: 'divider' },
    ];
    //instance.UI.pageManipulationOverlay.add(buttons);
    instance.UI.multiPageManipulationControls.add(buttons);
  },
  async updateEditorConfiguration(instance, info, config, viewer) {
    currentInfo = info;
    currentViewer = viewer;
    console.log('set currentInfo');
    instance.UI.enableElements(['thumbnailControl', 'documentControl']);
    instance.UI.enableFeatures(['ThumbnailMultiselect']);
    instance.UI.openElements(['leftPanel']);
  },
};
window.ed.registerInterceptor(extractPagesInterceptor);

Wichtig ist das hier

let insert = async (properties, blob) => {
let data = {
objects: [
{
properties: properties,
options: {
CHECKOBLIGATION: 0,
},
contentStreams: [
{
mimeType: ‚application/pdf‘,
fileName: ‚content.pdf‘,
cid: ‚cid_1‘,
},
],
},
],
};

Grüße
Patrick

1 „Gefällt mir“

Hi @p.wolf
Funktioniert super. Vielen DANK!