Import von Daten aus EloOffice 11 in Paperless NGX

Hallo zusammen,
Elo Digital stellt 2025 sämtlichen Support für EloOffice 11 (lokale Version) ein und bietet dafür eine neu zu erwerbende Lizenz für ein Elo Digital- Cloud Archiv an. Hat jemand Erfahrung mit einer - möglichst strukturierten - Übernahme der EloOffice 11 - Archivdaten in Paperless NGX?

Danke schon einmal

Ja ein Thema was auch mich beschäftigt. Nun Paperless-ngx kann nicht alle Dateiformate übernehmen.
Zum einen habe ich ersteinmal über den MobilConnector alle Ordner in windows kopiert. Nun überlege ich die Dateien neu ins Paperless-ngx zu bringen oder Elooffice mit 2024 abzuschließen und 2025 mit Paperless-ngx anzufangen. Elo Office wird erst zum 31.12.2026 eingestellt. Also noch einwenig Zeit um zu sehen wie es mit Paperless-ngx weitergeht. Bei mir stellen sich noch die Fragen
was mache ich mit den Dateien die Paperless-ngx nicht verarbeiten kann, wie bekomme ich die abgelegten Emails (msg) ins Paperless-ngx. Lohnt sich der doch sehr hohe Auswand ?
Außerdem muss ich erstmal mehr Informationen über die neue EloOffice Cloud Version haben um zu sehen ob es sinn macht oder nicht.

Etwas spät hier, aber ich stand vor Kurzem vor dem gleichen Problem. Bin dann zu bitfarm gewechselt, weil die ein kostenloses Tool für die Übernahme der Daten aus Elo anbieten. Der Funktionsumfang von bitfarm war gegenüber Elo sogar teilweise besser (E-Rechnung, usw…)

Leider kann man aktuell keine EloOffice (lokal)-Lizenz mehr kaufen, sonst hätte ich das gemacht, um den Umstieg zu testen.

Hat jemand zufällig eine übrig, die er uns zum Testen überlassen würde? Falls es nicht zu aufwendig ist, überlege ich, ein Tool zu schreiben, das zumindest einen Basis-Import zu paperless-ngx zulässt.

@Stefan
Ich hätte eine Lizenz übrig. Habe gerade die Alternative (cloud-Version) von Elooffice gelesen.
Hatte noch meine Bedenken meine Daten in eine Cloud zu übertragen. Das hat sich nun erledigt denn
beim Preis bin ich raus.
Stefan ich weiß nicht ob sich der Aufwand lohnt. Ich bin zum Beispiel ein Elooffice Benutzer der ersten Stunde. Habe zum Teil 15 Datei-Formate im Elo abgelegt. Wie geht man mit diesen Formaten in Paperless-ngx um. Habe auch Dateien die Verschlüsselt von Elooffice wurden.
Habe also nicht wirklich einen Plan was ich überhaupt mache und in welcher Richtung es gehen wird.

Als langjähriger ELO BP kann ich hier folgende Info geben.

Im Grunde gibt es ELOoffice 11 immer noch als Download (Support - ELOoffice Blog). Hier hat man aber die 500 Dokumente Limitierung. Unter Windows 11 gibt es dann ein paar schöne Fehlermeldungen beim Installieren und Aufrufen des Programms, es läuft aber. Verschlüsselte Dokumente kann man mittels Export exportieren. Wenn man die Dokumente Low-Level über die Datenbank holen möchte, kann man sich ein ggf. dyn. Register bauen und die verschlüsselten Dokumente in einen neuen Ordner verschieben per Automationsschnittstelle und dann exportieren. Oder ggf. mehrere Exporte über die Schnittstelle antriggern.

Für Paperless NGX muss man hier ggf. einen generischen Consumer einbinden, um alle Filetypen abzubilden.

Dokumente müsste man dann per Paperless NGX API hochladen.

Programmierkenntnisse sind hier für eine Migration erforderlich. Technisch gesehen ist es allerdings nicht sonderlich schwierig.

Edit: MSG-Dateien lassen sich ggf. vorab auch nach EML konvertieren.

Hallo, hat sich hier an dem Thema Migration ELOoffice noch mal etwas getan?
Stehe vor der Entscheidung von ELO auf Paperless zu wechseln. Habe ca. 30.000 Dokumente, da braucht es eine Script-gesteuerte Lösung und erstmal die “Befreiung” der Dateien und ihrer Schlagwörter aus dem ELO Kontext.

