Вопрос или проблема
У меня есть несколько сотен файлов Microsoft Word 2010 .docx с исправлениями/изменениями. Существует ли инструмент или метод, который позволит мне принять все изменения во всех этих документах без необходимости вручную открывать каждый файл, принимать изменения и сохранять?
Sobolsoft имеет программное обеспечение для этой задачи… http://www.sobolsoft.com/wordtrack/
Для информации, следующий код на Perl выполнит это автоматически для одного файла. Вы можете просто адаптировать его для обработки всех файлов docx в заданном месте.
Командная строка: perl accept_docx_changes.pl <docx_path> [<new_path>]
Надеюсь, это поможет другим людям, которые столкнутся с этим вопросом.
# accept_docx_changes.pl
use strict;
use Win32::OLE qw(in with valof OVERLOAD);
use Win32::OLE::Const 'Microsoft.Word'; # wd константы
use Win32::OLE::Variant;
$Win32::OLE::Warn = 3;
my $true = Variant(VT_BOOL, 1);
my $false = Variant(VT_BOOL, 0);
use File::Spec;
use File::Basename;
## Оригинальный & Новый Файл
my $DocFile = &transform_path($ARGV[0]);
my $NewFile = ($ARGV[1] ? &transform_path($ARGV[1]) : $DocFile);
[ -e $DocFile ] || die "*** Не удается открыть '$DocFile'\n";
### Преобразование пути
sub transform_path {
my $path = shift;
if ( ! File::Spec->file_name_is_absolute($path) ) {
my $abs = File::Spec->rel2abs($path);
$path = $abs;
}
else {
$path=~s%/+%\\%g;
}
return $path;
}
## Автоочистка
$| = 1;
### открытие файла: пробуем с функцией "new", в противном случае используем "GetActiveObject"
my $Word;
eval {
$Word = Win32::OLE->GetActiveObject('Word.Application') || Win32::OLE->new('Word.Application', 'Quit');
};
if ($@) {
print "Пожалуйста, откройте MS Word вручную перед продолжением\n";
print "...Нажмите ENTER для продолжения...\n";
<STDIN>;
$Word = Win32::OLE->GetActiveObject('Word.Application','Quit');
}
print "Открытие '$DocFile'\n";
my $document = $Word->Documents->Open({FileName =>$DocFile, ConfirmConversions => 0});
die "Не удается открыть '$DocFile'\n" unless defined $document;
$document->Activate();
$Word->ActiveWindow->ActivePane->View->{Type} = wdPrintView;
### Принять все изменения
print("Принимаем все изменения\n");
$Word->ActiveDocument->{TrackRevisions} = $false;
$Word->WordBasic->AcceptAllChangesInDoc();
### Сохранить и закрыть
if ($NewFile eq $DocFile) {
$document->Save();
$document->Close();
} else {
$document->SaveAs($NewFile);
$document->Close(wdDoNotSaveChanges);
}
print "Сохранение в '$NewFile'\n"
## КОНЕЦ ##
А вот версия на Python с использованием Pywin32
: преимущество этой версии в том, что вы можете сделать исполняемый файл из этого скрипта (например, с помощью pyinstaller
).
Я добавил несколько функций: вы можете
- Ввести несколько файлов в входные данные
- Установить каталог во входных данных (скрипт будет искать все rtf/doc/docx и сохранять как docx)
- Установить выходной файл (если выбран только 1 вход)
- Установить выходной каталог для хранения всех файлов (при обработке нескольких документов)
Командная строка следующая:
python accept_docx_changes [-h] [-o FILE] [-d DIR] [-p] [--version] [-q] inputs [inputs ...]
import datetime
import os
import re
import subprocess
import sys
from argparse import ArgumentParser, HelpFormatter
import win32com.client as win32
from win32com.client import constants
def accept_changes(inputs, new_file=None, outdir=None, verbose=True):
"""Принимает все изменения в документе MS Word"""
# Несколько файлов или каталог, переданных в качестве аргумента
if isinstance(inputs, list):
for input_ in inputs:
accept_changes(input_, None, outdir, verbose)
return None
elif os.path.isdir(inputs):
for dir_, subdirs, files in os.walk (inputs):
for name in files:
path = os.path.join (dir_, name).replace ('\\', "https://superuser.com/")
if '~$' not in path and re.search(r'\.(docx?|rtf)$', path):
accept_changes(path, None, outdir, verbose)
return None
else:
pass
# Получение абсолютных путей к файлам
doc_file_abs = os.path.abspath(inputs)
new_file_abs = os.path.abspath(new_file) if new_file else doc_file_abs
new_file_abs = re.sub(r'\.\w+$', '.docx', new_file_abs)
if outdir is not None:
if not os.path.exists(outdir):
os.mkdir(outdir)
path = outdir + "https://superuser.com/" + re.sub(r'.*[/\\]', '', new_file_abs)
new_file_abs = os.path.abspath(path)
# Проверка
if not os.path.isfile(doc_file_abs):
print("ОШИБКА: входной файл '%s' не найден" % doc_file_abs)
return None
# Открытие MS Word
word = win32.gencache.EnsureDispatch('Word.Application')
doc = word.Documents.Open(doc_file_abs)
doc.Activate ()
if verbose:
print("Файл '%s' открыт" % inputs)
# Принять все изменения
if verbose:
print("Принимаем все изменения")
word.ActiveDocument.TrackRevisions = False
try:
word.WordBasic.AcceptAllChangesInDoc ()
except TypeError:
pass
# Сохранить и закрыть
try:
if new_file_abs == doc_file_abs:
word.ActiveDocument.Save()
if verbose:
print("Документ '%s' сохранен" % inputs)
else:
word.ActiveDocument.SaveAs(
new_file_abs, FileFormat=constants.wdFormatXMLDocument
)
if verbose:
print("Документ сохранен в '%s'" % (new_file or new_file_abs))
except Exception as e:
print("ОШИБКА при попытке сохранить '%s': %s" % (new_file_abs, e))
doc.Close(False)
# Возвращаем путь к обновленному файлу
return new_file_abs
def main():
# -Информация о Программе-#
prog = "accept_docx_changes"
version_string = "%s v1.0" % prog
help_string = """\
Цель: Принять все изменения в документе MS Word и сохранить (как docx).
"""
# -Парсинг опций-#
parser = ArgumentParser (
description=help_string, prog=prog,
formatter_class=lambda prog: HelpFormatter (prog, max_help_position=30)
)
# Конфигурация(и) для отслеживаемости
parser.add_argument (
"inputs", nargs="+",
help="Файлы, в которых мы хотим принять изменения"
)
# Выходной файл
parser.add_argument (
"-o", "--output",
action="store", default=None,
metavar="FILE", help="Имя выходного файла"
)
parser.add_argument (
"-d", "--outdir",
action="store", default=None,
metavar="DIR", help="Имя выходного каталога"
)
# Открыть, если мы преобразовали один файл
parser.add_argument (
"-p", "--open", action='store_true', default=False,
help="Открыть сохраненный файл после принятия всех изменений"
)
# Версия
parser.add_argument (
"--version", action='store_true', dest="print_version",
help="напечатать версию %s" % prog
)
# Режим подробного вывода
parser.add_argument (
"-q", "--quiet",
action="store_true", default=False,
help="Скрыть сообщения о каждом выполненном действии"
)
# Парсинг опций
options = parser.parse_args ()
# Начнем
msg = "%s начат в %s"
if not options.quiet:
ctime = datetime.datetime.now ().ctime ()
print(msg % (version_string, ctime))
# Приступим к делу
output = None if len(options.inputs) > 1 else options.output
verbose = not options.quiet
out = accept_changes(options.inputs, output, options.outdir, verbose)
# И мы закончили!
msg = "%s завершен в %s"
if not options.quiet:
ctime = datetime.datetime.now ().ctime ()
print(msg % (version_string, ctime))
# Посмотрим, что мы сделали
if out is not None and options.open:
if sys.platform.startswith ('darwin'):
subprocess.call (('open', out))
elif os.name == 'nt':
os.startfile (out)
elif os.name == 'posix':
subprocess.call (('xdg-open', out))
if __name__ == '__main__':
main ()
# -КОНЕЦ- #
ПРИМЕЧАНИЕ: эта версия программы была написана в то время, когда некоторые люди все еще использовали Python 2.7. Для более современных версий Python я обычно заменяю os.path
на pathlib.Path
и заменяю форматирование строк с помощью %
на f-строки.
Принятие отслеживаемых изменений по сути то же самое, что и удаление отслеживаемых изменений, поэтому любой приличный пакетный очиститель метаданных для файлов Word может это сделать.
BatchPurifier, инструмент с графическим интерфейсом для Windows, может это сделать. Вам просто нужно добавить файлы и папки для обработки, выбрать опцию фильтра отслеживаемых изменений Word и установить параметры вывода в “Перезаписать” или “Сохранить как новые файлы” в указанной папке.
Ответ или решение
Для массового принятия всех изменений в файлах Microsoft Word 2010 формата .docx существуют различные инструменты и методы, позволяющие автоматизировать этот процесс и избежать ручной обработки большого количества документов. В данной статье мы рассмотрим несколько из них, включая скрипты на Perl и Python, а также специализированные программные решения.
1. Использование средств автоматизации
Скрипты на Perl
Если вы знакомы с языком программирования Perl, вы можете использовать предоставленный скрипт accept_docx_changes.pl
, который позволяет принимать все изменения в одном документе .docx. Его можно адаптировать для работы с несколькими файлами в указанной директории. Скрипт использует интерфейс COM для взаимодействия с Microsoft Word и позволяет автоматизировать процесс принятия изменений.
Основные шаги использования:
- Скачайте и сохраните вышеуказанный скрипт на вашем компьютере.
- В командной строке введите:
perl accept_docx_changes.pl <путь_к_вашему_docx> [<новый_путь>]
- Для обработки всех документов в папке, вам нужно будет модифицировать код, чтобы он перебирал все .docx файлы в заданной директории.
Скрипты на Python
Если вы предпочитаете Python, вы можете использовать аналогичный скрипт с использованием библиотеки pywin32
. Например, приведенный ниже скрипт позволяет принимать изменения в одном или нескольких файлах, а также сохранять результаты в новом месте.
Команда для выполнения:
python accept_docx_changes [-h] [-o ФАЙЛ] [-d ДИРЕКТОРИЯ] [-p] [--version] входные [входные ...]
Преимущества:
- Обработка нескольких файлов одновременно.
- Указание вывода в определенную директорию.
Пример кода на Python:
import win32com.client as win32
import os
def accept_changes(filepath):
word = win32.gencache.EnsureDispatch('Word.Application')
doc = word.Documents.Open(filepath)
doc.AcceptAllRevisions() # Принимаем все изменения
doc.Save() # Сохраняем изменения
doc.Close() # Закрываем документ
# Основной цикл для обработки всех файлов в директории
directory = 'ваша_директория'
for filename in os.listdir(directory):
if filename.endswith('.docx'):
accept_changes(os.path.join(directory, filename))
2. Использование специализированных программ
BatchPurifier от Digital Confidence
BatchPurifier
— это графический интерфейс для Windows, позволяющий пользователям легко обрабатывать несколько документов Word. Вы можете выбрать опцию "Tracked Changes" для удаления всех отслеживаемых изменений одновременно.
Как работать с BatchPurifier:
- Установите BatchPurifier на ваш компьютер.
- Добавьте файлы и папки для обработки.
- Установите фильтр для удаление изменений Word.
- Настройте параметры вывода: "Перезаписать" или "Сохранить как новые файлы".
3. Коммерческие решения
Если вы часто работаете с большими объемами файлов, возможно, стоит рассмотреть покупку программного обеспечения, такого как решение от компании Sobolsoft, которое также предлагает функции для массового принятия изменений в документах Word. Это может снизить затраты времени на обработку и повысить эффективность.
Заключение
В зависимости от ваших потребностей и технических навыков, вы можете выбрать между использованием скриптов на Perl или Python, или же графическими инструментами, такими как BatchPurifier. Каждый из этих методов значительно упрощает задачу массового принятия изменений в документах Word. Выберите тот, который лучше всего соответствует вашим требованиям, и следуйте шагам, описанным выше.