docx lässt sich nicht entpacken

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

docx lässt sich nicht entpacken

Beitrag von Stephan »

Hallo,

beim Versuch ein docx (das ja auch nur ein zip ist, ähnlich odt) liefert folgendes Makro (das für odt, ods, ... funktioniert, siehe z.B. viewtopic.php?f=25&t=65927) die Fehlermeldung (getestet in OOo 3.3.0 und AOO 4.1.2):
zip-fehler.gif
zip-fehler.gif (16.21 KiB) 6212 mal betrachtet
in Zeile:

Code: Alles auswählen

z.initialize(args())

Code: Alles auswählen

Sub initialisieren()
Dim args(0)
tmp = ermittle_pfad()
z = createUnoService("com.sun.star.packages.Package")
args(0) = ThisComponent.URL
If right(args(0), 4) <> "docx" Then
		Msgbox "Das aktuelle Dokument ist kein docx, Makro wird beendet", 16, "kein docx"
		Exit Sub
	Else	
		z.initialize(args())
		ebene = z.getByHierarchicalName("media")
		alles = ebene.getElementNames()
		schreiben = createUnoService("com.sun.star.ucb.SimpleFileAccess")
		For i = LBOUND(alles()) To UBOUND(alles())
		 stream = z.getByHierarchicalName("media/" & alles(i)).GetInputStream()
		 schreiben.WriteFile(tmp & "/media/" & alles(i), stream)
		Next i
End If
End Sub

Function ermittle_pfad()
pfad = createUnoService("com.sun.star.util.PathSettings")
ermittle_pfad = pfad.temp
End Function

Hat jemand eine Lösung wie ich das docx mit OO-Makro (ohne Zusatzsoftware) entpackt bekomme? (mit z.B. 7zip geht das und ich könnte mittels Makro z.B. pkzip nutzen, würde aber gerne mit OO-Bordmitteln auskommen)


Anmerkung:
Die Zeile "ebene = z.getByHierarchicalName("media")" ist nicht korrekt und müsste wohl heissen "ebene = z.getByHierarchicalName("word/media")" aber wie oben beschrieben tritt ja der angefragte Fehler schon davor auf, so das zunächst dieser Fehler eine Lösung brauchte

Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: docx lässt sich nicht entpacken

Beitrag von balu »

Hallo Stephan,

wirklich weiterhelfen in Form einer Lösung kann nicht. Aber dafür meine Beobachtungen mitteilen.

Doch zuvor ein paar andere Worte.
Ich wollte es erst gar nicht glauben, das Du ein StarBasic Makro in einer docx ausführen willst.
Also musste ich mir erstmal ein einfaches docx von irgendwo her aus dem I-Net downloaden (kann unter AOO keins erstellen oder speichern), was kein Problem war. Dann habe ich das in AOO 4.1.2_rc4 geöffnet und dort das Makro eingefügt, aber NICHT gespeichert. Anschließend das Makro ausgeführt, und bekam fast die gleiche Fehlermeldung (darauf komme ich nachher noch mal zurück).

Jetzt dachte ich mir, das die Fehlermeldung wohl daher kommt weil es ja keine ODF-Datei ist. Also mal XRAY (Rev 5.2) befragt was ich denn unter ThisComponent zu lesen bekomme. Und ich war erstaunt was ich da so alles zum lesen bekam. Obwohl ich ja fast ausschließlich mit Calc arbeite, war mir sehr schnell bewusst, das XRAY auch infos aus der docx auslesen kann. Nun ja, in dieser Hinsicht war ich bis jetzt absolut unerfahren. Wieder etwas neues dazu gelernt.

So, und nun zu meiner Beobachtung, inklusive der Fehlermeldung.
Erst dachte ich noch das es in einem docx kein initialize gibt, doch dem war nicht so. Ich musste erstmal suchen, habe es aber dann doch noch gefunden. Also kann man erster Gedanke "Das initialize gibts nicht" nicht zutreffen. Aber was kann ich denn sonst noch vielleicht beitragen?