Bin erfahren in Python, SQL und was man sonst noch so braucht… Aber vielleicht hat sich jemand ja schon einmal die Arbeit gemacht.

VG
Wolfgang

Hallo, ich habe mich am Wochenende hingesetzt und ein SQL sowie Python Script geschrieben. Jetzt kann man seine Dateien und Schlagwörter wieder aus ELOoffice zurückgewinnen.

Im Ergebnis hat man im Windows Dateisystem dieselbe Ordner Struktur wie im ELO. Die PDF, TIF, DOC, MSG, … Dateien liegen wieder mit ihrem Namen bzw. der Kurzbezeichnung im Dateisystem vor. Daneben gibt es eine strukturierte XML pro Datei welches die Schlagwörter und Zusatzinfos aus ELO beinhaltet. Damit sollte man arbeiten und in jedes DMS überführen können. wichtig ist erst mal seine Originaldaten und Verschlagwortung mit dem Datum wieder im Zugriff zu haben. ich habe nahezu 30.000 Dokumente, da steckt jahrzehntelang Arbeit drin die wollte ich nicht verlieren.

was ich noch nicht habe, sind die Haft- und Randnotizen sowie die Verlinkung zwischen den Dokumenten und die Referenzen und deren Anhänge. Aber das wird nach einem weiteren Wochenende wohl auch gelöst sein. Problem ist das Re-Engineering der Datenbank ohne Unterlagen.

wenn jemand Interesse hat oder mich unterstützen möchte - gerne melden.

Viele Grüße

Wolfgang

Hallo Wolfgang,

schön zu hören, dass du schon so weit gekommen bist.
Bei 30.000 Dokumenten muss ich aber aus meiner Erfahrung mit Firmenkunden etwas bremsen:

Ab ca. 20.000 Dokumenten wird die Suche in paperless (und alles, was dazugehört) sehr langsam. Das liegt leider daran, dass mehrere Datenbanken als „Backend“ unterstützt werden und über das Django ORM sehr komplexe Abfragen getätigt werden, die mit steigender Zahl der Dokumente quasi exponentiell komplexer werden.

Das Thema ist den Entwicklern bekannt, aber aktuell anscheinend nicht Prio 1, da das für die meisten Instanzen einfach nicht zutrifft.

Wenn man sich jedoch auf ein einziges Datenbanksystem festlegt, wäre es möglich, das Problem zu patchen.

Melde dich gerne bei uns, wenn du / ihr damit Unterstützung benötigt. Ich wollte nur frühzeitig warnen, bevor du Wochen an Arbeit in die Migration zu paperless-ngx steckst und am Ende enttäuscht bist.

VG
Stefan

Hallo Stefan, Danke für den Hinweis und die Warnung.

Das ist mein privates Archiv und da sind bisher nur die letzten 10 Jahre drin. Seitdem ich mit der Digitalisierung angefangen habe und diese auch konsequent durchziehe wächst es pro Jahr um rund 3.000 - 3.500 Dokumente - Tendenz steigend. Wenn paperless-ngx da schon “schwächelt” ist es wohl für meinen Einsatzzweck nicht geeignet. So ein Archiv muss jahrezehntelang Bestand haben.
Der erste Eindruck von paperless war ganz positiv. Vielleicht finde ich über die Ostertage Zeit meine 30.000 PDFs der Engine für einen ersten Test zu geben. Dann sehe ich ja wie die Antowotzzeiten sind.

VG
Wolfgang

Gerne!

Schwächeln würde ich es nicht nennen, ist kein Problem von paperless an sich, sondern von der Unterstützung von vielen DB-Backends. Lässt sich wie gesagt beheben, dafür muss man aber vermutlich Unterstützung bekommen.

Und ja, teste es gerne und berichte. Wir haben eine Testinstanz mit über 20.000 Dokumenten versorgt und konnten mit Datenbank-Optimierungen dennoch recht gute Ergebnisse erzielen. Den Patch selbst haben wir noch gar nicht gebaut, weil bisher die Nachfrage danach nicht vorhanden war.

Moin Wolfgang :slight_smile:

Wäre es möglich, ein kleines (aktives, aktuelles) Archiv neben einem zweiten (“Für Altlasten”) zu führen? Viele Dokumente schaue ich kaum noch an (z. B. alte Lohnabrechnungen).

