[RESUELTO]Macro leer documentos odt y guardar como texto

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

[RESUELTO]Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

Tengo una macro en Microsoft Word que lee todos los documentos de una carpeta y los guarda en otra carpeta como documentos de texto (txt), la macro se ejecuta sola al abrirla. Quiero hacer lo mismo en LibreOffice Writer pero no veo la forma, y por mas que busco no encuentro nada. ¿Alguien sabe si es posible hacerlo?
Última edición por albfernan el Vie Sep 08, 2017 8:10 am, editado 1 vez en total.
lo 5.3.0.3 | win 7
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Macro leer documentos odt y guardar como texto

Mensaje por fornelasa »

Considero que si es posible hacerlo. ¿Podrías subir a este foro tu macro de Word?
Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por arivas_2005 »

Saludos.
Hace algun tiempo necesité de transformar muchísimos archivos .docx y .odt a texto plano
la referencia esta en este link
https://forum.openoffice.org/es/forum/v ... 2d264497d4

La tarea fue realizada por linea de comando, usando lo siguiente:
en linux

Código: Seleccionar todo

/opt/libreoffice4.4/program/soffice --headless --convert-to txt:Text iglesia.odt 
en windows

Código: Seleccionar todo

"c:\program files\libreoffice 4\program\soffice" --headless --convert-to txt:Text D:\iglesia.docx 
(ojo con la D:\ mayúscula, ya que los nombres de archivos, son sensibles a mayúsculas)
con ambas extensiones se obtiene igual resultado. Es decir, transforma por igual los dos tipos de archivo.
Libreoffice 4.7
Puppy slacko 6 y windows 7
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Macro leer documentos odt y guardar como texto

Mensaje por mauricio »

Con EasyMacro es trivial: https://forum.openoffice.org/es/forum/v ... 50&t=13062

Código: Seleccionar todo

def exportar_txt():
    app = LIBO()

    path = app.get_folder()
    files = app.get_files(path, 'odt')
    for f in files:
        print ('Exportando: {}'.format(f))
        doc = app.open(f, {'Hidden': True})
        path = app.replace_ext(doc.path, 'txt')
        doc.save(path, {'FilterName': 'Text'})
        print ('\tDocumento exportado: {}'.format(path))
        doc.close()
    print ('Exportación terminada...')
    return

Código: Seleccionar todo

└──> soffice --calc
Exportando: /home/mau/test/writer3.odt
	Documento exportado: /home/mau/test/writer3.txt
Exportando: /home/mau/test/writer1.odt
	Documento exportado: /home/mau/test/writer1.txt
Exportando: /home/mau/test/writer2.odt
	Documento exportado: /home/mau/test/writer2.txt
Exportación terminada...
Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

fornelasa escribió:Considero que si es posible hacerlo. ¿Podrías subir a este foro tu macro de Word?
Saludos, Federico.
copio las macros completas del documento, la ruta está puesta absoluta y la tengo que cambiar a relativa, pero eso es lo de menos.

Sub AutoOpen()
Dim nombreFichero As String

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "C:\CARTAS\entrada_word"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
For Each objFile In colFiles
'Wscript.Echo objFile.Name
nombreFichero = objFile.Name
If (nombreFichero <> "Thumbs.db") Then
Call DocumentoAFicheros(nombreFichero)
End If
Next

ActiveWindow.Close
End Sub

Sub DocumentoAFicheros(nombreFichero)
'DOC
If Mid(nombreFichero, Len(nombreFichero) - 3, 4) = ".doc" Then
nombreFichero_txt = Replace(nombreFichero, ".doc", ".txt")
End If
If Mid(nombreFichero, Len(nombreFichero) - 3, 4) = ".DOC" Then
nombreFichero_txt = Replace(nombreFichero, ".DOC", ".txt")
End If
'DOCX
If Mid(nombreFichero, Len(nombreFichero) - 4, 5) = ".docx" Then
nombreFichero_txt = Replace(nombreFichero, ".docx", ".txt")
End If
If Mid(nombreFichero, Len(nombreFichero) - 4, 5) = ".DOCX" Then
nombreFichero_txt = Replace(nombreFichero, ".DOCX", ".txt")
End If

Documents.Open FileName:="C:\CARTAS\entrada_word\" & nombreFichero _
, ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False, _
PasswordDocument:="", PasswordTemplate:="", Revert:=False, _
WritePasswordDocument:="", WritePasswordTemplate:="", Format:= _
wdOpenFormatAuto, XMLTransform:=""
ActiveDocument.SaveAs FileName:= _
"C:\CARTAS\salida_txt\" & nombreFichero_txt, FileFormat:= _
wdFormatText, LockComments:=False, Password:="", AddToRecentFiles:=True, _
WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False, Encoding:=1252, InsertLineBreaks:=True, AllowSubstitutions:=False, _
LineEnding:=wdCRLF
ActiveWindow.Close
End Sub
Última edición por albfernan el Mié Sep 06, 2017 11:15 am, editado 1 vez en total.
lo 5.3.0.3 | win 7
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

