2011-05-15 17 views
18

का उपयोग कर पीडीएफ को डॉक करें। मैं .doc फ़ाइलों को .pdf में कनवर्ट करने के साथ काम करता हूं। और मेरा पर्यवेक्षक मुझे ऐसा करने का एकमात्र तरीका MSWord 2010 के माध्यम से करना चाहता है। मुझे पता है कि मुझे इसे पायथन COM ऑटोमेशन के साथ स्वचालित करने में सक्षम होना चाहिए। केवल समस्या यह नहीं है कि मैं नहीं जानता कि कैसे और कहां से शुरू किया जाए। मैंने कुछ ट्यूटोरियल खोजने की कोशिश की लेकिन मुझे कोई भी नहीं मिला (शायद मुझे हो सकता है, लेकिन मुझे नहीं पता कि मैं क्या देख रहा हूं)।। Python

अभी मैं this के माध्यम से पढ़ रहा हूं। यह नहीं पता कि यह कितना उपयोगी होगा।

उत्तर

39

, comtypes का उपयोग कर एक एकल फाइल परिवर्तित एक साधारण उदाहरण, इनपुट और आउटपुट फ़ाइल नाम कमांडलाइन तर्क के रूप में दिया:

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

तुम भी pywin32 इस्तेमाल कर सकते हैं, जो छोड़कर ही होगा के लिए:

import win32com.client 

और उसके बाद:

word = win32com.client.Dispatch('Word.Application') 
+2

यह वही है जो मैं ढूंढ रहा था। धन्यवाद :) – nik

+3

कई फाइलों के लिए, सेटिंग पर विचार करें: शब्द शब्द के समय और प्रसंस्करण को बचाने के लिए 'शब्द। दृश्यमान = गलत' (एमएस शब्द इस तरह प्रदर्शित नहीं होगा, कोड अनिवार्य रूप से पृष्ठभूमि में चलाएगा) – ecoe

+0

मैं प्राप्त करने में कामयाब रहा हूं यह पावरपॉइंट दस्तावेज़ों के लिए काम कर रहा है। 'Powerpoint.Aplication', 'प्रस्तुतियां। खोलें' और 'FileFormat = 32' का उपयोग करें। – Snorfalorpagus

2

यदि आपको PowerShell का उपयोग करने से कोई फर्क नहीं पड़ता है तो Hey, Scripting Guy! article पर एक नज़र डालें। गणना मूल्य WdSaveFormat (here देखें) का उपयोग करने के लिए प्रस्तुत कोड को अपनाया जा सकता है। This blog article एक ही विचार के एक अलग कार्यान्वयन प्रस्तुत करता है।

+1

मैं एक लिनक्स/यूनिक्स उपयोगकर्ता हूं और पाइथन की ओर अधिक इच्छुक हूं। लेकिन पीएस स्क्रिप्ट बहुत सरल दिखती है और वास्तव में जो मैं खोज रहा था। धन्यवाद :) – nik

-3

मैं आपके पर्यवेक्षक को अनदेखा करने और ओपनऑफिस का उपयोग करने का सुझाव दूंगा जिसमें पाइथन एपीआई है। ओपनऑफिस ने पायथन के लिए समर्थन में बनाया है और किसी ने इस उद्देश्य के लिए लाइब्रेरी विशिष्ट बनाया है (PyODConverter)।

यदि वह आउटपुट से खुश नहीं है, तो उसे बताएं कि यह आपको शब्द के साथ करने में सप्ताह लग सकता है।

0

आपको तथाकथित आभासी पीडीएफ प्रिंट ड्राइवरों की जांच से शुरू करना चाहिए। जैसे ही आप पाएंगे, आपको बैच फ़ाइल लिखने में सक्षम होना चाहिए जो आपकी डीओसी फ़ाइलों को पीडीएफ फाइलों में प्रिंट करता है। आप शायद इसे पायथन में भी कर सकते हैं (सेटअप प्रिंटर ड्राइवर आउटपुट और MSWord में समस्या दस्तावेज़/प्रिंट कमांड, बाद में कमांड लाइन AFAIR का उपयोग करके किया जा सकता है)।

2