Ich verfolge diese Diskussion mit Spannung, da ich gerade dabei bin, mein Archiv / meine Archive aufzubauen.

VG

Stefan (a.k.a. Yamaneko)

Hallo, meinst Du ELOoffice oder Paperless-ngx?
Mehrere Archive kann eigentlich jedes gescheite DMS verwalten.

Die Architektur von paperless finde ich an und für sich ganz gut. Mich schreckt nur eher das Theater rund um Container und Datenbank Upgrade ab, wenn ich die Einträge hier im Forum so verfolge.
So ein Archiv muss jahrezehntelang verfügbar sein. Bei ELO habe ich mich 15 jahre lang um die Internas ncht kümmern müssen. Lief einfach auch über mehrere Migrationen und PCs von Windows 7 über Windows 10 und jetzt Windows 11.

Bin fast soweit mein eigenes Projekt zu starten, weil ich die Dokumente und Metadaten unter Kontrolle haben möchte. Alle mir bekannten DMS haben gravierende Nachteile oder hohe Kosten diesbezüglich. (ELOSmall Business, ecoDMS, M-Files, DocuWare, Bitfarm-GPL, OfficeManger, PaperOffice, …)

vg Wolfgang

Moin :slight_smile:

Ja, ich meine mehrere Instanzen von Paperless NGx parallel…

VG

Yamaneko

Hallo zusammen

Ich habe das selbe Problem bin auch gezwungener Umsteiger aus ELO11. Habe ca. 33000 Dokumente die ich bald vielleicht nicht mehr lesen kann.

Habe seit dem letzten Jahr nun umgestellt auf Paperless und war mehr als zufrieden. Leider etwas geschockt, wenn ich die Aussagen von Stefan sehe betreffend Dokumenten Anzahl. Bin ich doch in Paperless innerhalb einem Jahr schon wieder auf 2200 Dokumenten.

Gibt es dort keinen Weg?

Gruss

Christoph

Ich habe mir einen speziellen scaninput Ordner (Universal) angelegt. Dieser wird über eine Arbeitsaufgabe überwacht. Im Vorfeld werden die Felder in der Arbeitsaufgabe vorbelegt bzw. benutzerdefinierte Felder hinzugefügt und auch vorbelegt. Dann werden alle Dokumente im ELO z.B. für die Bank und Kontoauszüge makiert und über den Dialog speichern in den Scaninputordner Universal verarbeitet und ins Paperless abgelegt. Wenn die Kontoauszüge fertig und alle Kontoauszüge im Paperless sind dann hatte ich den Arbeitsablauf wieder neu angepasst und das ganze ging wieder von vorne los. Eine andere Lösung hatte ich damals nicht. Ich hatte im ELO über den ELO Connector das ganze Archiv über die Auswahl kopieren mir ins Windows geholt. So habe ich die ELO Struktur noch einmal im Windows.

Hallo zusammen,

ich habe auch mein Archiv aus ELOoffice 11 zu Paperless NGX migriert. Bei mir handelte es sich um ca. 10.000 TIF und PDF-Dokumente

Dabei bin ich wie folgt vorgegangen:

  1. Ich habe mir alle Dokumente aus dem ELOoffice Archiv in das Filesystem exportiert. Die Ordnerstruktur im ELOoffice wurde zur Verzeichnisstruktur. Den Dateinamen der exportierten Dokumente habe ich wie folgt formatiert: “DATUM”_Titel.”Dateinamenerweiterung”
  2. Diesen Ordner habe ich dann in Paperless NGX importiert. Dabei habe ich die Ordnernamen als Tags übernommen, das Datum aus dem Dateinamen als “Ausstellungsdatum”, den Titel als “Titel”, den Namen des Originals als “Media Dateinamen”.

Nun zu den Details:

Den Export aus dem ELOoffice habe ich mittels einem ELO-Skript gemacht, welches ich in einem Blog-Beitrag zum ELOoffice gefunden habe.

Dieses habe ich nach meinen Wünschen angepasst. Das einzige Problem waren Zeichen im Titel, die man nicht in einem Dateinamen verwenden konnte. Diese habe ich beim Export durch zwei aufeinanderfolgende Zeichen ersetzt, welche ich beim Import ins Paperless NGX wieder zurückverwandelt habe.

