Python win32com.client.Dispatch przechodzący przez dokumenty Worda i eksportujący do PDF; kończy się niepowodzeniem przy następnej pętli
Na podstawie tego skryptu:.doc do pdf przy użyciu Pythona Mam pół-roboczy skrypt do eksportowania plików .docx do pdf z C: Export_to_pdf do nowego folderu.
Problem polega na tym, że przechodzi przez pierwszą parę dokumentów, a następnie kończy się niepowodzeniem:
(-2147352567, 'Exception occurred.', (0, u'Microsoft Word', u'Command failed', u'wdmain11.chm', 36966, -2146824090), None)
To najwyraźniej nie jest pomocny ogólny komunikat o błędzie. Jeśli powoli debuguję za pomocą pdb, mogę przechodzić przez wszystkie pliki i pomyślnie eksportować. Jeśli mam również na oku procesy w Menedżerze zadań Windows, widzę, że WINWORD zaczyna się wtedy kończyć, kiedy ma, ale na większych plikach użycie pamięci trwa dłużej. To sprawia, że myślę, że skrypt potknie się, gdy WINWORD nie ma czasu na inicjalizację lub zamknięcie przed wywołaniem następnej metody w obiekcie client.Dispatch.
Czy w przypadku win32com lub comtypes jest sposób na identyfikację i oczekiwanie na rozpoczęcie lub zakończenie procesu?
Mój skrypt:
import os
from win32com import client
folder = "C:\\Export_to_pdf"
file_type = 'docx'
out_folder = folder + "\\PDF"
os.chdir(folder)
if not os.path.exists(out_folder):
print 'Creating output folder...'
os.makedirs(out_folder)
print out_folder, 'created.'
else:
print out_folder, 'already exists.\n'
for files in os.listdir("."):
if files.endswith(".docx"):
print files
print '\n\n'
try:
for files in os.listdir("."):
if files.endswith(".docx"):
out_name = files.replace(file_type, r"pdf")
in_file = os.path.abspath(folder + "\\" + files)
out_file = os.path.abspath(out_folder + "\\" + out_name)
word = client.Dispatch("Word.Application")
doc = word.Documents.Open(in_file)
print 'Exporting', out_file
doc.SaveAs(out_file, FileFormat=17)
doc.Close()
word.Quit()
except Exception, e:
print e
Działający kod - właśnie zastąpił ten blok try. Notatka przeniosła instrukcję DispatchEx poza pętlę for i word.Quit () do instrukcji finally, aby zapewnić jej zamknięcie.
try:
word = client.DispatchEx("Word.Application")
for files in os.listdir("."):
if files.endswith(".docx") or files.endswith('doc'):
out_name = files.replace(file_type, r"pdf")
in_file = os.path.abspath(folder + "\\" + files)
out_file = os.path.abspath(out_folder + "\\" + out_name)
doc = word.Documents.Open(in_file)
print 'Exporting', out_file
doc.SaveAs(out_file, FileFormat=17)
doc.Close()
except Exception, e:
print e
finally:
word.Quit()