Und beim genaueren betrachten meiner Fehlermeldung war mir erst mal folgendes aufgefallen.
In deiner Fehlermeldung kann man lesen: ZipPackage.cxx: :766; Bad Zip File..
In meiner Fehlermeldung steht am Ende: ZipPackage.cxx:<unkown>:800; Bad Zip File..
Warum bei mir <unkown> steht, und bei dir nicht, ist mir ein Rätsel welches aber wohl nicht so sehr von Bedeutung ist, vermute ich jetzt mal.

Aber dann schaute ich mir die gesamte Zeile mit dem Pfad noch mal etwas genauer an, und kamm dann mächtig ins grübeln.
Ich wollte eigentlich nach der 'ZipPackage.cxx' suchen, aber wo ist die denn eigentlich genau?
Na nu!?
Da steht der Pfad C:/AOO/...
Ich gucke aufs Laufwerk C und sehe dort nirgends ein Verzeichnis AOO. Ich wusste es ganz genau das ich dort kein solches Verzeichnis angelegt habe, da die AOO 4.x.x (habe mehrere) alle "Portable" sind, und auf einem anderen Laufwerksbuchstaben (andere Partition) der gleichen Platte liegen.
Also Frage ich mich jetzt ernsthaft: "Wie kommt die Pfadangabe in der Fehlermeldung zustande?"

Habe eben noch mal das Makro ausgeführt, aber Parallel dazu den Dateimanger beobachtet ob kurzzeitig ein temporäres Verzeichnis AOO auf C: angelegt wurde. Ergebnis: Es wird kein Verzeichnis angelegt. Zumindest nicht in der aufgeführten Pfadangabe.

Hier meine Fehlermeldung.
Fehlermeldung-balu.jpg
Fehlermeldung-balu.jpg (34.58 KiB) 6182 mal betrachtet
Vielleicht wird wegen dem docx ein anderes Verzeichnis erstellt, oder darauf zugegriffen, was vom ODF-Format irgendwie abweicht. Ich weiß es nicht und habe echt keine Ahnung.

So, lieber Stephan, viel Text meinerseits, aber mehr kann ich dir momentan nicht Helfen oder Unterstützung anbieten bei deinem Problem.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: docx lässt sich nicht entpacken

Beitrag von balu »

Hallo Stephan,

hab da eben noch mal etwas rumgespielt und dabei eine komische Sache beobachtet.

Habe aus deinem verlinkten Beitrag die "ODFverwenden.ods" gedownloaded.
Anschließend in dem dortigen Makro im folgendem Abschnitt

Code: Alles auswählen

tmp = ermittle_pfad()
z = _
createUnoService("com.sun.star.packages.Package")
args(0) = ThisComponent.URL
z.initialize(Args())
ebene = z.getByHierarchicalName("hilfe")
alles = ebene.getElementNames()
schreiben = _
eine kleinigkeit eingefügt, und zwar

Code: Alles auswählen

print z.initialize(Args())
Dadurch sieht der Codeabschnitt jetzt wie folgt aus.

Code: Alles auswählen

tmp = ermittle_pfad()
z = _
createUnoService("com.sun.star.packages.Package")
args(0) = ThisComponent.URL
z.initialize(Args())
print z.initialize(Args()) '<--- hier die eingefügte Zeile'
ebene = z.getByHierarchicalName("hilfe")
alles = ebene.getElementNames()
schreiben = _
Okay, und nun habe ich im Basic-Editor das Makro ausgeführt. Ich hatte schon vorher so einen Verdacht das dies zu einem Fehler führen wird, aber welcher das war die Frage.
Will dich nicht lange auf die Folter Spannen:
Es ist ABSOLUT EXAKT die gleiche Fehlermeldung wie ich vorhin im Screenshot gezeigt hatte.

Ja, ich weiß das dies eine "blöde" spielerei war, aber ich wußte ja nicht was mich erwartete. Ich hatte damit gerechnet das da irgendeine andere Fehlermeldung dabei rauskommt, so was in der Art von: IndexOutOfBound, oder ungültiger Zugriff, oder irgendetwas anderes halt was man schon sehr oft gesehen und gelesen hatte.

