Массово принять все изменения в файлах Microsoft Word 2010 (docx)?

Вопрос или проблема

У меня есть несколько сотен файлов 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:

  1. Установите BatchPurifier на ваш компьютер.
  2. Добавьте файлы и папки для обработки.
  3. Установите фильтр для удаление изменений Word.
  4. Настройте параметры вывода: "Перезаписать" или "Сохранить как новые файлы".

3. Коммерческие решения

Если вы часто работаете с большими объемами файлов, возможно, стоит рассмотреть покупку программного обеспечения, такого как решение от компании Sobolsoft, которое также предлагает функции для массового принятия изменений в документах Word. Это может снизить затраты времени на обработку и повысить эффективность.

Заключение

В зависимости от ваших потребностей и технических навыков, вы можете выбрать между использованием скриптов на Perl или Python, или же графическими инструментами, такими как BatchPurifier. Каждый из этих методов значительно упрощает задачу массового принятия изменений в документах Word. Выберите тот, который лучше всего соответствует вашим требованиям, и следуйте шагам, описанным выше.

Оцените материал
Добавить комментарий

Капча загружается...