perl - qué - Convierte archivos Word doc o docx en archivos de texto?
que es un archivo docx (12)
Necesito una forma de convertir las extensiones .doc
o .docx
a .txt
sin instalar nada. Tampoco quiero tener que abrir manualmente Word para hacer esto obviamente. Siempre y cuando se ejecute en automático.
Estaba pensando que Perl o VBA podrían hacer el truco, pero tampoco puedo encontrar nada en línea.
¿Alguna sugerencia?
¿Está tratando de hacer esto sin requerir ningú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 ?
.doc que usan el formato XML de WordprocessingML y .docx puede tener su XML analizado para recuperar el texto real del documento. Tendrás que leer sus especificaciones para descubrir qué etiquetas contienen texto legible.
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.
Recomiendo encarecidamente AsposeWords si puedes hacer Java o .NET. Puede convertir, sin Word instalado, entre todos los tipos principales de archivos de texto.
Si tiene algún sabor de Unix instalado, puede usar la utilidad ''cadenas'' para buscar y extraer todas las cadenas legibles del documento. Habrá un desorden antes y después del texto que está buscando, pero los resultados serán legibles.
Tenga en cuenta que una excelente fuente de información para las aplicaciones de Microsoft Office es el Examinador de objetos . Puede acceder a él a través de Tools
→ Macro
→ Visual Basic Editor
. Una vez que esté en el editor, presione 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 "$@/n" if $@;
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__
Una solución simple de Perl para docx:
Utilice Archive :: Zip para obtener el archivo
word/document.xml
de su archivodocx
. (Un docx es solo un archivo comprimido).Use XML :: LibXML para analizarlo.
A continuación, utilice XML :: LibXSLT para transformarlo en formato de texto o html. Busca en la web para encontrar un buen archivo docx2txt.xsl :)
¡Salud!
J.
Necesito una forma de convertir las extensiones .doc o .docx a .txt sin instalar nada
for I in *.doc?; do mv $I `echo $ | sed ''s//.docx?//.txt''`; done
Solo bromeaba.
Podría usar antiword para las versiones anteriores de documentos de Word e intentar analizar el xml de los nuevos.
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 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 también tiene una API muy simple con un gran soporte que he encontrado.
También existe este comando bash de commandlinefu.com que funciona descomprimiendo el .docx:
unzip -p some.docx word/document.xml | sed -e ''s/<[^>]/{1,/}>//g; s/[^[:print:]]/{1,/}//g''
Tenga en cuenta que también puede usar OpenOffice para realizar conversiones de documentos diversos, dibujos, spreadhseet, etc. en plataformas Windows y * nix.
Puede acceder a OpenOffice mediante programación (de forma análoga a COM en Windows) a través de UNO desde una variedad de idiomas para los cuales existe un enlace UNO, incluso desde Perl a través del módulo OpenOffice :: UNO .
En la página de OpenOffice :: UNO también encontrará un scriptlet de muestra de Perl que abre un documento, todo lo que necesita hacer es exportarlo a txt
usando el método document.storeToURL()
- vea un ejemplo de Python que puede ser fácilmente adaptado a tus necesidades de Perl
El método de Sinan Ünür funciona bien.
Sin embargo, tuve algunos problemas con los archivos que estaba transformando.
Otro método es usar Win32 :: OLE y Win32 :: Clipboard como tal:
- Abra el documento de Word
- Seleccione todo el texto
- Copiar en el Portapapeles
- Imprima el contenido del Portapapeles en un archivo txt
- Vacíe el portapapeles y cierre 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ó el siguiente script.
Nota: Elegí guardar el archivo txt con el mismo nombre base que el archivo .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 pueda ayudarte.
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();
Esto es solo tres líneas de código y no depende de ninguna instancia de palabra (todas las JS simples)