Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Wieczorrek am 07.08.06 - 09:05:55
-
Guten Morgen,
ich habe zu meinem Problem schon viel gelesen, aber noch nichts sinnvolles gefunden, vielleicht weiss hier jemand etwas.
Ich habe ein Datenbank, die wurde ursprünglich bereits 1999, also unter 4.6 erstellt. In den meisten Dokumenten gibt es ein (oder mehrere) Bild(er). Diese Bilder wurden in der Regel als jpg oder gif über den "Import" Befehl eingefügt. Es gibt aber auch Bilder, die per cut/paste mit STRG+V eingefügt wurden. Ich muss diese Bilder unter dem Dateinamen url_1.jpg oder .gif auf Platte bannen. Aktuell verwende ich die Version 7.01.
Da Notes meines Wissens nach immer noch keine Funktionen zum Bearbeiten eingebetteter Bilder bietet, gehe ich folgenden Weg:
Schleife über alle Dokumente, jedes Dokument durch den Exporter nudeln und im XML Code die Bilder ausschnipseln (und dann decodieren). Das geht auch ganz gut. Jedenfalls mit 70% meiner Dokumente. Bei den restlichen 30% macht der Exporter aber die Grätsche mit der wenig hilfreichen Fehlermeldung "Operation failed".
Wenn ich die LOG Meldung auslese, kann ich noch eine halbe NOTES-ID auslesen und bekomme den Hinweis "Invalid parameter".
Wenn ich über die NOTES-ID das problemverursachende Dokument ganz, ganz genau ansehe, dann stelle ich nichts ungewöhnliches fest. Es läßt sich öffnen, schließen, verändern, löschen usw. Nur eben nicht DXL-exportieren.
Kennt jemand eine Lösung?
Oder alternativ: Kann ich aus Lotus-Script die Formelsprache aufrufen? Warum? In der Formelsprache gibt es einen Befehl (sinngemäß) Document.ExportAsRTF. Aus dieser RTF-Datei kann ich auch Bilder ausschnipseln. Leider kennt Lotus-Script diese Funktion nicht.
Gruß
Carsten Wieczorrek
-
Hallo Carsten,
Du kannst aus Lotusscript Formelsprache aufrufen. Stichwort ist 'Evaluate'. Schau Dir noch einmal in der Hilfe ganuer an...
Der Syntax dazu lautet:
variant = notesSession.Evaluate( formula$, doc )
Bsp:
Dim.... as...
....
formel = {_values := eintraege; @If(_values != ""; @Sort(@Trim(@Left(_values; "§") + " (") + @ReplaceSubstring(@Right(_values; "$"); "!!" : "&&"; "%") + ")"); "")}
Call doc.ReplaceItemValue("dsp_source", Evaluate(formel, doc))
Ob Dir das Deinem Problem mit DXL weiter hilft, kann ich Dir allerdings nicht sagen...
Gruß!
-
Hallo Frischling,
ich habe also doch nicht alles komplett beschrieben.
Ja, man kann die Formelssprache mit NotesScript verwenden, aber leider nicht innerhalb eines Agenten. Ich will die Dokumente ja nicht manuell anklicken.
Gruß
Carsten
-
Wo steht denn, dass man EVALUATE nicht in Agenten einsetzen darf ?
-
Vermutlich handelt es sich bei der gewünschten Funktion um @Command( [FileExport] ) und @Commands können nicht zusammen mit Evaluate verwendet werden.
Ich habe mal sowas ähnliches wie deine Alternativlösung gemacht. Grob sah das so aus und hat recht gut funktioniert:
- Maske erstellen, die die Felder enthält, in denen die Bilder sind
- Im Postopen-Event der Maske den @Command( [FileExport] ) Befehl einbauen (Filenamen aus Dokument-Id und Endung zusammenbauen)
- Per LotusScript oder Formel (weiß nicht mehr genau) die gewählten Dokumente durchlaufen
- Für jedes Dokument: temporär die neue Maske zuweisen, Dokument öffnen und schließen (im Frontend)
Beim Öffnen des Dokuments wird das Dokument dann in eine Datei exportiert.
Wie gesagt, schon lange her, aber so in der Art sollte es funktionieren.
Besser wäre natürlich, den Fehler beim DXL-Export zu finden. Wahrscheinlich aber auch viel aufwändiger.
-
Hallo Thomas,
Deine Vermutung ist natürlich richtig, es handelt sich um @Command( [FileExport] ).
Die Idee mit dem PostOpen werde ich versuchen.
Obwohl ich schon sagen muß, nur um ein Bild zu speichern ist der Weg über den Exporter und ausschnibbeln und decodieren usw schon so was von Hinten durch die Brust ins Auge, das mir für diese Möglichkeit kein Kommentar mehr einfällt.
Ich werde das Ergebnis mitteilen.
Gruß
Carsten
-
Hallo Carsten, mit welchen Einstellungen verwendest Du denn den DXLExporter? Weisst Du an welcher Stelle der Fehler auftritt? Beim Export, beim Ausschneiden oder beim Decodieren?
Jochen
-
Guten Morgen Jochen,
ich habe alle Einstellungen durchprobiert, hat leider keinen Einfluss auf den Fehler.
DIM exportstring as string
exportstring = exporter.export(Dokument)
Der Fehler erfolgt unmittelbar nach der zweiten Zeile. Error$ liefert nur "operation failed" und der exporter.log "invalid parameter".
Ich habe mittlerweile dass Gefühl, das der Fehler bei allen Dokumenten auftritt, in die mittels STRG+V ein CorelDraw Bild eingefügt wurde. DIB sollte zwar gleich DIB sein, aber irgend etwas ist ja wohl anders an diesen Dokumenten.
Gruß
Carsten
-
Für alle, die es interessiert, hier die oder eine Lösung des Problems:
1. In eine Form- oder Subform der Dokumente mit den Bildern in das PostOpen Ereignis folgende Formel setzen:
@Command[(FileExport]; "Microsoft RTF"; "gewünschter dateipfad\dateiname.rtf");
@Command([RunAgent]; "(closewindow)")
2. Einen (2.) Agenten (closewindow) erstellen mit folgendem Inhalt:
Dim ws as NotesUIWorkspace
Dim ud as NotesUIDocument
Sub initialize
Set ws = New NotesUIWorkspace
Set ud = ws.currentdocument
if Not ud Is Nothing then ud.close
End Sub
3. In dem eigentlichen Arbeitsagenten steht dann in etwa
Dim ws as New NotesUIWorkspace
Sub BilderExportieren
On Error Goto Fehler ' ganz wichtig!
Set Doks = Datenbank.AllDocuments
For Z = 1 to Doks.Count
Set Dok = Doks.GetNthDocument(z)
ExportText = XMLExporter.Export(Dok)
ab hier Code zum ausschnippeln der Bilder aus der XML Datei
und Decodieren + Speichern der Bilder
Next
Exit Sub
Fehler:
ws.EditDocument(True, Dok)
Resume Next
End Sub
So, was passiert ist folgendes: Der Arbeitsagent geht über alle Dokumente und schiebt sie in den Exporter. Wenn alles OK ist, wird eine XML-Datei erstellt. Wenn der Exporter die Grätsche macht, wird im On Error - Teil das fehlerverursachende Dokument geöffnet.
Im PostOpen-Event erstellt das defekte Dokument selber eine RTF-Datei. Leider mag es das Dokument nicht, im PostOpen ein CloseWindow zu finden (wird ignoriert), auch kann der aufrufende Agent nicht das zugehörige UIDocument erreichen. Also öffnet das PostOpen den zweiten Agenten, welcher dann das Dokument schließt.
Das ist aber nur Theorie. In der Praxis macht Notes nach etwa 250 Dokumenten komplett die Grätsche (rotes Fenster oder irgendwo im Datennirvana, hilft nur neu Booten, diese Schleife gibt dem GarbageCollector wohl keine große Chance). Also in einer LOG-Datei bei jedem Durchgang die Variable Z abspeichern und beim nächsten Start von Notes nicht bei 0 sondern bei z+1 beginnen. So bekommt man von allen nicht XML-Exportierten Dokumenten ein RTF.
Leider sind die Bilddaten im RTF nicht Base64 codiert. Also hier noch ein wenig vb.net code, um an die Bilder zu gelangen
Dim Bild As Image
Dim wApp as Word.Application
Dim wDok as Word.Dokument
Dim Dateien() as String
Dateien = Directory.GetFiles(RTF-Pfad)
wApp = New Word.Dokument
For Z = 0 To Dateien.GetUpperBound(0)
wApp.Documents.Open(CObj(Dateien(Z)))
wDoc = wApp.Documents(1)
For I = 1 To wDoc.Sections.Count
For J = 1 To wDoc.Sections(I).Range.InlineShapes.Count
wDoc.Sections(I).Range.InlineShapes(J).Range.CopyAsPicture
Bild = Clipboard.GetImage
Bild.Save(gewünschter Bildpfad)
Next
Next
wDoc.Close
Next
wApp.Quit
Verdammt viel Aufwand, um Bilder aus Notes zu exportieren, aber ich habe jetzt alle.
Gruß
Carsten Wieczorrek
-
Tschuldigung, Zeile 6 des .net Codes lautet natürlich
wApp = New Word.Application
Gruß
Carsten
-
Wenn du an dein UD.close noch ein (true) anhängst, sollte sich die Redbox von alleine erledigen.
-
Dieser neue Parameter wurde extra bei R6 eingeführt, um das unselige Verhalten von R4 und R5 in diesem Punkt zu verbessern. Meistens klappt das auch ;)
Bernhard
PS: 250 Dokumente ist aber auch schon eine stattliche Verbesserung in R6 gegenüber R5 ;D