.doc au pdf en utilisant python
je suis chargé de convertir des tonnes de .doc file à .PDF. Et la seule façon que mon superviseur veut que je fasse ça, c'est par MSWord 2010. Je sais que je devrais pouvoir automatiser ça avec python COM automation. Seul problème est que je ne sais pas comment et par où commencer. J'ai essayé de chercher des tutoriels mais je n'en ai pas trouvé (peut-être que j'en ai, mais je ne sais pas ce que je cherche).
en ce moment je lis ce . Ne sais pas comment c'est utile.
9 réponses
un exemple simple utilisant comtypes , convertissant un fichier simple, les noms de fichiers d'entrée et de sortie donnés comme arguments de ligne de commande:
import sys
import os
import comtypes.client
wdFormatPDF = 17
in_file = os.path.abspath(sys.argv[1])
out_file = os.path.abspath(sys.argv[2])
word = comtypes.client.CreateObject('Word.Application')
doc = word.Documents.Open(in_file)
doc.SaveAs(out_file, FileFormat=wdFormatPDF)
doc.Close()
word.Quit()
vous pouvez également utiliser pywin32 , qui serait le même sauf pour:
import win32com.client
et ensuite:
word = win32com.client.Dispatch('Word.Application')
j'ai travaillé sur ce problème pendant une demi-journée, donc je pense que je devrais partager une partie de mon expérience sur cette question. La réponse de Steven est correcte, mais elle échouera sur mon ordinateur. Il y a deux points clés à corriger ici:
(1). La première fois quand j'ai créé le " Mot.Application ' objet, je dois le rendre (le mot app) visible avant d'ouvrir tout document. (En fait, même moi, Je ne peux pas expliquer pourquoi cela fonctionne. Si je ne fais pas cela sur mon ordinateur, le programme va planter lorsque j'essaie d'ouvrir un document dans l'invisible modèle, alors la Parole.L'objet Application sera supprimé par OS. )
(2). Après avoir fait (1), le programme de travail parfois, mais peut échouer souvent. L'erreur "COMError: (-2147418111, 'Call was rejected by callee.', (None, None, None, 0, None))"
signifie que le serveur COM ne peut pas répondre aussi rapidement. J'ajoute donc un délai avant d'essayer d'ouvrir un document.
Après ces deux étapes, le programme fonctionne parfaitement avec aucun non plus. Le code de démonstration est comme ci-dessous. Si vous avez rencontré le même problème, essayez de suivre ces deux étapes. Espérons que cela aide.
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
si ça ne vous dérange pas d'utiliser PowerShell regardez ce Hé, le gars du script! article . Le code présenté pourrait être adopté pour utiliser la valeur d'énumération wdFormatPDF
de WdSaveFormat
(voir ici ).
cet article de blog présente une mise en œuvre différente de la même idée.
cela vaut la peine de noter que la réponse de Stevens fonctionne, mais assurez - vous si vous utilisez une boucle for pour exporter plusieurs fichiers pour placer les déclarations ClientObject ou Dispatch avant la boucle - il ne doit être créé qu'une seule fois-Voir mon problème: Python win32com.client.Expédition boucle à travers les documents Word et exportation vers PDF; échec lorsque la boucle suivante se produit
unoconv(écrit en python) et openoffice cours d'exécution comme une tête de démon. http://dag.wiee.rs/home-made/unoconv/
fonctionne très bien pour doc,docx, ppt,pptx, xls, xlsx. Très utile si vous avez besoin de convertir docs ou enregistrer / convertir à certains formats sur un serveur
j'ai essayé la réponse acceptée mais n'étais pas particulièrement enthousiaste sur le mot de PDFs gonflés produisait qui était habituellement un ordre de grandeur plus grand que prévu. Après avoir cherché comment désactiver les dialogues en utilisant une imprimante PDF virtuelle, je suis tombé sur Bullzip PDF Printer et j'ai été plutôt impressionné par ses fonctionnalités. Il a maintenant remplacé les autres imprimantes virtuelles que j'utilisais auparavant. Vous trouverez une "édition communautaire gratuite" sur leur page de téléchargement.
L'API COM peut être trouvé ici et une liste des paramètres utilisables peut être trouvé ici . Les paramètres sont écrits dans un "runonce" fichier qui est utilisé pour une tâche d'impression, puis supprimé automatiquement. Lors de l'impression de plusieurs fichiers PDF, nous devons nous assurer qu'une tâche d'impression est terminée avant d'en lancer une autre pour nous assurer que les paramètres sont utilisés correctement pour chaque fichier.
import os, re, time, datetime, win32com.client
def print_to_Bullzip(file):
util = win32com.client.Dispatch("Bullzip.PDFUtil")
settings = win32com.client.Dispatch("Bullzip.PDFSettings")
settings.PrinterName = util.DefaultPrinterName # make sure we're controlling the right PDF printer
outputFile = re.sub("\.[^.]+$", ".pdf", file)
statusFile = re.sub("\.[^.]+$", ".status", file)
settings.SetValue("Output", outputFile)
settings.SetValue("ConfirmOverwrite", "no")
settings.SetValue("ShowSaveAS", "never")
settings.SetValue("ShowSettings", "never")
settings.SetValue("ShowPDF", "no")
settings.SetValue("ShowProgress", "no")
settings.SetValue("ShowProgressFinished", "no") # disable balloon tip
settings.SetValue("StatusFile", statusFile) # created after print job
settings.WriteSettings(True) # write settings to the runonce.ini
util.PrintFile(file, util.DefaultPrinterName) # send to Bullzip virtual printer
# wait until print job completes before continuing
# otherwise settings for the next job may not be used
timestamp = datetime.datetime.now()
while( (datetime.datetime.now() - timestamp).seconds < 10):
if os.path.exists(statusFile) and os.path.isfile(statusFile):
error = util.ReadIniString(statusFile, "Status", "Errors", '')
if error != "0":
raise IOError("PDF was created with errors")
os.remove(statusFile)
return
time.sleep(0.1)
raise IOError("PDF creation timed out")
vous devriez commencer par enquêter sur ce qu'on appelle les pilotes virtuels D'impression PDF. Dès que vous en trouverez un, vous devriez être en mesure d'écrire le fichier batch qui imprime vos fichiers DOC dans les fichiers PDF. Vous pouvez probablement le faire aussi en Python (configuration de la sortie du pilote d'imprimante et de la commande d'édition document/print dans MSWord, plus tard peut être fait en utilisant la ligne de commande AFAIR).
comme alternative à la fonction SaveAs, vous pouvez également utiliser ExportAsFixedFormat qui vous donne accès à la boîte de dialogue PDF options que vous voyez normalement dans Word. Avec cela, vous pouvez spécifier des signets et d'autres propriétés du document.
doc.ExportAsFixedFormat(OutputFileName=pdf_file,
ExportFormat=17, #17 = PDF output, 18=XPS output
OpenAfterExport=False,
OptimizeFor=0, #0=Print (higher res), 1=Screen (lower res)
CreateBookmarks=1, #0=No bookmarks, 1=Heading bookmarks only, 2=bookmarks match word bookmarks
DocStructureTags=True
);
La liste complète des arguments d'une fonction est la suivante: "OutputFileName', 'Formatexportation', 'OpenAfterExport', 'OptimizeFor', 'Plage', 'De', 'À', 'Rubrique', 'IncludeDocProps', 'KeepIRM', 'CreateBookmarks', 'DocStructureTags', 'BitmapMissingFonts', 'UseISO19005_1', 'FixedFormatExtClassPtr '
je suggère d'ignorer votre superviseur et D'utiliser OpenOffice qui a une api Python. OpenOffice a construit un support pour Python et quelqu'un a créé une bibliothèque spécifique à cet effet ( PyODConverter ).
S'il n'est pas satisfait de la sortie, dites-lui que ça peut prendre des semaines pour le faire avec word.