尝试使用perl从.docx(word文档)中删除部分

时间:2012-12-21 15:49:19

标签: regex perl ms-word docx

我正在制作课程笔记,其中包含教师解决方案。我试图以编程方式删除教师笔记,但生成的文件显示很少,所以显然有些错误。我尝试制作一个非常短的单词文件,占用392,480字节,而删除了注释的文件是386,342。

为了做到这一点,首先我查看了.docx文件。我将其重命名为.zip,使用7zip将其解压缩到一个目录中,并发现有一个名为document.xml的主文档。

在那里看,在我看来,我想要删除所有段落,这些段落存储为:

<w:p ....

</w:p>

包含样式:

<w:pStyle w:val="TeacherNote"

请注意,由于文档创建过程中的邋iness,实际上有三种冗余的TeacherNote样式,但我不认为这是相关的。

我写了一个perl程序来自动化这个烂摊子。它创建一个目录,将.docx文件复制到临时目录中的.zip,解压缩,然后执行此搜索和替换。但它消除了很多文件,而不仅仅是教师的笔记。第一个嫌疑人是正则表达式。我尝试使用贪婪,而且文件坦率地说不会那么短,所以如果这是问题我会感到惊讶:

 while ($line =~ m"<w:p[^>]*>.*?<w:pStyle w:val=\"TeacherNote0?\".*?</w:p>") {

注意0?是匹配出现在本文档中的TeacherNote和TeacherNote0。

从正则表达式后面的document.xml文件看,似乎正则表达式替换是错误的,所以希望另一组眼睛能够抓住我的错误。

我正在使用贪心。*?匹配模式中的所有字母,直到第一次出现

我想基于此开源一些实用工具--Word没有很好的设施来做到这一点。有一个命令行实用程序可以删除具有指定样式的每个段落。

我没有看到在这里附加文件的方法,我真的不想使用外部链接,所以目前我只是附加perl代码。如果你真的需要word文档,如果有人可以告诉我如何发布它,那么它将永久地附在我将要做的那个问题上。

这是perl代码(在Windows上,所以我不打扰#!/ usr / bin / perl)

use strict;
use warnings;
use File::Copy;
use Cwd;

my $zip="c:\\bin\\7-zip\\7z";
my $teacherFile = $ARGV[0];
my $mainFile = "word/document.xml";
print "Filename: $teacherFile\n";
my $base;
if ($teacherFile =~ /^(.*)\.docx$/) {
    $base = $1;
} else {
    die ("$teacherFile must end with .docx\n");
}
my $studentFile = $base . "-student.docx";
print "Student file = $studentFile\n";

mkdir ("temp");
copy($teacherFile, "temp/$base.zip");
my $prevDir = getcwd();
chdir("temp");

my $cmd="$zip x -r $base.zip";
system($cmd);

open (DOC, $mainFile) || die("Can't open main document file\n");
open (REPLACE, ">newdocument.xml") || die("Can't open replacement file\n");
while (my $line = <DOC>) {
    my $out = "";
    while ($line =~ m"<w:p[^>]*>.*?<w:pStyle w:val=\"TeacherNote0?\".*?</w:p>") {
        $out .= $`;
        $line = $';
    }
    print REPLACE $out . $line;
}
close(REPLACE);
close(DOC);
move("newdocument.xml", $mainFile);
print "CWD=" . getcwd(), "\n";
system("$zip u $base.zip $mainFile");
chdir($prevDir);
move("temp/$base.zip", $studentFile);

0 个答案:

没有答案
相关问题