He trabajado en este problema durante medio día, así que creo que debería compartir algo de mi experiencia en este asunto. La respuesta de Steven es correcta, pero fallará en mi computadora. Hay dos puntos clave para solucionarlo aquí:
(1). La primera vez que creé el objeto 'Word.Application', debería hacerlo visible (la aplicación de la palabra) antes de abrir cualquier documento. (En realidad, ni siquiera yo mismo puedo explicar por qué funciona esto. Si no hago esto en mi computadora, el programa se bloqueará cuando intente abrir un documento en el modelo invisible, luego el objeto 'Word.Application' será borrado por SO.)
(2).Después de hacer (1), el programa funcionará bien a veces pero puede fallar a menudo. El error de bloqueo "COMError: (-2147418111, 'Call was rejected by callee.', (None, None, None, 0, None))"
significa que el servidor COM puede no ser capaz de responder tan rápidamente. Así que agrego un retraso antes de intentar abrir un documento.
Después de hacer estos dos pasos, el programa funcionará perfectamente sin fallas. El código de demostración es el siguiente. Si ha encontrado los mismos problemas, intente seguir estos dos pasos. Espero eso ayude.
import os
import comtypes.client
import time
wdFormatPDF = 17
# absolute path is needed
# be careful about the slash '\', use '\\' or '/' or raw string r"..."
in_file=r'absolute path of input docx file 1'
out_file=r'absolute path of output pdf file 1'
in_file2=r'absolute path of input docx file 2'
out_file2=r'absolute path of outputpdf file 2'
# print out filenames
print in_file
print out_file
print in_file2
print out_file2
# create COM object
word = comtypes.client.CreateObject('Word.Application')
# key point 1: make word visible before open a new document
word.Visible = True
# key point 2: wait for the COM Server to prepare well.
time.sleep(3)
# convert docx file 1 to pdf file 1
doc=word.Documents.Open(in_file) # open docx file 1
doc.SaveAs(out_file, FileFormat=wdFormatPDF) # conversion
doc.Close() # close docx file 1
word.Visible = False
# convert docx file 2 to pdf file 2
doc = word.Documents.Open(in_file2) # open docx file 2
doc.SaveAs(out_file2, FileFormat=wdFormatPDF) # conversion
doc.Close() # close docx file 2
word.Quit() # close Word Application
Esto es exactamente lo que estaba buscando. Gracias :) – nik
Para muchos archivos, considere la configuración: 'word.Visible = False' para ahorrar tiempo y el procesamiento de los archivos de palabras (la palabra MS no se mostrará de esta manera, el código se ejecutará en segundo plano) – ecoe
He logrado obtener esto funciona para documentos de PowerPoint. Use 'Powerpoint.Application',' Presentations.Open' y 'FileFormat = 32'. – Snorfalorpagus