【问题标题】:Convert Word doc or docx files into text files?将 Word doc 或 docx 文件转换为文本文件?
【发布时间】:2014-09-22 22:22:24
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

    标签: perl vba text-files docx doc


    【解决方案1】:

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

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

    2. 使用XML::LibXML解析。

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

    干杯!

    J.

    【讨论】:

      【解决方案2】:

      请注意,Microsoft Office 应用程序的一个极好的信息来源是对象浏览器。您可以通过ToolsMacroVisual 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__
      

      【讨论】:

        【解决方案3】:

        对于 .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'
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • 这是一个很棒的工具...直到现在还没有真正使用过它,我想知道我从哪里得到的信息。再次感谢
            【解决方案6】:

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

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

            OpenOffice::UNO page 上,您还可以找到一个打开文档的示例 Perl 脚本,然后您只需使用document.storeToURL() 方法将其导出到txt -- 参见a Python example,它可以是轻松适应您的 Perl 需求。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

                希望对你有帮助。

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                  • 只要可以通过windows pc上的计划任务自动完成,word是否打开都没关系....我改写问题
                  【解决方案10】:

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

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

                  开个玩笑。

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

                  【讨论】:

                    【解决方案11】:

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

                    这是代码(Node.JS)

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

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

                    【讨论】:

                      猜你喜欢
                      • 2016-11-20
                      • 2012-05-11
                      • 2011-06-14
                      • 2013-04-29
                      • 1970-01-01
                      • 2021-01-27
                      • 1970-01-01
                      • 2011-10-03
                      • 1970-01-01
                      相关资源
                      最近更新 更多