Da ich die Dokumente in ein Filesystem auf dem Mac exportiert habe, störten mich nur folgende Zeichen:

Der Doppelpunkt “:”=> ersetzt durch @1

Der Slash “/” => ersetzt durch @2

Beim Import im Paperless NGX habe ich ein PostConsumption Script verwendet, welches mir das “Ausstellungsdatum”, den “Titel” und den “Media Dateinamen” aus dem Dateinamen im Filesystem herausgelesen hat und auch die ersetzten Zeichen @1 und @2 wieder in die ursprünglichen Zeichen zurückübersetzt hat.

Ehrlich gesagt verwende ich die Ordnerstruktur immer nach als consume Ordner. Dies führt dazu, dass ich immer noch die alte Ordner-Struktur automatisch als Tag beim Importieren zugewiesen bekomme.

Die Zuordnung zu Korrespondenten und zu Ablagepfaden habe ich nach dem Import manuell gemacht.

Das geht relativ schnell, da man ja mittels Tags filtern kann und dann allen markierten Dokumenten einen Korrespondenten und/oder Ablagepfad zuordnen kann.

Anbei das angepasste ELO-Skript zum kompletten Export.

Hinweis:

Dieses Skript habe ich nicht selbst erstellt. Ich habe eine Vorlage aus dem Internet verwendet und es meinen Bedürfnissen angepasst!

Ihr müsst nur das Zielverzeichnis unter DestinationBase anpassen. Darin wird ein Ordner mit dem Namen CS.”YearFrom”-”YearTo” angelegt.

' Skript: DokumentenExport mit Eingabe Jahresbereich
' Autor: XXX
' Erstellt: 15.06.2010
' Letzte Änderung: 12.08.2022
'
' Dieses Skript läuft mittels der Klasse ScriptWalk
' Über alle Nachfolger eines Starteintrags und kopiert
' die Archivstruktur ins Dateisystem.

' Zur Fehlersuche:
'Dim Msg
'Msg = YearFrom & "#" & YearTo
'MsgBox Msg

Option Explicit

Const DestinationBase  = "T:\ELO-Export"
Const MaxFolder        = 32
Const ArchiveStartNode = 9999

Dim Callback, ELO, Exporter, FSO, StartId, Wait, YearFrom, YearSwap, YearTo

YearFrom = InputBox( "Jahr von" )
YearTo   = InputBox( "Jahr bis" )

If YearFrom = "" Then YearFrom = "1900"
If YearTo   = "" Then YearTo   = "2100"

If YearTo < YearFrom Then
  YearSwap = YearTo
  YearTo   = YearFrom
  YearFrom = YearSwap
End If

Set ELO = CreateObject("ELO.office")
Set FSO = CreateObject("Scripting.FileSystemObject")

StartId = ELO.GetEntryId(-1)

If StartId = 0 Then StartId = 1

If StartId > 0 Then

  Set Wait = New ExplorerWaitBar

  Call Wait.Show("Dokumentenexport", "Starte Export Vorgang")

  Set Callback = GetRef("ScriptWalk_Process")
  Set Exporter = new ScriptWalk

  Call Exporter.Walk(StartId, MaxFolder, Callback)
  Call ELO.Status("")
  Call Wait.Hide("Export abgeschlossen", 1000)

End If


'''''''''''''''''''''''''''''''''''''''''''''''
' Unterprogramme
'''''''''''''''''''''''''''''''''''''''''''''''
Sub ScriptWalk_Process

  Dim Year

  Exporter.LevelName = PrepareFilePath(Exporter.LevelName)

  Call ELO.Status(Exporter.LevelName)
  Call Wait.Update(Exporter.LevelName)

  If   (ELO.ObjTypeEx < MaxFolder) _
    Or (ELO.ObjTypeEx = ArchiveStartNode) Then

    CreateFolder

  Else

    Year = Mid(ELO.ObjXDate, 7, 4)

    If    Year >= YearFrom _ 
      And Year <= YearTo Then

      CopyFile

    End If

  End If

End Sub


