Как я могу выводить документы Word / открытый текст со всеми принятыми / отклоненными изменениями треков? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть набор документов .docx с изменениями текста, выполненными с помощью функции «отслеживать изменения».

Для каждого source.docx файла в моем наборе я хотел бы программно запустить две операции:

  1. сгенерировать два документа, один со всеми отклоненными изменениями, а другой со всеми принятыми изменениями (сложный шаг)
  2. преобразование в открытый текст.

Другими словами , Я хочу запустить следующие конвейеры:

source.docx -> sources-all-changes-rejected.docx -> source-all-rejected-plaintext.txt source.docx -> sources-all-changes-accepted.docx -> source-all-accepted-plaintext.txt

Есть ли способ сделать это, например, используя soffice --headless?

Я пробовал решение, вдохновленное Python - Использование win32com.client для принятия всех изменений в документах Word . Этот подход работал, используя абсолютные пути и сохраняя как текстовый документ https://docs.microsoft.com/en-us/office/vba/api/word.wdsaveformat. Итак, у меня есть функция, которая принимает pathlib Path file_path и записывает документы в виде обычного текста, как я хотел:

def output_track_changed_version(file_path, action):
    
    word = win32.gencache.EnsureDispatch("Word.Application")
    word.Visible = False

    print(file_path.absolute())
    doc = word.Documents.Open(str(file_path.absolute()))
    
    doc.Activate()
    word.ActiveDocument.TrackRevisions = False

    # Delete all comments
    if word.ActiveDocument.Comments.Count >= 1:
        word.ActiveDocument.DeleteAllComments()

    if action == "accept":
        word.ActiveDocument.Revisions.AcceptAll() # Accept all revisions
        word.ActiveDocument.SaveAs2(str((Path("accept-all") / file_path.name).absolute())  + ".txt", FileFormat=7)
    elif action == "reject":
        word.ActiveDocument.Revisions.RejectAll() # Reject all revisions
        word.ActiveDocument.SaveAs2(str((Path("reject-all") / file_path.name).absolute()) + ".txt", FileFormat=7)

    doc.Close(False)
    word.Application.Quit()

Однако я не хочу придерживаться win32com.client, предпочитая решение на основе LibreOffice. + Python, который можно легко настроить на Linux виртуальных машинах.

1 Ответ

0 голосов
/ 05 августа 2020

Не знаю, решит ли это вашу проблему, но вы можете использовать библиотеку docx (устанавливается с помощью команды pip install python-docx) для решения этой задачи.

Пример:

import docx

#rejected changes
doc = docx.Document('source.docx')
doc.save('sources-all-changes-rejected.docx')

#txt
r_text = []
for par in doc.paragraphs:
    r_text.append(par.text)
r_text = '\n'.join(r_text)

filename = 'source-all-rejected-plaintext.txt'
with open(filename, 'w') as r_txt:
    r_txt.write(r_text)

#accepted changes
for par in doc.paragraphs:
    #do changes
    pass

#txt
a_text = []
for par in doc.paragraphs:
    a_text.append(par.text)
a_text = '\n'.join(a_text)

filename = 'source-all-accepted-plaintext.txt'
with open(filename, 'w') as a_txt:
    a_txt.write(a_text)

#docx
doc.save('sources-all-changes-accepted.docx')

Затем вы можете l oop просмотреть все файлы в наборе.

...