PowerPoint Automatisierung, Typen-Problem (win32com)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
goermezer
User
Beiträge: 15
Registriert: Dienstag 18. Januar 2005, 21:07
Kontaktdaten:

Hi Leute,

jetzt muss ich mich mit meinem Problem doch noch an Euch wenden:

Ich möchte mit PowerPoint 2007 (mit installiertem PDF u. XPS-Plugin) ein simples PDF exportieren. Das geht mit der SaveAs-Methode oder mit ExportAsFixedFormat. Wobei mit der SaveAs-Methode keine Qualitätseinstellung berücksichtigt wird. Daher möchte ich es mit der anderen Variante machen.

ExportAsFixedFormat akzeptiert u.a. zwei Argumente, die in Python anscheinend als Python-Objekt übergeben werden müssen:

Sub ExportAsFixedFormat(Path As String, FixedFormatType As PpFixedFormatType, [Intent As PpFixedFormatIntent = ppFixedFormatIntentScreen], ...)

VB akzeptiert für FixedFormatType und Intent auch Ints (beide=2). Wie mache ich das in Python ? Kann mir da jemand helfen ?

Dies habe ich vor:

Code: Alles auswählen

import win32com.client

myPowerpoint = win32com.client.Dispatch('Powerpoint.Application')
myPowerpoint.Activate()
myPresentation = myPowerpoint.Presentations.Open("C:\\testdokumente\\ppt\\Praesentation.ppt")

myPowerpoint.ActivePresentation.ExportAsFixedFormat(Path="c:\\mypdf.pdf", FixedFormatType=2, Intent=2)
[/code]
http://www.goermezer.de
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Schau Dir mal gencache und constants in der win32com.client-Doku an. Das sollte helfen.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
goermezer
User
Beiträge: 15
Registriert: Dienstag 18. Januar 2005, 21:07
Kontaktdaten:

Hallo,

das ist mir klar. Entweder gebe ich dort constants mit, oder trage idR. Ints ein. Das geht aber hier nicht, da keine constants erwartet werden, sondern objects.