Sub CreateFolder

  Dim ActPath, Destination, Name

  ActPath = Exporter.GetActPath

  If Exporter.LevelName = "CS" Then
    Exporter.LevelName = "CS." & YearFrom & "-" & YearTo
  End If

  Name               = LookupFolderName(DestinationBase, ActPath, Exporter.LevelName)
  Destination        = BuildName(DestinationBase, ActPath, Name, "")
  Exporter.LevelName = Name

  On Error Resume Next

  Call FSO.CreateFolder(Destination)

  If Err.Number > 0 Then
    call ELO.MsgBox(Err.Number & " " & Err.Description & vbCrLf & Destination, "ELO", vbOkOnly)
  End If

End Sub


Sub CopyFile

  Dim ActPath, Date, DateInv, Destination, Ext, Name, Name_ori, Retry, Source

  Source = ELO.GetDocumentPath(ELO.GetEntryId(-2), 0)

  If Source <> "" Then

    Ext         = ELO.SplitFileName(Source, 3)
    Ext         = LCase(Ext)
    ActPath     = Exporter.GetActPath
    Date        = ELO.ObjXDate
    DateInv     = Mid(Date, 7, 4) & "-" & Mid(Date, 4, 2) & "-" & Mid(Date, 1, 2)
    Name        = DateInv & " " & LookupFileName(DestinationBase, ActPath, Exporter.LevelName, Ext)
    Destination = BuildName(DestinationBase, ActPath, Name, Ext)
    Retry       = 1
    Name_ori    = Name

    While FSO.FileExists(Destination)
      Name        = Name_ori & " (" & Retry & ")"
      Destination = BuildName(DestinationBase, ActPath, Name, Ext)
      Retry       = Retry + 1
    Wend

    Exporter.LevelName = Name

    On Error Resume Next

    Call FSO.CopyFile(Source, Destination)

    If Err.Number > 0 Then
      call ELO.MsgBox(Err.Number & " " & Err.Description & vbCrLf & Destination, "ELO", vbOkOnly)
    End If

  End If

End Sub


Function LookupFolderName(Base, ActPath, FolderName)

  Dim Destination, FolderName_ori, Name, Retry

  Destination    = BuildName(Base, ActPath, FolderName, "")
  FolderName_ori = FolderName
  Retry          = 1

  While FSO.FolderExists(Destination)
    FolderName  = FolderName_ori & "(" & Retry & ")"
    Destination = BuildName(Base, ActPath, FolderName, "")
    Retry       = Retry + 1
  Wend

  ELO.DebugOut("New Folder: " & Destination)
  ELO.DebugOut("New Name: " & FolderName)

  LookupFolderName = FolderName

End Function


Function LookupFileName(Base, ActPath, FileName, Ext)

  Dim Destination, Name, Retry

  Destination = BuildName(Base, ActPath, FileName, Ext)
  Retry       = 1
  Name        = FileName

  While FSO.FileExists(Destination)
    FileName    = Name & "(" & Retry & ")"
    Destination = BuildName(Base, ActPath, FileName, Ext)
    Retry       = Retry + 1
  Wend

  ELO.DebugOut("New File: " & Destination)

  LookupFileName = FileName

End Function


Function BuildName(Base, Path, Name, Ext)
  BuildName = Base & Path & "\" & Name & Ext
End Function


Function PrepareFilePath(FilePath)

  Dim Reg

  Set Reg = New RegExp

  Reg.Global      = True
'  Reg.Pattern     = "[*:/?<>|\t\r\n]"
'  Reg.Pattern     = "[\:\/\n<>\?\"]"
  Reg.Pattern     = "[/]"
  PrepareFilePath = Reg.Replace(FilePath, "@1")
  Reg.Pattern     = "[:]"
  PrepareFilePath = Reg.Replace(PrepareFilePath, "@2")

End Function