arivas_2005 escribió:Saludos.
Hace algun tiempo necesité de transformar muchísimos archivos .docx y .odt a texto plano
la referencia esta en este link
https://forum.openoffice.org/es/forum/v ... 2d264497d4

La tarea fue realizada por linea de comando, usando lo siguiente:
en linux

Código: Seleccionar todo

/opt/libreoffice4.4/program/soffice --headless --convert-to txt:Text iglesia.odt 
en windows

Código: Seleccionar todo

"c:\program files\libreoffice 4\program\soffice" --headless --convert-to txt:Text D:\iglesia.docx 
(ojo con la D:\ mayúscula, ya que los nombres de archivos, son sensibles a mayúsculas)
con ambas extensiones se obtiene igual resultado. Es decir, transforma por igual los dos tipos de archivo.
he probado esta solución y funciona perfectamente bajo ms-dos escribiendo la ruta, pero si lo hago en un .bat no funciona, no lo entiendo. ahora voy a probar a ejecutar el comando desde vb.net
lo 5.3.0.3 | win 7
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por arivas_2005 »

Saludos.

Idea..
despues de googlear..... !
suponiendo que usa Windows 7 profesional

1ª crear un archivo de texto con los nombres (y rutas completas) de los documentos a transformar (ej. DIR /B/S D:\*.docx > D:\input.txt y luego se depura manualmente)

2º utilizar un script bat para leer cada uno de los nombres de documentos y transformarlo, como por ejemplo el siguiente
@ echo off
C:
cd \program files\libreoffice 4\
For /F "tokens=* delims=" %%A in (D:\input.txt) do ( " C:\Program Files\Libreoffice 4\program\soffice.exe" --headless --convert-to txt:Text "%%A")
D:
los archivos txt transformados se alojan en \Program Files\Libreoffice 4\
Libreoffice 4.7
Puppy slacko 6 y windows 7
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Macro leer documentos odt y guardar como texto

Mensaje por fornelasa »

Tambien, tal vez algo como esto:
albfernan escribió:Macro leer documentos odt y guardar como texto
albfernan escribió:Quiero hacer lo mismo en LibreOffice Writer
Esta macro es una especie de traducción de tu macro Word

Asignala al evento "Abrir documento" del menú Herramientas <> Personalizar <> Sucesos (o Eventos)

Código: Seleccionar todo

Sub Convertir_De_Odt_A_Txt()
   dim Opciones()      
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dim args1(1) as new com.sun.star.beans.PropertyValue
 args1(0).Name = "URL"
 args1(1).Name = "FilterName"
args1(1).Value = "Text"   
       carpeta = "C:\TuRuta\"
       destino = "C:\OtraRuta\"
          tipo = "*.odt"
          ruta = carpeta + tipo
         ofile = dir(ruta)       
   do
       archivo = ConvertToUrl(carpeta + ofile)
       DocCalc = StarDesktop.loadComponentFromURL(archivo, "_blank", 0, Opciones())
      document = DocCalc.CurrentController.Frame
       args1(0).Value = ConvertToUrl(destino + Replace(ofile, ".odt", ".txt"))
     dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
       document.Close(True)
         ofile = dir
   loop until ofile = ""
       msgbox "¡Listo!"
End Sub
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

mauricio escribió:Con EasyMacro es trivial: https://forum.openoffice.org/es/forum/v ... 50&t=13062

Código: Seleccionar todo

def exportar_txt():
    app = LIBO()

    path = app.get_folder()
    files = app.get_files(path, 'odt')
    for f in files:
        print ('Exportando: {}'.format(f))
        doc = app.open(f, {'Hidden': True})
        path = app.replace_ext(doc.path, 'txt')
        doc.save(path, {'FilterName': 'Text'})
        print ('\tDocumento exportado: {}'.format(path))
        doc.close()
    print ('Exportación terminada...')
    return

Código: Seleccionar todo

└──> soffice --calc
Exportando: /home/mau/test/writer3.odt
	Documento exportado: /home/mau/test/writer3.txt
Exportando: /home/mau/test/writer1.odt
	Documento exportado: /home/mau/test/writer1.txt
Exportando: /home/mau/test/writer2.odt
	Documento exportado: /home/mau/test/writer2.txt
Exportación terminada...
Saludos
gracias, no conocía EasyMacro, echaré un vistazo
lo 5.3.0.3 | win 7
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

albfernan escribió:
arivas_2005 escribió:Saludos.
Hace algun tiempo necesité de transformar muchísimos archivos .docx y .odt a texto plano
la referencia esta en este link
https://forum.openoffice.org/es/forum/v ... 2d264497d4