यह स्टीव्स का जवाब देने के लायक है, लेकिन यह सुनिश्चित करें कि लूप से पहले क्लाइंटऑब्जेक्ट या डिस्पैच स्टेटमेंट्स रखने के लिए एकाधिक फ़ाइलों को निर्यात करने के लिए लूप का उपयोग करना है - इसे केवल एक बार बनाया जाना चाहिए - मेरी समस्या देखें: Python win32com.client.Dispatch looping through Word documents and export to PDF; fails when next loop occurs

2

unoconv (पायथन में लिखे गए) और ओपनऑफिस एक हेडलेस डिमन के रूप में चल रहा है। http://dag.wiee.rs/home-made/unoconv/

डॉक्टर, डॉक्क्स, पीपीटी, पीपीटीएक्स, एक्सएलएस, एक्सएलएसएक्स के लिए बहुत अच्छी तरह से काम करता है। यदि आपको दस्तावेज़ों को कनवर्ट करने या सहेजने/सर्वर पर कुछ प्रारूपों में कनवर्ट करने की आवश्यकता है तो बहुत उपयोगी है

2

मैंने इस समस्या पर आधा दिन काम किया है, इसलिए मुझे लगता है कि मुझे इस मामले पर अपना कुछ अनुभव साझा करना चाहिए। स्टीवन का जवाब सही है, लेकिन यह मेरे कंप्यूटर पर असफल हो जाएगा। इसे ठीक करने के लिए दो महत्वपूर्ण बिंदु हैं:

(1)। पहली बार जब मैंने 'Word.Aplication' ऑब्जेक्ट बनाया, तो मुझे इसे किसी भी दस्तावेज़ को खोलने से पहले इसे (शब्द ऐप) दिखाना चाहिए। (असल में, यहां तक ​​कि मैं खुद को यह समझा नहीं सकता कि यह क्यों काम करता है। अगर मैं अपने कंप्यूटर पर ऐसा नहीं करता हूं, तो जब मैं अदृश्य मॉडल में कोई दस्तावेज़ खोलने का प्रयास करता हूं तो प्रोग्राम क्रैश हो जाएगा, फिर 'Word.Aplication' ऑब्जेक्ट को हटा दिया जाएगा ओएस।)

(2)।(1) करने के बाद, कार्यक्रम कभी-कभी अच्छी तरह से काम करेगा लेकिन अक्सर असफल हो सकता है। क्रैश त्रुटि "COMError: (-2147418111, 'Call was rejected by callee.', (None, None, None, 0, None))" का अर्थ है कि COM सर्वर इतनी जल्दी प्रतिक्रिया देने में सक्षम नहीं हो सकता है। इसलिए मैंने दस्तावेज़ खोलने की कोशिश करने से पहले देरी जोड़ दी।

इन दो चरणों के बाद, कार्यक्रम पूरी तरह से विफलता के साथ काम करेगा। डेमो कोड नीचे जैसा है। यदि आपको एक ही समस्या का सामना करना पड़ा है, तो इन दो चरणों का पालन करने का प्रयास करें। आशा करता हूँ की ये काम करेगा।

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 
1

मैं स्वीकार किए जाते हैं जवाब की कोशिश की लेकिन फूला हुआ पीडीएफ़ पद उत्पादन किया गया था जो आम तौर पर परिमाण की उम्मीद से भी बड़ा के एक आदेश था पर विशेष रूप से उत्सुक नहीं था। वर्चुअल पीडीएफ प्रिंटर का उपयोग करते समय संवाद को अक्षम करने के तरीके को देखने के बाद मैं बुल्ज़िप पीडीएफ प्रिंटर में आया और मैं इसकी विशेषताओं से प्रभावित हूं। अब मैंने पहले इस्तेमाल किए गए अन्य आभासी प्रिंटर को बदल दिया है। आपको उनके डाउनलोड पेज पर "मुफ़्त समुदाय संस्करण" मिलेगा।

COM API here पाया जा सकता है और उपयोग योग्य सेटिंग्स की एक सूची here मिल सकती है। सेटिंग्स को "runonce" फ़ाइल में लिखा जाता है जिसका उपयोग केवल एक प्रिंट नौकरी के लिए किया जाता है और फिर स्वचालित रूप से हटा दिया जाता है। एकाधिक पीडीएफ प्रिंट करते समय हमें यह सुनिश्चित करने की ज़रूरत है कि प्रत्येक प्रिंट के लिए सेटिंग्स को सही ढंग से इस्तेमाल किया जा सके, यह सुनिश्चित करने के लिए एक प्रिंट जॉब पूरा हो जाए।

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