13

我需要一种在不安装任何东西的情况下进行转换.doc.docx扩展的方法。.txt显然,我也不想手动打开 Word 来执行此操作。只要它在自动运行。

我在想 Perl 或 VBA 都可以解决问题,但我在网上都找不到任何东西。

有什么建议么?

4

11 回答 11

13

一个简单的仅适用于 docx 的 Perl 解决方案:

  1. 使用Archive::Zipword/document.xml从您的文件中获取docx文件。(一个 docx 只是一个压缩档案。)

  2. 使用XML::LibXML来解析它。

  3. 然后使用XML::LibXSLT将其转换为文本或 html 格式。搜索网络以找到一个不错的docx2txt.xsl文件 :)

干杯!

J。

于 2009-07-10T17:02:25.493 回答
9

请注意,Microsoft Office 应用程序的一个极好的信息来源是对象浏览器。您可以通过ToolsMacro→访问它Visual Basic Editor。进入编辑器后,点击F2浏览 Microsoft Office 应用程序提供的接口、方法和属性。

这是使用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__
于 2009-07-10T16:36:55.667 回答
5

对于 .doc,我使用 linux 命令行工具antiword取得了一些成功。它可以非常快速地从 .doc 中提取文本,从而提供良好的缩进呈现。然后您可以将其通过管道传输到 bash 中的文本文件。

对于 .docx,我使用了 OOXML SDK,就像其他一些用户提到的那样。它只是一个 .NET 库,可以更轻松地使用压缩在 OOXML 文件中的 OOXML。如果您只对文本感兴趣,则有很多元数据需要丢弃。其他一些人已经编写了我看到的代码:DocXToText

Aspose.Words 有一个非常简单的 API,我也发现它有很好的支持。

还有来自 commandlinefu.com 的 bash 命令,它通过解压缩 .docx 来工作:

unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
于 2011-08-28T05:30:55.333 回答
4

如果您可以使用 Java 或 .NET,我强烈推荐AsposeWords 。它可以在所有主要文本文件类型之间进行转换,而无需安装 Word。

于 2009-07-10T16:02:53.460 回答
4

如果您安装了一些 unix 风格,您可以使用“字符串”实用程序从文档中查找和提取所有可读字符串。您要查找的文本前后会有一些混乱,但结果将是可读的。

于 2009-07-10T17:11:53.350 回答
3

请注意,您还可以使用OpenOffice在 Windows 和 *nix 平台上执行各种文档、绘图、电子表格等转换。

您可以通过UNO从存在 UNO 绑定的各种语言(包括通过OpenOffice::UNO模块从 Perl )以编程方式访问 OpenOffice(以类似于 Windows 上的 COM 的方式) 。

OpenOffice::UNO 页面上,您还可以找到一个示例 Perl scriptlet,它可以打开一个文档,然后您需要做的就是txt使用该document.storeToURL()方法将其导出 - 请参阅一个 Python 示例,该示例可以轻松适应您的 Perl 需求。

于 2010-03-09T17:21:16.400 回答
1

使用WordprocessingML.docx 的 XML 格式的.doc可以对其 XML 进行解析以检索文档的实际文本。您必须阅读他们的规范才能确定哪些标签包含可读文本。

于 2009-07-10T15:54:36.237 回答
1

Sinan Ünür 的方法效果很好。
但是,我正在转换的文件发生了一些崩溃。

另一种方法是使用 Win32::OLE 和 Win32::Clipboard :

  • 打开 Word 文档
  • 选择所有文本
  • 在剪贴板中复制
  • 在 txt 文件中打印剪贴板的内容
  • 清空剪贴板并关闭 Word 文档

根据 Sigvald Refsu 在http://computer-programming-forum.com/53-perl/c44063de8613483b.htm中给出的脚本,我想出了以下脚本。

注意:我选择将 txt 文件保存为与 .docx 文件相同的基本名称并保存在同一文件夹中,但这很容易更改

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

希望它可以帮助你。

于 2014-03-13T11:21:05.050 回答
0

如果您不想启动 Word(或其他 Office 应用程序),则无法在 VBA 中执行此操作。即使您的意思是 VB,您仍然必须启动 Word 的(隐藏)实例来进行处理。

于 2009-07-10T15:56:05.657 回答
0

我需要一种无需安装任何东西即可将 .doc 或 .docx 扩展名转换为 .txt 的方法

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

只是开玩笑。

您可以对旧版本的 Word 文档使用antiword,并尝试解析新文档的 xml。

于 2009-07-10T17:36:59.963 回答
0

使用docxtemplater,您可以轻松获取单词的全文(仅适用于 docx)。

这是代码(Node.JS)

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

这只是三行代码,不依赖于任何单词实例(都是纯 JS)

于 2014-09-22T14:22:24.240 回答