2009-07-10 29 views
9

Necesito una forma de convertir .doc o .docx extensiones a .txt sin instalar nada. Tampoco quiero tener que abrir manualmente Word para hacer esto obviamente. Siempre y cuando se ejecute en automático.Convierte archivos Word doc o docx en archivos de texto?

Estaba pensando que Perl o VBA podrían hacer el truco, pero tampoco puedo encontrar nada en línea.

¿Alguna sugerencia?

Respuesta

8

Tenga en cuenta que una excelente fuente de información para las aplicaciones de Microsoft Office es el Examinador de objetos. Puede acceder a través de ToolsMacroVisual Basic Editor. Una vez que esté en el editor, pulse F2 para explorar las interfaces, los métodos y las propiedades proporcionadas por las aplicaciones de Microsoft Office.

Aquí hay un ejemplo usando Win32::OLE:

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Spec::Functions qw(catfile); 

use Win32::OLE; 
use Win32::OLE::Const 'Microsoft Word'; 
$Win32::OLE::Warn = 3; 

my $word = get_word(); 
$word->{Visible} = 0; 

my $doc = $word->{Documents}->Open(catfile $ENV{TEMP}, 'test.docx'); 

$doc->SaveAs(
    catfile($ENV{TEMP}, 'test.txt'), 
    wdFormatTextLineBreaks 
); 

$doc->Close(0); 

sub get_word { 
    my $word; 
    eval { 
     $word = Win32::OLE->GetActiveObject('Word.Application'); 
    }; 

    die "[email protected]\n" if [email protected]; 

    unless(defined $word) { 
     $word = Win32::OLE->new('Word.Application', sub { $_[0]->Quit }) 
      or die "Oops, cannot start Word: ", 
        Win32::OLE->LastError, "\n"; 
    } 
    return $word; 
} 
__END__ 
1

. Los que usan el WordprocessingML y .docx's XML format pueden tener su XML analizado para recuperar el texto real del documento. Tendrás que leer sus especificaciones para descubrir qué etiquetas contienen texto legible.

0

No puede hacerlo en VBA si no desea iniciar Word (u otra aplicación de Office). Incluso si se refería a VB, aún tendría que iniciar una instancia (oculta) de Word para hacer el procesamiento.

+0

con tal de que se puede automatizar a través de una tarea programada en una PC de Windows, no importa si la palabra está abierta ... reescribir la pregunta – CheeseConQueso

2

¿Está tratando de hacer esto sin que requiera algún componente instalado de MS Office? Incluso entonces, VBA le pedirá que instale las bibliotecas COM para que funcionen.

¿Qué hay de la automatización Perl Win32::OLE?

4

Recomiendo encarecidamente AsposeWords si puede hacer Java o .NET. Puede convertir, sin Word instalado, entre todos los tipos principales de archivos de texto.

12

Un simple Perl única solución para docx:

  1. Uso Archive::Zip para obtener el archivo de su archivo word/document.xmldocx. (Un docx es solo un archivo comprimido.)

  2. Use XML::LibXML para analizarlo.

  3. Luego use XML::LibXSLT para transformarlo en texto o formato html. Busque en la web para encontrar un buen archivo docx2txt.xsl :)

¡Salud!

J.

4

Si usted tiene un cierto sabor de Unix instalado, puede utilizar la utilidad 'cuerdas' para encontrar y extraer todas las cadenas legibles desde el documento. Habrá un desorden antes y después del texto que está buscando, pero los resultados serán legibles.

+0

esta es una gran herramienta ... nunca la había usado demasiado hasta ahora y me preguntaba de dónde saqué la información de. gracias de nuevo – CheeseConQueso

1

necesito una manera de convertir .doc o .docx extensiones a .txt sin instalar nada

for I in *.doc?; do mv $I `echo $ | sed 's/\.docx?/\.txt'`; done 

Sólo bromeando.

Puede usar antiword para las versiones anteriores de documentos de Word e intentar analizar el xml de los nuevos.

2

Tenga en cuenta que también puede usar OpenOffice para realizar conversiones de documentos diversos, dibujo, spreadhseet, etc. en plataformas Windows y * nix.