La tarea fue realizada por linea de comando, usando lo siguiente:
en linux

Código: Seleccionar todo

/opt/libreoffice4.4/program/soffice --headless --convert-to txt:Text iglesia.odt 
en windows

Código: Seleccionar todo

"c:\program files\libreoffice 4\program\soffice" --headless --convert-to txt:Text D:\iglesia.docx 
(ojo con la D:\ mayúscula, ya que los nombres de archivos, son sensibles a mayúsculas)
con ambas extensiones se obtiene igual resultado. Es decir, transforma por igual los dos tipos de archivo.
he probado esta solución y funciona perfectamente bajo ms-dos escribiendo la ruta, pero si lo hago en un .bat no funciona, no lo entiendo. ahora voy a probar a ejecutar el comando desde vb.net
bueno, ya he conseguido que me funcionen los comandos en el .bat, era una tontería, le puse una pausa en el bat (timeout /t 15 /nobreak) para comprobar el error y era por tema de permisos, me daba el error de que no tenia acceso al fichero pero no lo veía al cerrarse la ventana automáticamente. ejecutando el bat como administrador funciona, pensaba que sería otra cosa, que tendría algún error en el comando ya que soy administrador del equipo, es la primera vez que me ocurre.
lo 5.3.0.3 | win 7
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Macro leer documentos odt y guardar como texto

Mensaje por fornelasa »

albfernan, si consideras que el tema ha sido resuelto por favor marquemoslo como tal, aquí nos dicen como hacerlo:
https://forum.openoffice.org/es/forum/v ... f=3&t=2668

Saludos.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

arivas_2005 escribió:Saludos.

Idea..
despues de googlear..... !
suponiendo que usa Windows 7 profesional

1ª crear un archivo de texto con los nombres (y rutas completas) de los documentos a transformar (ej. DIR /B/S D:\*.docx > D:\input.txt y luego se depura manualmente)

2º utilizar un script bat para leer cada uno de los nombres de documentos y transformarlo, como por ejemplo el siguiente
@ echo off
C:
cd \program files\libreoffice 4\
For /F "tokens=* delims=" %%A in (D:\input.txt) do ( " C:\Program Files\Libreoffice 4\program\soffice.exe" --headless --convert-to txt:Text "%%A")
D:
los archivos txt transformados se alojan en \Program Files\Libreoffice 4\
sí, esa es la idea ya que el programa se usa diariamente y lo ejecutan varios usuarios, lo he automatizado y funciona perfectamente
lo 5.3.0.3 | win 7
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

fornelasa escribió:Tambien, tal vez algo como esto:
albfernan escribió:Macro leer documentos odt y guardar como texto
albfernan escribió:Quiero hacer lo mismo en LibreOffice Writer
Esta macro es una especie de traducción de tu macro Word

Asignala al evento "Abrir documento" del menú Herramientas <> Personalizar <> Sucesos (o Eventos)

Código: Seleccionar todo

Sub Convertir_De_Odt_A_Txt()
   dim Opciones()      
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dim args1(1) as new com.sun.star.beans.PropertyValue
 args1(0).Name = "URL"
 args1(1).Name = "FilterName"
args1(1).Value = "Text"   
       carpeta = "C:\TuRuta\"
       destino = "C:\OtraRuta\"
          tipo = "*.odt"
          ruta = carpeta + tipo
         ofile = dir(ruta)       
   do
       archivo = ConvertToUrl(carpeta + ofile)
       DocCalc = StarDesktop.loadComponentFromURL(archivo, "_blank", 0, Opciones())
      document = DocCalc.CurrentController.Frame
       args1(0).Value = ConvertToUrl(destino + Replace(ofile, ".odt", ".txt"))
     dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
       document.Close(True)
         ofile = dir
   loop until ofile = ""
       msgbox "¡Listo!"
End Sub
lo he resuelto utilizando los comandos en el bat, me era más fácil ya que no estoy familiarizado con lo. De todas formas voy a probar tu macro a ver si soy capaz de adaptarla y que funcione ya que me puede venir muy bien para otros trabajos, muchas gracias.
lo 5.3.0.3 | win 7
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

fornelasa escribió:albfernan, si consideras que el tema ha sido resuelto por favor marquemoslo como tal, aquí nos dicen como hacerlo:
https://forum.openoffice.org/es/forum/v ... f=3&t=2668

Saludos.
marcado como resuelto
lo 5.3.0.3 | win 7
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: [RESUELTO]Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

pego el código completo para VB.NET por si alguna vez os hiciera falta y lo explico un poco:

-borrar la bbdd temporal donde se va a volcar la información
-borrar los ficheros en la ruta de salida donde se van a crear los documentos creados (los ficheros txt son un paso intermedio)
-creo un fichero bat de forma dinámica con todos los ficheros odt que se encuentran en la carpeta a convertir en txt
-ejecuto el bat (que funciona perfectamente)
-más código ...

