.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.

23
demandé sur WilliamKF 2011-05-16 00:42:43

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')
49
répondu Steven 2011-05-16 13:19:36

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 
4
répondu Yang 2016-12-15 16:52:12

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.

2
répondu Bas Bossink 2011-05-15 21:05:51

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

2
répondu James N 2017-05-23 12:18:23

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

2
répondu lxx 2014-10-15 22:15:28

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")
1
répondu user2921789 2017-07-01 12:37:04

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).

0
répondu c-smile 2011-05-15 20:54:07

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 '

0
répondu patrick 2018-05-24 19:06:17

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.

-3
répondu mikerobi 2011-05-15 20:53:58