Condividi:        

Convertire da DOC a TXT con script Python in Open Office

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

Convertire da DOC a TXT con script Python in Open Office

Postdi Dylan666 » 03/04/08 10:32

Come da titolo ho la necessità di convertire in batch dei file da DOC a TXT con Open Office ed ho trovato uno script in Python già fatto per questo ma non riesco a farlo funzionare.
Lo script l'ho preso da qui:
http://www.artofsolving.com/opensource/pyodconverter

Lo riporto qui interamente:
Codice: Seleziona tutto
#
# PyODConverter (Python OpenDocument Converter) v0.9.1 - 2008-03-01
#
# This script converts a document from one office format to another by
# connecting to an OpenOffice.org instance via Python-UNO bridge.
#
# Copyright (C) 2008 Mirko Nasato <mirko@artofsolving.com>
# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html
#
DEFAULT_OPENOFFICE_PORT = 8100

import uno
from os.path import abspath, splitext
from com.sun.star.beans import PropertyValue
from com.sun.star.connection import NoConnectException

FAMILY_PRESENTATION = "Presentation"
FAMILY_SPREADSHEET = "Spreadsheet"
FAMILY_TEXT = "Text"

FAMILY_BY_EXTENSION = {
   "odt": FAMILY_TEXT,
   "sxw": FAMILY_TEXT,
   "doc": FAMILY_TEXT,
   "rtf": FAMILY_TEXT,
   "txt": FAMILY_TEXT,
   "wpd": FAMILY_TEXT,
   "html": FAMILY_TEXT,
   "ods": FAMILY_SPREADSHEET,
   "sxc": FAMILY_SPREADSHEET,
   "xls": FAMILY_SPREADSHEET,
   "odp": FAMILY_PRESENTATION,
   "sxi": FAMILY_PRESENTATION,
   "ppt": FAMILY_PRESENTATION
}

FILTER_BY_EXTENSION = {
    "pdf": {
        FAMILY_TEXT: "writer_pdf_Export",
        FAMILY_SPREADSHEET: "calc_pdf_Export",
        FAMILY_PRESENTATION: "impress_pdf_Export"
    },
    "html": {
        FAMILY_TEXT: "HTML (StarWriter)",
        FAMILY_SPREADSHEET: "HTML (StarCalc)",
        FAMILY_PRESENTATION: "impress_html_Export"
    },
    "odt": { FAMILY_TEXT: "writer8" },
    "doc": { FAMILY_TEXT: "MS Word 97" },
    "rtf": { FAMILY_TEXT: "Rich Text Format" },
    "txt": { FAMILY_TEXT: "Text" },
    "ods": { FAMILY_SPREADSHEET: "calc8" },
    "xls": { FAMILY_SPREADSHEET: "MS Excel 97" },
    "odp": { FAMILY_PRESENTATION: "impress8" },
    "ppt": { FAMILY_PRESENTATION: "MS PowerPoint 97" },
    "swf": { FAMILY_PRESENTATION: "impress_flash_Export" }
}


class DocumentConversionException(Exception):

    def __init__(self, message):
        self.message = message

    def __str__(self):
        return self.message


def _unoProps(**args):
    props = []
    for key in args:
        prop = PropertyValue()
        prop.Name = key
        prop.Value = args[key]
        props.append(prop)
    return tuple(props)


class DocumentConverter:
   
    def __init__(self, port=DEFAULT_OPENOFFICE_PORT):
        localContext = uno.getComponentContext()
        resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
        try:
            context = resolver.resolve("uno:socket,host=localhost,port=%s;urp;StarOffice.ComponentContext" % port)
        except NoConnectException:
            raise DocumentConversionException, "failed to connect to OpenOffice.org on port %s" % port
        self.desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context)

    def convert(self, inputFile, outputFile):
        inputExt = self._fileExt(inputFile)
        outputExt = self._fileExt(outputFile)

        filterName = self._filterName(inputExt, outputExt)

        inputUrl = self._fileUrl(inputFile)
        outputUrl = self._fileUrl(outputFile)
       
        document = self.desktop.loadComponentFromURL(inputUrl, "_blank", 0, _unoProps(Hidden=True, ReadOnly=True))
        try:
          document.refresh()
        except AttributeError:
          pass
        document.storeToURL(outputUrl, _unoProps(FilterName=filterName))
        document.close(True)

    def _filterName(self, inputExt, outputExt):
        try:
            family = FAMILY_BY_EXTENSION[inputExt]
        except KeyError:
            raise DocumentConversionException, "unknown input format: '%s'" % inputExt
        try:
            filterByFamily = FILTER_BY_EXTENSION[outputExt]
        except KeyError:
            raise DocumentConversionException, "unknown output format: '%s'" % outputExt
        try:
            return filterByFamily[family]
        except KeyError:
            raise DocumentConversionException, "unsupported conversion: from '%s' to '%s'" % (inputExt, outputExt)

    def _fileExt(self, path):
        ext = splitext(path)[1]
        if ext is not None:
            return ext[1:].lower()
   
    def _fileUrl(self, path):
        return uno.systemPathToFileUrl(abspath(path))


