2009-07-10 11 views
9

Ho bisogno di un modo per convertire le estensioni .doc o .docx su .txt senza installare nulla. Inoltre, non voglio dover aprire manualmente Word per farlo ovviamente. Finché funziona su auto.Converti file di documenti o docx di Word in file di testo?

Stavo pensando che Perl o VBA potrebbero fare il trucco, ma non riesco a trovare nulla online per nessuno dei due.

Qualche suggerimento?

risposta

8

Si noti che un'eccellente fonte di informazioni per le applicazioni Microsoft Office è il Browser oggetti. È possibile accedervi tramite ToolsMacroVisual Basic Editor. Una volta entrato nell'editor, premi F2 per esplorare le interfacce, i metodi e le proprietà forniti dalle applicazioni di Microsoft Office.

Ecco un esempio utilizzando 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

.doc che utilizzano WordprocessingML e .docx's XML format possono avere il loro XML analizzato per recuperare il testo effettivo del documento. Dovrai leggere le loro specifiche per capire quali tag contengono testo leggibile.

0

Non è possibile farlo in VBA se non si desidera avviare Word (o un'altra applicazione di Office). Anche se intendevi VB, dovresti comunque avviare un'istanza (nascosta) di Word per eseguire l'elaborazione.

+0

fintanto che può essere automatizzato attraverso un'attività pianificata su un PC Windows, non importa se la parola è aperta .... ripara male la domanda – CheeseConQueso

2

Si sta provando a fare questo senza che richiede componenti installati di MS Office? Anche in questo caso, VBA richiederà l'installazione delle librerie COM per funzionare.

E l'automazione Perl Win32::OLE?

4

Si consiglia vivamente AsposeWords se è possibile eseguire Java o .NET. Può convertire, senza Word installato, tra tutti i principali tipi di file di testo.

12

Una semplice Perl unica soluzione per i docx:

  1. Usa Archive::Zip per ottenere il file word/document.xml dal file docx. (Un docx è solo un archivio compresso.)

  2. Utilizzare XML::LibXML per analizzarlo.

  3. Quindi utilizzare XML::LibXSLT per trasformarlo in formato testo o html. Seach the web per trovare un bel file docx2txt.xsl :)

Cheers!

J.

4

Se si dispone di un certo sapore di Unix installato, è possibile utilizzare l'utilità 'stringhe' per trovare ed estrarre tutte le stringhe leggibili dal documento. Ci sarà un pasticcio prima e dopo il testo che stai cercando, ma i risultati saranno leggibili.

+0

questo è un ottimo strumento ... non l'ho mai usato molto fino ad ora e mi stavo chiedendo dove ho preso le informazioni a partire dal. grazie ancora – CheeseConQueso

1

Ho bisogno di un modo per convertire le estensioni .doc o .docx a .txt senza installare nulla

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

solo scherzando.

È possibile utilizzare antiword per le versioni precedenti di documenti di Word e cercare di analizzare l'xml di quelli nuovi.

2

Si noti che è anche possibile utilizzare OpenOffice per eseguire conversioni di documenti, disegni, spreadhseet, ecc. Su piattaforme Windows e * nix.

È possibile accedere a OpenOffice in modo programmatico (in modo analogo a COM su Windows) tramite UNO da una varietà di lingue per le quali esiste un collegamento UNO, incluso da Perl tramite il modulo OpenOffice::UNO.

Sul OpenOffice::UNO page troverete anche un campione Perl scriptlet che si apre un documento, tutto ciò che poi dovete fare è esportarlo in txt utilizzando il metodo document.storeToURL() - vedere a Python example che può essere facilmente adattato per il vostro Perl ha bisogno.

4

Per .doc, ho avuto un discreto successo con lo strumento da riga di comando linux antiword. Estrae il testo da .doc molto rapidamente, dando una buona resa di indentazione. Quindi puoi collegarlo a un file di testo in bash.

Per .docx, ho utilizzato l'OOXML SDK come altri utenti menzionati. È solo una libreria .NET per semplificare il lavoro con OOXML che è compresso in un file OOXML. Ci sono molti metadati che vorresti scartare se ti interessa solo il testo. Alcune altre persone hanno già scritto il codice che vedo: DocXToText.

Aspose.Words ha un'API molto semplice con un ottimo supporto che ho trovato.

C'è anche questo comando bash da commandlinefu.com che funziona decompresso il .docx:

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

Procedimento Sinan Unur funziona bene.
Tuttavia, ho avuto un crash con i file che stavo trasformando.

Un altro metodo è quello di utilizzare Win32 :: OLE e Win32 :: Appunti come ad esempio:

  • Aprire il documento di Word
  • selezionare tutto il testo
  • Copia nella Clipboard
  • Stampa la contenuto di Appunti in un file txt
  • Svuota gli Appunti e chiude il documento Word

In base alla sceneggiatura di Sigvald Refsu in http://computer-programming-forum.com/53-perl/c44063de8613483b.htm, ho trovato il seguente script.

Nota: ho scelto di salvare il file txt con lo stesso nome base del file.file docx e nella stessa cartella, ma questo può essere facilmente modificato

########################################### 
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; 
} 

spero che ti può ti aiuta.

0

Con docxtemplater, è possibile ottenere facilmente il testo completo di una parola (funziona solo con docx).

Ecco il codice (Node.JS)

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

Questo è solo tre linee di codice e non dipende da qualsiasi istanza parola (tutto normale JS)