Perl 是否将Word文档或docx文件转换为文本文件?
我需要一种方法将Perl 是否将Word文档或docx文件转换为文本文件?,perl,vba,text-files,docx,doc,Perl,Vba,Text Files,Docx,Doc,我需要一种方法将.doc或.docx扩展转换为.txt,而无需安装任何东西。我也不想手动打开Word来做这件事。只要它是自动运行的 我认为Perl或VBA都可以做到这一点,但我在网上找不到这两者的任何东西 有什么建议吗?.doc使用并可以解析其XML以检索文档的实际文本。您必须阅读它们的规范,以确定哪些标记包含可读文本。如果您不想启动Word(或其他Office应用程序),则无法在VBA中执行此操作。即使你是指VB,你仍然需要启动一个Word的(隐藏)实例来进行处理。我强烈建议你是否可以使用Ja
.doc
或.docx
扩展转换为.txt
,而无需安装任何东西。我也不想手动打开Word来做这件事。只要它是自动运行的
我认为Perl或VBA都可以做到这一点,但我在网上找不到这两者的任何东西
有什么建议吗?.doc使用并可以解析其XML以检索文档的实际文本。您必须阅读它们的规范,以确定哪些标记包含可读文本。如果您不想启动Word(或其他Office应用程序),则无法在VBA中执行此操作。即使你是指VB,你仍然需要启动一个Word的(隐藏)实例来进行处理。我强烈建议你是否可以使用Java或.NET。它可以在不安装Word的情况下在所有主要文本文件类型之间进行转换。请注意,对象浏览器是Microsoft Office应用程序的一个极好的信息源。您可以通过
工具
→ <代码>宏→ <代码>Visual Basic编辑器。进入编辑器后,按F2键浏览Microsoft Office应用程序提供的接口、方法和属性
下面是一个示例,使用:
docx的一个简单的纯Perl解决方案:
docx
文件中获取word/document.xml
文件。(docx只是一个压缩的归档文件。)J.如果您安装了某种风格的unix,您可以使用“strings”实用程序从文档中查找并提取所有可读字符串。在你要查找的文本前后会有一些混乱,但是结果是可读的 我需要一种无需安装任何东西即可将.doc或.docx扩展名转换为.txt的方法 只是开玩笑
您可以对旧版本的Word文档使用antiword,并尝试解析新文档的xml。注意,您还可以在Windows和*nix平台上使用antiword执行其他文档、绘图、spreadhseet等转换 您可以通过多种存在UNO绑定的语言(包括通过模块从Perl)以编程方式访问OpenOffice(类似于Windows上的COM)
在上,您还可以找到一个打开文档的示例Perl scriptlet,然后您只需使用
document.storetour()
方法将其导出到txt
,看看哪种方法可以轻松地适应您的Perl需要。对于.doc,我在linux命令行工具方面取得了一些成功。它可以非常快速地从.doc中提取文本,提供了良好的缩进效果。然后,您可以通过管道将其传输到bash中的文本文件
对于.docx,正如其他一些用户提到的那样,我使用了OOXMLSDK。它只是一个.NET库,可以更轻松地使用压缩在OOXML文件中的OOXML。如果您只对文本感兴趣,那么有很多元数据需要丢弃。其他一些人已经编写了我看到的代码:
Words有一个非常简单的API,我发现它也有很好的支持
commandlinefu.com中还有一个bash命令,它通过解压缩.docx来工作:
unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
unzip-psome.docx word/document.xml | sed-e的//\{1,\}>//g;s/[^[:print:][]\{1,\}//g'
斯南·努尔的方法很有效。然而,我在转换文件时遇到了一些问题 另一种方法是使用Win32::OLE和Win32::剪贴板:
- 打开Word文档
- 选择所有文本
- 在剪贴板中复制
- 在txt文件中打印剪贴板的内容
- 清空剪贴板并关闭Word文档
这仅仅是三行代码,不依赖于任何word实例(全部为纯JS)只要它可以通过windows pc上的计划任务自动执行,word是否打开都无所谓。。。。我会回答这个问题这是一个很好的工具。。。直到现在我才真正使用过它,我想知道我是从哪里得到这些信息的。再次感谢
for I in *.doc?; do mv $I `echo $ | sed 's/\.docx?/\.txt'`; done
unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
###########################################
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;
}
DocxTemplater=require('docxtemplater');
doc=new DocxTemplater().loadFromFile("input.docx");
result=doc.getFullText();