Código: Seleccionar todo

Imports System.IO
Imports System.Data.SqlClient

Module func_procesos

    Public Sub procesos(rutaEntrada As String, rutaSalida As String)

        Dim connSQL As New SqlConnection
        Dim cmdSQL As New SqlCommand
        connSQL = New SqlConnection(ConexionValidada.ToString)
        connSQL.Open()
        cmdSQL.Connection = connSQL

        'BORRAR TABLAS TEMPORALES
        cmdSQL.CommandText = "DELETE FROM wrk_bbdd"
        cmdSQL.ExecuteNonQuery()

        '******************************************************************************
        'BORRAR FICHEROS EN CARPETA DE SALIDA ANTES DE PROCESAR
        '******************************************************************************
        For Each listaCarpeta As String In My.Computer.FileSystem.GetFiles(rutaSalida)
            My.Computer.FileSystem.DeleteFile(listaCarpeta)
        Next

        '******************************************************************************
        'CREAR BAT
        '******************************************************************************
        Dim array_lista As New ArrayList
        Dim conta_bat As Integer = 0
        Dim ficheroSalidaBat As String = "proceso_bat.bat"

        'listar ficheros a procesar para incluir en bat
        Dim rutacarpeta As New DirectoryInfo(rutaEntrada)
        For Each file As FileInfo In rutacarpeta.GetFiles("*.odt")
            array_lista.Add(file.Name)
        Next

        'comprobar que haya ficheros
        Dim countArray_lista = array_lista.Count
        If countArray_lista = 0 Then
            Console.Write("No hay ficheros")
            Console.ReadLine()
            Exit Sub
        End If

        Dim st As StreamWriter
        st = New StreamWriter("C:\rutaSalidaBat\" & ficheroSalidaBat, False)
        Dim texto As String = ""

        'añadir lineas a bat
        If array_lista IsNot Nothing Then
            For i = 0 To countArray_lista - 1
                conta_bat += 1
                If conta_bat = 1 Then
                    texto = "cd /d " & """" & rutaSalida.Remove(rutaSalida.Length - 1) & """"
                    texto &= vbCrLf
                    st.Write(texto)
                End If
                texto = """c:\program files\libreoffice 5\program\soffice""" & " --headless --convert-to txt:Text " & """" & rutaEntrada & array_lista(i) & """"
                texto &= vbCrLf
                st.Write(texto)
            Next
            st.Close()
        End If

        '******************************************************************************
        'CONVERTIR DOCUMENTOS A TXT PROCESANDO BAT
        '******************************************************************************
        Shell("C:\ruta_bat\proceso_bat.bat", AppWinStyle.Hide, True)

        'MAS CODIGO....

    End Sub

End Module
muestra del contenido del fichero bat que se crea cada vez que se procesa el programa

Código: Seleccionar todo

cd /d "c:\ruta_salida"
"c:\program files\libreoffice 5\program\soffice" --headless --convert-to txt:Text "c:\ruta_entrada\file1.odt"
"c:\program files\libreoffice 5\program\soffice" --headless --convert-to txt:Text "c:\ruta_entrada\file2.odt"
lo 5.3.0.3 | win 7
albfernan
Mensajes: 23
Registrado: Mar Sep 05, 2017 1:21 pm

Re: Macro leer documentos odt y guardar como texto

Mensaje por albfernan »

fornelasa escribió:Tambien, tal vez algo como esto:
albfernan escribió:Macro leer documentos odt y guardar como texto
albfernan escribió:Quiero hacer lo mismo en LibreOffice Writer
Esta macro es una especie de traducción de tu macro Word

Asignala al evento "Abrir documento" del menú Herramientas <> Personalizar <> Sucesos (o Eventos)

Código: Seleccionar todo

Sub Convertir_De_Odt_A_Txt()
   dim Opciones()      
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dim args1(1) as new com.sun.star.beans.PropertyValue
 args1(0).Name = "URL"
 args1(1).Name = "FilterName"
args1(1).Value = "Text"   
       carpeta = "C:\TuRuta\"
       destino = "C:\OtraRuta\"
          tipo = "*.odt"
          ruta = carpeta + tipo
         ofile = dir(ruta)       
   do
       archivo = ConvertToUrl(carpeta + ofile)
       DocCalc = StarDesktop.loadComponentFromURL(archivo, "_blank", 0, Opciones())
      document = DocCalc.CurrentController.Frame
       args1(0).Value = ConvertToUrl(destino + Replace(ofile, ".odt", ".txt"))
     dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
       document.Close(True)
         ofile = dir
   loop until ofile = ""
       msgbox "¡Listo!"
End Sub
funciona perfectamente, muchas gracias.
lo 5.3.0.3 | win 7
Responder