Am besten mal ausprobieren, dann wird`s deutlicher...
http://www.goermezer.de
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Ich hab kein Powerpoint 2007. Wie wär's wenn Du die entsprechende Fehlermeldung einfach mitpostest?
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
goermezer
User
Beiträge: 15
Registriert: Dienstag 18. Januar 2005, 21:07
Kontaktdaten:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Dokumente und Einstellungen\mgo\Desktop\test.py", line 7, in <module>
    myPowerpoint.ActivePresentation.ExportAsFixedFormat(Path="c:\\mypdf.pdf", FixedFormatType=2, Intent=2)
  File "C:\Python25\lib\site-packages\win32com\gen_py\91493440-5A91-11CF-8700-00AA0060263Bx0x2x9.py", line 7866, in ExportAsFixedFormat
    , KeepIRMSettings, DocStructureTags, BitmapMissingFonts, UseISO19005_1, ExternalExporter
  File "C:\Python25\lib\site-packages\win32com\client\__init__.py", line 448, in _ApplyTypes_
    dispid, 0, wFlags, retType, argTypes, *args),
ValueError: argument is not a COM object
http://www.goermezer.de
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Yo, das kommt mir schon bekannt vor. Wie gesagt: probiers mit gencache und constants. Mit den Namen hat das bei mir allerdings nicht geklappt. Ich musste einfach alle möglichen Argumente, notfalls mit dem Defaultwert, in der richtigen Reihenfolge angeben.

Die Fehlermeldungen, die über COM zurückgegeben werden, darf man leider nicht immer so wörtlich nehmen. :-/
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
goermezer
User
Beiträge: 15
Registriert: Dienstag 18. Januar 2005, 21:07
Kontaktdaten:

Hallo nochmal,

gencache und constants liefert leider auch keine Lösung:

In der mit makepy generierten cache-Datei ist die Methode ExportAsFixedFormat wie folgt definiert (wobei defaultNamedOptArg=pythoncom.Empty) ist:

Code: Alles auswählen

def ExportAsFixedFormat(self, Path=defaultNamedNotOptArg, FixedFormatType=defaultNamedNotOptArg, Intent=1, FrameSlides=0
			, HandoutOrder=1, OutputType=1, PrintHiddenSlides=0, PrintRange=0, RangeType=1
			, SlideShowName='', IncludeDocProperties=False, KeepIRMSettings=True, DocStructureTags=True, BitmapMissingFonts=True
			, UseISO19005_1=False, ExternalExporter=defaultNamedOptArg):
		return self._ApplyTypes_(2096, 1, (24, 32), ((8, 1), (3, 1), (3, 49), (3, 49), (3, 49), (3, 49), (3, 49), (9, 49), (3, 49), (8, 49), (11, 49), (11, 49), (11, 49), (11, 49), (11, 49), (12, 17)), 'ExportAsFixedFormat', None,Path
			, FixedFormatType, Intent, FrameSlides, HandoutOrder, OutputType
			, PrintHiddenSlides, PrintRange, RangeType, SlideShowName, IncludeDocProperties
			, KeepIRMSettings, DocStructureTags, BitmapMissingFonts, UseISO19005_1, ExternalExporter
			)
Ich habe mein Testscript wie folgt geändert:

Code: Alles auswählen

import win32com.client
import pythoncom
'''
Nur zur Info, Definition aus VB Objectbrowser:

Sub ExportAsFixedFormat(
    Path As String,
    FixedFormatType As PpFixedFormatType,
    [Intent As PpFixedFormatIntent = ppFixedFormatIntentScreen],
    [FrameSlides As MsoTriState],
    [HandoutOrder As PpPrintHandoutOrder = ppPrintHandoutVerticalFirst],
    [OutputType As PpPrintOutputType = ppPrintOutputSlides],
    [PrintHiddenSlides As MsoTriState],
    [PrintRange As PrintRange],
    [RangeType As PpPrintRangeType = ppPrintAll],
    [SlideShowName As String],
    [IncludeDocProperties As Boolean = Falsch],
    [KeepIRMSettings As Boolean = Wahr],
    [DocStructureTags As Boolean = Wahr],
    [BitmapMissingFonts As Boolean = Wahr],
    [UseISO19005_1 As Boolean = Falsch],
    [ExternalExporter]
    )
'''

myPowerpoint = win32com.client.gencache.EnsureDispatch('Powerpoint.Application')
myPowerpoint.Activate()
myPresentation = myPowerpoint.Presentations.Open("C:\\testdokumente\\ppt\\Praesentation.ppt")

myPowerpoint.ActivePresentation.ExportAsFixedFormat(Path="c:\\mypdf.pdf",
                                                    FixedFormatType=win32com.client.constants.ppFixedFormatTypePDF,
                                                    Intent=win32com.client.constants.ppFixedFormatIntentScreen,
                                                    FrameSlides=0,
                                                    HandoutOrder=win32com.client.constants.ppPrintHandoutVerticalFirst,
                                                    OutputType=win32com.client.constants.ppPrintOutputSlides,
                                                    PrintHiddenSlides=0,
                                                    PrintRange=0,
                                                    RangeType=win32com.client.constants.ppPrintAll,
                                                    SlideShowName='',
                                                    IncludeDocProperties=False,
                                                    KeepIRMSettings=True,
                                                    DocStructureTags=True,
                                                    BitmapMissingFonts=True,
                                                    UseISO19005_1=False,
                                                    ExternalExporter=pythoncom.Empty
                                                    )
Das Ergebnis ist leider immer das Gleiche:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Dokumente und Einstellungen\mgo\Desktop\test.py", line 44, in <module>
    ExternalExporter=pythoncom.Empty
  File "C:\Python25\lib\site-packages\win32com\gen_py\91493440-5A91-11CF-8700-00AA0060263Bx0x2x9.py", line 7866, in ExportAsFixedFormat
    , KeepIRMSettings, DocStructureTags, BitmapMissingFonts, UseISO19005_1, ExternalExporter
  File "C:\Python25\lib\site-packages\win32com\client\__init__.py", line 448, in _ApplyTypes_
    dispid, 0, wFlags, retType, argTypes, *args),
ValueError: argument is not a COM object
Ich vermute, das der Value-Error sich auf FixedFormatType und Intent bezieht. Wenn ich dort Ints übergebe, ist das Resultat das Gleiche. True und False als 1 und 0 zu übergeben habe ich auch versucht. Was soll hier wie als Objekt übergeben werden ?

Gibt es jemand, mit Office 2007?
http://www.goermezer.de
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Wie gesagt, das mit den Keywords hat bei mir auch nicht geklappt. Versuch mal:

Code: Alles auswählen

myPowerpoint.ActivePresentation.ExportAsFixedFormat("c:\\mypdf.pdf",win32com.client.constants.ppFixedFormatTypePDF,win32com.client.constants.ppFixedFormatIntentScreen,0,win32com.client.constants.ppPrintHandoutVerticalFirst, win32com.client.constants.ppPrintOutputSlides,0,0,win32com.client.constants.ppPrintAll,'',False,True,True,True,False,pythoncom.Empty)
Eventuell True und False noch als 1 und 0.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
goermezer
User
Beiträge: 15
Registriert: Dienstag 18. Januar 2005, 21:07
Kontaktdaten:

Bringt leider nichts. Die Fehlermeldung ist die gleiche:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Dokumente und Einstellungen\mgo\Desktop\test.py", line 33, in <module>
    myPowerpoint.ActivePresentation.ExportAsFixedFormat("c:\\mypdf.pdf",win32com.client.constants.ppFixedFormatTypePDF,win32com.client.constants.ppFixedFormatIntentScreen,0,win32com.client.constants.ppPrintHandoutVerticalFirst, win32com.client.constants.ppPrintOutputSlides,0,0,win32com.client.constants.ppPrintAll,'',0,1,1,1,0,pythoncom.Empty)
  File "C:\Python25\lib\site-packages\win32com\gen_py\91493440-5A91-11CF-8700-00AA0060263Bx0x2x9.py", line 7866, in ExportAsFixedFormat
    , KeepIRMSettings, DocStructureTags, BitmapMissingFonts, UseISO19005_1, ExternalExporter
  File "C:\Python25\lib\site-packages\win32com\client\__init__.py", line 448, in _ApplyTypes_
    dispid, 0, wFlags, retType, argTypes, *args),
ValueError: argument is not a COM object
http://www.goermezer.de
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Der einzige signifikante Unterschied zu der Version, die ich mal für Excel geschrieben habe, ist, dass ich gencache.EnsureModule mit der CLSID vor dem Dispatch verwendet hab.

HTH Ansonsten bin ich leider im Moment ratlos.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
goermezer
User
Beiträge: 15
Registriert: Dienstag 18. Januar 2005, 21:07
Kontaktdaten:

Da kommt leider die gleiche Fehlermeldung. Ist auch kein Wunder, da ein dispatch mit gencache.EnsureModule aund CLSID das Gleiche ist, wie gencache.EnsureDispatch.

Schade, Google bietet leider auch noch nichts :-(
http://www.goermezer.de
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

gencache.EnsureModule('{00020813-0000-0000-C000-000000000046x0x1x4}', 0, 1, 2)

hat bei mir funktioniert, wohingegen

gencache.EnsureModule('Excel.application', 0, 1, 2)

nicht funktioniert hat, obwohl das theoretisch das gleiche sein sollte.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
goermezer
User
Beiträge: 15
Registriert: Dienstag 18. Januar 2005, 21:07
Kontaktdaten:

Das bringt alles nichts. Ich hatte zwar eine andere CLSID probiert, aber in der generierten Cache-Datei standen die richtigen Methoden/Objekte usw. Daher wird es wohl richtig gewesen sein.

Das scheint auch nicht der richtige Weg zu sein. Der Knackpunkt ist: Welches Argument als Objekt und wie übergeben?

Trotzdem nochmal Danke für Deine Bemühungen...
http://www.goermezer.de
goermezer
User
Beiträge: 15
Registriert: Dienstag 18. Januar 2005, 21:07
Kontaktdaten:

Da hier keiner helfen konnte, habe ich einen Bug auf Sourceforge für Pywin32 eröffnet. Marc Hammond hat dann gleich einen Workaround vorgeschlagen, da es ein PowerPoint Bug ist:
This is a bug in Powerpoint. It defines "[in, optional, defaultvalue(0)]
PrintRange* PrintRange" which leads to the generation of "PrintRange=0" in the python wrapper. Therefore you'll get the error when calling the method.
So no problem of makepy. Workaround call the method with PrintRange=None since None is a vali COM object. E.g.
presentation.ExportAsFixedFormat(pptFile+'.pdf',
win32com.client.constants.ppFixedFormatTypePDF,
win32com.client.constants.ppFixedFormatIntentScreen, PrintRange=None) should work.
PrintRange=None ist das, was gesucht war! :D
http://www.goermezer.de
Antworten