2012-07-05 8 views
7

La mia applicazione .Net deve convertire un documento PDF in formato Word a livello di programmazione.Come convertire PDF in Word utilizzando Acrobat SDK?

Ho valutato diversi prodotti e trovato Acrobat X Pro, che fornisce un'opzione di salvataggio in cui è possibile salvare il documento in formato Word/Excel. Ho provato ad usare Acrobat SDK ma non sono riuscito a trovare la documentazione corretta da dove iniziare.

Ho esaminato il loro esempio di IAC ma non sono riuscito a capire come chiamare la voce di menu e farlo eseguire il salvataggio come opzione.

risposta

0

Adobe non supporta le conversioni da PDF a Word, a meno che non si stia utilizzando il client Acrobat PDF. Maest non puoi farlo con il loro SDK né chiamando una riga di comando. Puoi farlo solo manualmente.

+0

Le soluzioni postato da uno JLE o mostrarmi modi per raggiungere questo livello di programmazione. Se possiedi Acrobat X Pro, puoi provare il mio script come dovrebbe funzionare una volta installato WinPython x64 2.7.6.3 (che è gratuito) – Subhobroto

13

È possibile eseguire questa operazione con Acrobat X Pro, ma è necessario utilizzare l'API javascript in C#.

AcroPDDoc pdfd = new AcroPDDoc(); 
pdfd.Open(sourceDoc.FileFullPath); 
Object jsObj = pdfd.GetJSObject(); 
Type jsType = pdfd.GetType(); 
//have to use acrobat javascript api because, acrobat 
object[] saveAsParam = { "newFile.doc", "com.adobe.acrobat.doc", "", false, false }; 
jsType.InvokeMember("saveAs",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,null, jsObj, saveAsParam, CultureInfo.InvariantCulture); 

Spero che questo aiuti.

+0

Ciao, non ho la stessa cosa .. grazie per il tuo risposta. ma sembra che il processo richieda molto tempo per finire. Se devo coprire 1000 file, ci vorranno più di 5 6 ore .. c'è un modo più veloce per questo? –

+0

Ho aggiunto un pdfd.Close() alla fine per sbloccare il file. – r03

1

Ho fatto qualcosa di molto simile usando WinPython x64 2.7.6.3 e Acrobat X Pro e ho usato l'interfaccia JSObject per convertire PDF in DOCX. Essenzialmente la stessa soluzione di jle's.

Il seguente dovrebbe essere un pezzo completo di codice che converte un insieme di file PDF in DOCX:

# gets all files under ROOT_INPUT_PATH with FILE_EXTENSION and tries to extract text from them into ROOT_OUTPUT_PATH with same filename as the input file but with INPUT_FILE_EXTENSION replaced by OUTPUT_FILE_EXTENSION 
from win32com.client import Dispatch 
from win32com.client.dynamic import ERRORS_BAD_CONTEXT 

import winerror 

# try importing scandir and if found, use it as it's a few magnitudes of an order faster than stock os.walk 
try: 
    from scandir import walk 
except ImportError: 
    from os import walk 

import fnmatch 

import sys 
import os 

ROOT_INPUT_PATH = None 
ROOT_OUTPUT_PATH = None 
INPUT_FILE_EXTENSION = "*.pdf" 
OUTPUT_FILE_EXTENSION = ".docx" 

def acrobat_extract_text(f_path, f_path_out, f_basename, f_ext): 
    avDoc = Dispatch("AcroExch.AVDoc") # Connect to Adobe Acrobat 

    # Open the input file (as a pdf) 
    ret = avDoc.Open(f_path, f_path) 
    assert(ret) # FIXME: Documentation says "-1 if the file was opened successfully, 0 otherwise", but this is a bool in practise? 

    pdDoc = avDoc.GetPDDoc() 

    dst = os.path.join(f_path_out, ''.join((f_basename, f_ext))) 

    # Adobe documentation says "For that reason, you must rely on the documentation to know what functionality is available through the JSObject interface. For details, see the JavaScript for Acrobat API Reference" 
    jsObject = pdDoc.GetJSObject() 

    # Here you can save as many other types by using, for instance: "com.adobe.acrobat.xml" 
    jsObject.SaveAs(dst, "com.adobe.acrobat.docx") # NOTE: If you want to save the file as a .doc, use "com.adobe.acrobat.doc" 

    pdDoc.Close() 
    avDoc.Close(True) # We want this to close Acrobat, as otherwise Acrobat is going to refuse processing any further files after a certain threshold of open files are reached (for example 50 PDFs) 
    del pdDoc 

if __name__ == "__main__": 
    assert(5 == len(sys.argv)), sys.argv # <script name>, <script_file_input_path>, <script_file_input_extension>, <script_file_output_path>, <script_file_output_extension> 

    #$ python get.docx.from.multiple.pdf.py 'C:\input' '*.pdf' 'C:\output' '.docx' # NOTE: If you want to save the file as a .doc, use '.doc' instead of '.docx' here and ensure you use "com.adobe.acrobat.doc" in the jsObject.SaveAs call 

    ROOT_INPUT_PATH = sys.argv[1] 
    INPUT_FILE_EXTENSION = sys.argv[2] 
    ROOT_OUTPUT_PATH = sys.argv[3] 
    OUTPUT_FILE_EXTENSION = sys.argv[4] 

    # tuples are of schema (path_to_file, filename) 
    matching_files = ((os.path.join(_root, filename), os.path.splitext(filename)[0]) for _root, _dirs, _files in walk(ROOT_INPUT_PATH) for filename in fnmatch.filter(_files, INPUT_FILE_EXTENSION)) 

    # patch ERRORS_BAD_CONTEXT as per https://mail.python.org/pipermail/python-win32/2002-March/000265.html 
    global ERRORS_BAD_CONTEXT 
    ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL) 

    for filename_with_path, filename_without_extension in matching_files: 
     print "Processing '{}'".format(filename_without_extension) 
     acrobat_extract_text(filename_with_path, ROOT_OUTPUT_PATH, filename_without_extension, OUTPUT_FILE_EXTENSION)