Converter arquivos doc ou docx do Word em arquivos de texto?
-
12-09-2019 - |
Pergunta
Eu preciso de uma maneira de converter .doc
ou .docx
extensões para .txt
sem instalar nada. Eu também não quero ter que abrir manualmente Word para fazer isso, obviamente. Enquanto ele está sendo executado em auto.
Eu estava pensando que ou Perl ou VBA poderia fazer o truque, mas eu não consigo encontrar nada on-line para qualquer um.
Todas as sugestões?
Solução
Note que uma excelente fonte de informação para aplicações do Microsoft Office é a Navegador de Objetos . Você pode acessá-lo através Tools
? Macro
? Visual Basic Editor
. Uma vez que você estiver no editor, bateu F2 para percorrer as interfaces, métodos e propriedades fornecidas por aplicativos do Microsoft Office.
Aqui está um exemplo 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__
Outras dicas
A única solução simples Perl para docx:
-
Use Arquivo :: Zip para obter o arquivo
word/document.xml
do seu arquivodocx
. (A docx é apenas um arquivo zipado.) -
Use XML :: LibXML para analisá-lo.
-
Em seguida, use XML :: libxslt para transformá-lo em texto ou formato html. Da pesquisa na web para encontrar uma boa docx2txt.xsl arquivo:)
Felicidades!
J.
Para .doc, eu tive algum sucesso com a ferramenta de linha de comando do Linux antiword . Ele extrai o texto da .doc muito rapidamente, dando uma boa prestação de recuo. Então você pode canalizar isso para um arquivo de texto em bash.
Para .docx, eu usei o SDK OOXML como alguns outros usuários mencionados. É apenas uma biblioteca .NET para torná-lo mais fácil de trabalhar com o OOXML que está enrolado em um arquivo OOXML. Existe uma grande quantidade de metadados que você deseja descartar Se você está interessado apenas no texto. Algumas outras pessoas já escrevi o código que eu vejo:. DocXToText
Aspose.Words tem uma API muito simples, com grande apoio também eu encontrei.
Há também este comando bash commandlinefu.com que funciona por descompactar o .docx:
unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
Eu recomendo fortemente AsposeWords se você pode fazer Java ou .NET. Ele pode converter, sem o Word instalado, entre todos os principais tipos de arquivo de texto.
Se você tem algum sabor de UNIX instalado, você pode usar o utilitário 'cordas' para encontrar e extrair todas as strings legível do documento. Haverá alguma confusão antes e depois do texto que você está procurando, mas os resultados serão legível.
Note que você também pode usar OpenOffice para executar documento miscelânea, desenho, spreadhseet etc. conversões em ambos nix Windows e *.
Você pode acessar OpenOffice programaticamente (em uma análoga maneira de COM no Windows) via UNO a partir de uma variedade de idiomas para os quais ligam a ONU existe, inclusive do Perl através do OpenOffice :: UNO módulo.
Na página OpenOffice :: UNO você também vai encontrar uma amostra Perl scriptlet que abre um documento, tudo o que você precisa então de fazer é exportá-lo para txt
usando o método document.storeToURL()
- veja um exemplo Python que pode ser facilmente adaptado ao seu Perl necessidades.
O .doc que usam o WordprocessingML .docx formato XML podem ter seu XML analisado para recuperar o texto do documento. Você vai ter que ler as suas especificações para descobrir quais tags contêm texto legível.
O método de Sinan Ünür funciona bem.
No entanto, eu tenho algum acidente com os arquivos eu estava transformando.
Outro método é usar Win32 :: OLE e Win32 :: Área de Transferência como tal:
- Abra o documento do Word
- Selecione todo o texto
- Copiar na área de transferência
- Imprima o conteúdo da área de transferência em um arquivo txt
- Esvaziar a área de transferência e fechar o documento do Word
Com base no roteiro dada pelo Sigvald Refsu em http: // computador de programação -forum.com/53-perl/c44063de8613483b.htm , eu vim com o seguinte script.
Nota: eu escolhi para salvar o arquivo txt com o mesmo nome base como o arquivo .docx e na mesma pasta, mas isso pode ser facilmente alterado
###########################################
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 possa ajuda-o.
Você não pode fazê-lo em VBA, se você não quiser iniciar o Word (ou outro aplicativo do Office). Mesmo se você quis dizer VB, você ainda teria que iniciar uma instância (oculto) do Word para fazer o processamento.
Eu preciso de uma maneira de .doc convertido ou extensões .docx para .txt sem instalar nada
for I in *.doc?; do mv $I `echo $ | sed 's/\.docx?/\.txt'`; done
Apenas brincando.
Você pode usar antiword para as versões mais antigas de documentos do Word, e tentar analisar o XML dos novos.
Com docxtemplater , você pode facilmente obter o texto completo de uma palavra (Funciona apenas com docx).
Aqui está o código (Node.js)
DocxTemplater=require('docxtemplater');
doc=new DocxTemplater().loadFromFile("input.docx");
result=doc.getFullText();
Este é apenas três linhas de código e não depende de qualquer instância palavra (todo o plain JS)