Und wenn ich die PRINT Anweisung in deinem hiesigen Code an dieser Stelle einfüge

Code: Alles auswählen

z = createUnoService("com.sun.star.packages.Package")
args(0) = ThisComponent.URL
print z.initialize(args()) '<--- hier die eingefügte Zeile'
Dann kommt es auch hier zu der exakt gleichen Fehlermeldung.

Auch wenn es wohl nicht hilfreich war, so wollte ich dir das doch zumindest mitgeteilt haben.

Wünsche dir viel Glück bei deiner Fehleranalyse.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: docx lässt sich nicht entpacken

Beitrag von Stephan »

Hallo Balu,
Ich wollte es erst gar nicht glauben, das Du ein StarBasic Makro in einer docx ausführen willst.


Nö, will ich garnicht, das Makro ist im Bereich "meine Makros" gespeichert. (aber Du hast ja festgestellt wie das prinzipiell (eingeschränkt) in einer docx Datei auch ginge)
Ich wollte eigentlich nach der 'ZipPackage.cxx' suchen, aber wo ist die denn eigentlich genau?
das cxx weist, meiner Meinung nach, darauf hin das das eine C++-Quelltextdatei von OpenOffice selbst ist, also schlicht ein Stück Code das zum Programm OO gehört. Physisch ist dieser Code in kompilierter Form (in Windows) also in einer der dlls von OO und der Pfad C:/AOO/... verweist nur auf den Pfad wo sie diese Quellcodedatei vor dem Kompillieren von OO befand.



Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: docx lässt sich nicht entpacken

Beitrag von balu »

Hallo Stephan,
das Makro ist im Bereich "meine Makros" gespeichert.
Ach jo! Hatte ich gar nicht mehr dran gedacht, weil ich bis jetzt fast ausschließlich Dokument gebunden Makros speichere.


... und der Pfad C:/AOO/... verweist nur auf den Pfad wo sie diese Quellcodedatei vor dem Kompillieren von OO befand.
Ja okay, ich verstehe was Du meinst. Das beim installieren von OO ein bestimmter temporärer Pfad angelegt wird, der nach der installation wieder gelöscht wird, aber trotzdem noch in der Win-Regestrie irgendwo festgehalten wird.


Ich weiß ja jetzt nicht ob Du dich auch schon in den englischen Foren oder Mailinglisten umgeschaut hast, aber ich hatte eben bei der Tante goggele folgendes eingegeben: ooo ZipPackage.cxx
Natürlich massenweise alles in englisch, aber trotzdem hatte ich da das eine oder andere angeklickt und schlußendlich bin ich bei https://www.mail-archive.com/dev@openoffice.org/ gelandet. Und so rein zufälliger weise gibts da einen Faden mit genau dem gleichem Problem wie Du es hast, jedoch nicht mit docx aber die Fehlermeldung ist identisch. Obwohl alles in englisch konnte ich das sinngemäß irgendwie verstehen. Und die letzte Antwort lautet sinngemäß wie folgt.

Wenn die Datei wirklich in Ordnung ist, dann könnte das Problem darin bestehen das das Archivformat META-INF/manifest.xml voraussetzt. Und um ein Archiv zu erstellen das das ZIP-Format unterstüzt, sollte man folgendes einbauen.

Code: Alles auswählen

aNamedValue.Name = "PackageFormat"
aNamedValue.Value = false
Damit würde dann ein Archiv erstellt, welches ein Standardübliches ZIP wäre, oder so ähnlich.[/i]

Da ja dein englisch wohl besser ist als meines, empfehle ich dir den Faden selber durchzulesen.
Eröffnungsbeitrag.
https://www.mail-archive.com/dev@openof ... 12893.html

Letzte Antwort, was ich eben sinngemäß wiedergegeben habe.
https://www.mail-archive.com/dev@openof ... 12920.html

Wo diese Änderung eingebaut werden müsste, weiß ich nicht, habe ich jetzt nicht getestet. Aber vielleicht hilft dir das ja jetzt auf die eine oder andere Art und Weise, und wenn es vielleicht auch nur ein Denkanstoß ist. Ich drück dir auf jeden Fall beide Daumen :)



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: docx lässt sich nicht entpacken