Puede acceder a OpenOffice programáticamente (de manera análoga a COM en Windows) a través del UNO desde una variedad de idiomas para los que existe una vinculación UNO, incluso desde Perl a través del módulo OpenOffice::UNO.

Por OpenOffice::UNO page también puede encontrar una muestra de Perl scriplet que se abre un documento, entonces todo lo que necesita hacer es exportarlo a txt utilizando el método document.storeToURL() - ver a Python example que se puede adaptar fácilmente a su Perl necesita.

4

Para .doc, he tenido cierto éxito con la herramienta de línea de comandos de Linux antiword. Extrae el texto de .doc muy rápidamente, dando una buena representación de sangría. Luego puedes canalizar eso a un archivo de texto en bash.

Para .docx, he usado el OOXML SDK como mencionaron algunos otros usuarios. Es solo una biblioteca .NET para facilitar el trabajo con OOXML que está comprimido en un archivo OOXML. Hay muchos metadatos que deseará descartar si solo está interesado en el texto. Algunas otras personas ya han escrito el código que veo: DocXToText.

Aspose.Words tiene una API muy simple con un gran soporte también que he encontrado.

También existe este comando bash commandlinefu.com que funciona mediante descomprimir el .docx:

unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g' 
1

El método de Sinan Unur funciona bien.
Sin embargo, tuve algunos problemas con los archivos que estaba transformando.

Otro método es usar Win32 :: OLE y Win32 :: portapapeles como tal:

  • Abra el documento de Word
  • seleccionar todo el texto
  • Copiar en el portapapeles
  • Imprimir la contenido del Portapapeles en un archivo de texto
  • Vaciar el Portapapeles y cerrar el documento de Word

Basado en el script dado por Sigvald Refsu en http://computer-programming-forum.com/53-perl/c44063de8613483b.htm, se me ocurrió la siguiente secuencia de comandos.

Nota: Elegí guardar el archivo txt con el mismo nombre que el.docx y en la misma carpeta, pero esto se puede cambiar fácilmente

########################################### 
use strict; 
use File::Spec::Functions qw(catfile); 
use FindBin '$Bin'; 
use Win32::OLE qw(in with); 
use Win32::OLE::Const 'Microsoft Word'; 
use Win32::Clipboard; 

my $monitor_word=0; #set 1 to watch MS Word being opened and closed 

sub docx2txt { 
    ##Note: the path shall be in the form "C:\dir\ with\ space\file.docx"; 
    my $docx_file=shift; 

    #MS Word object 
    my $Word = Win32::OLE->new('Word.Application', 'Quit') or die "Couldn't run Word"; 
    #Monitor what happens in MS Word 
    $Word->{Visible} = 1 if $monitor_word; 

    #Open file 
    my $Doc = $Word->Documents->Open($docx_file); 
    with ($Doc, ShowRevisions => 0); #Turn of revision marks 

    #Select the complete document 
    $Doc->Select(); 
    my $Range = $Word->Selection(); 
    with ($Range, ExtendMode => 1); 
    $Range->SelectAll(); 

    #Copy selection to clipboard 
    $Range->Copy(); 

    #Create txt file 
    my $txt_file=$docx_file; 
    $txt_file =~ s/\.docx$/.txt/; 
    open(TextFile,">$txt_file") or die "Error while trying to write in $txt_file (!$)"; 
    printf TextFile ("%s\n", Win32::Clipboard::Get()); 
    close TextFile; 

    #Empty the Clipboard (to prevent warning about "huge amount of data in clipboard") 
    Win32::Clipboard::Set(""); 

    #Close Word file without saving 
    $Doc->Close({SaveChanges => wdDoNotSaveChanges}); 

    # Disconnect OLE 
    undef $Word; 
} 

espero que le puede ayuda.

0

Con docxtemplater, puede obtener fácilmente el texto completo de una palabra (solo funciona con docx).

Aquí está el código (Node.JS)

DocxTemplater=require('docxtemplater'); 
doc=new DocxTemplater().loadFromFile("input.docx"); 
result=doc.getFullText(); 

Ésta es sólo tres líneas de código y no depende de ninguna instancia palabra (todo llano JS)

Cuestiones relacionadas