'''''''''''''''''''''''''''''''''''''''''''''''
' Klassen
'''''''''''''''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''''''''''''''
' ScriptWalk
'''''''''''''''''''''''''''''''''''''''''''''''
Class ScriptWalk

  Private ActPath
  Private Level
  Private LocalMaxLevel
  Private M_LevelName
  Private ProcessFunction

  Public Sub Walk(StartId, MaxLevel, Callback)

    Level               = 0
    ActPath             = ""
    LocalMaxLevel       = MaxLevel
    Set ProcessFunction = Callback

    Call LocalWalk(StartId)

  End Sub

  Public Function GetActPath
    GetActPath = ActPath
  End Function

  Public Property Get LevelName
    LevelName = M_LevelName
  End Property

  Public Property Let LevelName(NewName)
    M_LevelName = NewName
  End Property

  Private Sub LocalWalk(StartId)

    Dim ChildList, ChildListString, i, Msg, OldPath

'   Zuerst den Eintrag selber einlesen und prüfen
    If ELO.PrepareObjectEx(StartId, 0, 0) < 0 Then

'     Der Eintrag konnte nicht gelesen werden, hier abbrechen
      Exit Sub

    End If

    M_LevelName = ELO.ObjShort

    Call ProcessFunction
 
'   Nun die Nachfolgerliste prüfen. Nur Ordner haben Nachfolger
    If (  (ELO.ObjTypeEx <= MaxFolder) _
      Or  (ELO.ObjTypeEx  = 9999)) _
      And (Level         <  LocalMaxLevel) Then

      ChildListString = ELO.CollectChildList(StartId)

      If ChildListString <> "" Then

        ChildList = Split(ChildListString, ":")

        Level   = Level + 1
        OldPath = ActPath
        ActPath = ActPath & "\" & M_LevelName

        For i = 0 to UBound(ChildList)

          If ChildList(i) <> "" Then
            Call LocalWalk(ChildList(i))
          End If

        Next

        Level   = Level - 1
        ActPath = OldPath

      End If

    End If

  End Sub

End Class

'''''''''''''''''''''''''''''''''''''''''''''''
' ExplorerWaitBar
'''''''''''''''''''''''''''''''''''''''''''''''

' Hier beginnt der Funktionsbereich für die Klasse der Statusanzeige
' Die Statusanzeige wird durch Methodenaufrufe in folgender Reihenfolge
' verwendet
'
'   Show
'   mehrfaches Update
'   Hide

Class ExplorerWaitBar

Private Explorer

Public Sub Show(Titel, StartMessage)

  Set Explorer = CreateObject("InternetExplorer.Application")

  Explorer.Navigate "about:blank"   

  Explorer.ToolBar   = 0
  Explorer.StatusBar = 0
  Explorer.Left      = 400
  Explorer.Top       = 300
  Explorer.Width     = 370
  Explorer.Height    = 160 

  Do While (Explorer.Busy)
    call ELO.Sleep(0, 200)
  Loop    

  Explorer.Visible = 1  

  call PrepareHtml(Titel, StartMessage)    
       
End Sub

Public Sub Update(Message)

  Dim Div, Doc

  Set Doc = Explorer.Document
  Set Div = Doc.getElementById("msg")

  Div.innerHTML = Message

End Sub

Public Sub Hide(ReadyMessage, ShowDelay)

  Explorer.Document.Body.InnerHTML = ReadyMessage

  call ELO.Sleep(0, ShowDelay)

  Explorer.Quit

End Sub

Private Sub PrepareHtml(Title, StartMessage)

  Dim Hdr, Body, Start, Doc

  Hdr ="<head><title>" & Title & "</title>" & _
       "<script type=""text/javascript"">" & _
       "var leftpos = 0;" & _
       "var innerpos = 0;" & _
       "var direction = 1;" & _
       "function tick() {" & _
       " var outer = document.getElementById(""outer"");" & _
       " var inner = document.getElementById(""inner"");" & _
       " if (inner && outer) {" & _
       " if (direction == 1) {" & _
       "   if (innerpos < 72) {" & _
       "     innerpos++;" & _
       "     inner.style.left = innerpos + ""px"";" & _
       "   } else {" & _
       "     leftpos++;" & _
       "     outer.style.left = leftpos + ""px"";" & _
       "     if (leftpos > 120) {" & _
       "       direction = -1;" & _
       "     }" & _
       "   }" & _
       " } else {" & _
       "   if (innerpos > 0) {" & _
       "     innerpos--;" & _
       "     inner.style.left = innerpos + ""px"";" & _
       "   } else {" & _
       "     leftpos--;" & _
       "     outer.style.left = leftpos + ""px"";" & _
       "     if (leftpos < 1) {" & _
       "       direction = 1;" & _
       "     }" & _
       "   }" & _
       " }" & _
       "}" & _
       "}" & _
       "</script></head>"

  Body = "<body scroll=""no"" onload=""setInterval('tick()', 20);"">" & _
         "<div style=""border:solid 1px;width:203px;color:#808080"">" & _
         "<div id=""outer"" style=""position:relative;left:0px;" & _
         "width:80px;background-color:#f0f0fa;height:30px"">" & _
         "<div id=""inner"" style=""position:relative;left:0px;width:8px;" & _
         "background-color:#00ff80;height:30px"">" & _
         "<div style=""position:relative;left:0px;width:4px;" & _ 
         "background-color:#ffc840;height:30px"">" & _
         " </div></div></div></div><div id=""msg"">" & _
         StartMessage & "</div></body>"

  Start   = "<html>" & Hdr & Body & "</html>"
  Set Doc = Explorer.Document

  Doc.Open

  Call Doc.Write(Start)

  Doc.Close

End Sub

End Class

Falls Interesse besteht, kann ich auch noch den Import in Paperless NGX genauer beschreiben.

1 „Gefällt mir“

@scharrin Danke für das Elo Script. Funktioniert auch soweit. Kannst du bitte auch den import ins Paperless zur Verfügung stellen.

Gruss Rene

Hallo,

ich bin nach folgender Anleitung vorgegangen (Punkte 0 - 4):

In Paperless NGX habe ich es über diese Umgebungsvariable aufgenommen:

PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS: true
PAPERLESS_POST_CONSUME_SCRIPT: /usr/src/paperless-ngx-postprocessor/post_consume_script.sh

Im Verzeichnis ../paperless-ngx-postprocessor/rulesets.d habe ich die Datei default.yml wie folgt angepasst (Vorlage war die example.yml, welche ich nach .ori umbenannt habe):

Some Ruleset Name:
  match: "{{ correspondent == 'The Bank' and document_type == 'Transfer Confirmation' }}"
  metadata_regex: '(?:From (?P<source>.*?)\n)|(?:through (?P<created_month>\w*?) (?P<created_day>
\d{1,2}), (?P<created_year>\d{2}))'
  metadata_postprocessing:
    created_year: "{{ created_year | expand_two_digit_year }}" # This uses the 'expand_year' filt
er, which will take a two-digit year like 57 and turn it into a four-digit year like 2057
    source: '{{ source | title }}' # This applies the Jinja2 'title' filter, capitalizing each wo
rd
    title: '{{created_year}}-{{created_month}}-{{created_day}} -- {{correspondent}} -- {{document
_type}} (from {{ source }})'
---
# You can put multiple rules in the same file if you want
# Note that rules are applied in order, so any changes from this rule will overwrite changes from
 previous rules
Some Other Ruleset Name:
  # This will always match
  match: False
  metadata_postprocessing:
    title: '{{created_year}}-{{created_month}}-{{created_day}} -- {{correspondent}} -- {{document
_type}}'
---
Parse creation date from filename:
  # Matches all documents with a title starting with a date in iso format followed by a space
  # title: "2020-01-31 important document"
  match: '{{ title | regex_match("\d{4}-\d\d-\d\d ") }}'
  metadata_postprocessing:
    title_old:     '{{ title }}' # saved as temporary value

    title_old1:    '{{ title_old  | regex_sub("@1", "/") }}' # Ersetze @1 durch /
    title_old2:    '{{ title_old1 | regex_sub("@2", ":") }}' # Ersetze @2 durch :
    title:         '{{ title_old2 | regex_sub("^(?P<created_year>\d{4})-(?P<created_month>\d{2})-
(?P<created_day>\d{2}) (?P<title>.*)$", "\g<title>") }}'

    created_year:  '{{ title_old | regex_sub("^(?P<created_year>\d{4})-(?P<created_month>\d{2})-(
?P<created_day>\d{2}) (?P<title>.*)$", "\g<created_year>") }}'
    created_month: '{{ title_old | regex_sub("^(?P<created_year>\d{4})-(?P<created_month>\d{2})-(
?P<created_day>\d{2}) (?P<title>.*)$", "\g<created_month>") }}'
    created_day:   '{{ title_old | regex_sub("^(?P<created_year>\d{4})-(?P<created_month>\d{2})-(
?P<created_day>\d{2}) (?P<title>.*)$", "\g<created_day>") }}'
#  validation_rule: '{{ num_documents(correspondent=correspondent, document_type=document_type, c
reated_date_object=created_date_object) == 1 }}'

Die Zeilen mit:

title_old1

und

title_old2

machen die Ersetzung der Sonderzeichen : und / rückgängig

Viele Grüße

Christian