Beitrag von Stephan »

Hallo Balu,
Ja okay, ich verstehe was Du meinst. Das beim installieren von OO ein bestimmter temporärer Pfad angelegt wird, der nach der installation wieder gelöscht wird, aber trotzdem noch in der Win-Regestrie irgendwo festgehalten wird.
Es ist für das eigentliche Thema nicht wichtig, aber nein, ich meine etwas ganz Anderes, nämlich Kompilieren, also das Übersetzen von Programmquellcode in (letztlich) ausführbaren Maschinencode, also (unter Windows) physisch quasi das Erzeugen von z.B. *.dll und *.exe Dateien ausgehend von dem vom Programmierer geschriebenen Code.

z.B. siehe:
https://de.wikipedia.org/wiki/Compiler
https://de.wikipedia.org/wiki/Maschinensprache


Gruß
Stephan
Axel Richter
****
Beiträge: 159
Registriert: So, 17.10.2010 16:54

Re: docx lässt sich nicht entpacken

Beitrag von Axel Richter »

Hallo Stephan
beim Versuch ein docx (das ja auch nur ein zip ist, ähnlich odt) liefert folgendes Makro (das für odt, ods, ... funktioniert, siehe z.B. viewtopic.php?f=25&t=65927) die Fehlermeldung (getestet in OOo 3.3.0 und AOO 4.1.2):
Das wird so nicht gehen. Beim

Code: Alles auswählen

Package.initialize
wird nicht einfach nur das ZIP geöffnet, sondern es wird versucht ein OpenDocument-Package zu erstellen. Dafür muss in dem ZIP aber ein

Code: Alles auswählen

META-INF/manifest.xml
sein. Das ist bei *.docx aber nicht der Fall.

Jetzt bin ich dazu gekommen, das mal auszuprobieren. Mit https://www.openoffice.org/api/docs/com ... ccess.html sollte es gehen.

Code: Alles auswählen

ZipFileAccess.initialize
initialisiert nur ein einfaches ZIP.

Code: Alles auswählen

Sub initialisieren()
Dim args(0)
tmp = ermittle_pfad()
z = createUnoService("com.sun.star.packages.zip.ZipFileAccess")
args(0) = ThisComponent.URL
If right(args(0), 4) <> "docx" Then
      Msgbox "Das aktuelle Dokument ist kein docx, Makro wird beendet", 16, "kein docx"
      Exit Sub
   Else   
      z.initialize(args())
      alles = z.getElementNames()
      schreiben = createUnoService("com.sun.star.ucb.SimpleFileAccess")
      For i = LBOUND(alles()) To UBOUND(alles())
       stream = z.getByName(alles(i))
       schreiben.WriteFile(tmp & "/media/" & alles(i), stream)
      Next i
End If
End Sub

Function ermittle_pfad()
pfad = createUnoService("com.sun.star.util.PathSettings")
ermittle_pfad = pfad.temp
End Function
viele Grüße

Axel
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: docx lässt sich nicht entpacken

Beitrag von Stephan »

Hallo Axel,
Das wird so nicht gehen.


das hatte ich gestern nur von unterwegs gelesen und das "so" gab mir gewisse Hoffnung.

Nun da ich wieder hier im Büro sitze sehe ich zu Meiner Freude das Du inzwischen Deinen Post um einen Lösungsvorschlag erweitert hast, danke ich werde es ausprobieren und ich schreibe hier in den Thread ob es geklappt hat.

Ehrlich gesagt bin ich über mich selbst erstaunt denn ich habe in den letzten mehr als zehn Jahren OpenOffice immer wieder zum Zippen und Entzippen (in Makroprojekten) genutzt, aber komischerweise augenscheinlich nur für 'passende' zip (nicht nur ODF-Dateien sondern auch oxt)


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: docx lässt sich nicht entpacken

Beitrag von Stephan »

Hallo Axel,

so, ich habe Deinen Code ausprobiert und der funktioniert prima. Somit vielen Dank für Deine Hilfe.



Gruß
Stephan
Antworten