if __name__ == "__main__":
    from sys import argv, exit
   
    if len(argv) < 3:
        print "USAGE: " + argv[0] + " <input-file> <output-file>"
        exit(255)

    try:
        converter = DocumentConverter()   
        converter.convert(argv[1], argv[2])
    except DocumentConversionException, exception:
        print "ERROR! " + str(exception)
        exit(1)

La pagina che ho linkato indica queste due righe come utili per iniziare la conversione, una fa partire Open Office in ascolto sulla porta 8100 e una fa avviare lo script:

Codice: Seleziona tutto
"C:\Program Files\OpenOffice.org 2.2\program\soffice" -accept="socket,port=8100;urp;"
"C:\Program Files\OpenOffice.org 2.2\program\python" DocumentConverter.py test.odt test.pdf


Avendo windows in italiano e Open Office in versione 2.4 la prima riga l'ho modificata così:
Codice: Seleziona tutto
"C:\Programmi\OpenOffice.org 2.4\program\soffice" -accept="socket,port=8100;urp;"


Dopo aver dato invio si apre la finestra di Open Office e con un NETSTAT -AN vedo questo:
TCP 127.0.0.1:8100 0.0.0.0:0 LISTENING

Deduco che il programma sia in ascolto sulla porta correttamente.
A questo punto copio il file con lo script e creo il file test.odt e poi do questo comando:

Codice: Seleziona tutto
"C:\Programmi\OpenOffice.org 2.4\program\python" "C:\Programmi\OpenOffice.org 2.4\program\DocumentConverter.py" test.odt test.pdf


La risposta è:
Codice: Seleziona tutto
ERROR! failed to connect to OpenOffice.org on port 8100



Dove sbaglio?

PS: che la sintassi della porta sia corretta l'ho verificato qui:
http://codesnippets.services.openoffice ... ppet_.snip
Avatar utente
Dylan666
Moderatore
 
Post: 39993
Iscritto il: 18/11/03 16:46

Sponsor
 

Re: Convertire da DOC a TXT con script Python in Open Office

Postdi Dylan666 » 09/04/08 11:41

UP!
Avatar utente
Dylan666
Moderatore
 
Post: 39993
Iscritto il: 18/11/03 16:46

Re: Convertire da DOC a TXT con script Python in Open Office

Postdi infinito1971 » 10/04/08 17:01

Ciao Dylan,
perche non provi a modificare lo script in modo tale che la porta utilizzata sia una porta diversa dalla 8100? In questo modo potresti capire se il problema dipende da un conflitto tra applicazioni che magari sono in ascolto sulla stessa porta... che ne dici?!?

Ciao,
infinito1971
Questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!
Avatar utente
infinito1971
Utente Senior
 
Post: 532
Iscritto il: 01/08/02 21:22
Località: Napoli

Re: Convertire da DOC a TXT con script Python in Open Office

Postdi Dylan666 » 11/04/08 08:15

Già provato con la 8100, 8500 e 4662 (dato che eMule sul PC non c'è) ma ho sempre lo stesso errore.
Mi dà la sensazione (non sono un esperto, quindi potrei sbagliare) che non sia la porta il problema ma un'altra delle parti di questo comando che fanno comunque scattare quel messaggio:

Codice: Seleziona tutto
resolver.resolve("uno:socket,host=localhost,port=%s;urp;StarOffice.ComponentContext" % port)


Esiste un modo per "scomporre" quella riga in una serie di test singoli in modo da verificare se per esempio ci sono problemi con "uno:socket" o con "StarOffice.ComponentContext"?
Avatar utente
Dylan666
Moderatore
 
Post: 39993
Iscritto il: 18/11/03 16:46


Torna a Programmazione


Topic correlati a "Convertire da DOC a TXT con script Python in Open Office":


Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti