У меня есть набор документов .docx с изменениями текста, выполненными с помощью функции «отслеживать изменения».
Для каждого source.docx
файла в моем наборе я хотел бы программно запустить две операции:
- сгенерировать два документа, один со всеми отклоненными изменениями, а другой со всеми принятыми изменениями (сложный шаг)
- преобразование в открытый текст.
Другими словами , Я хочу запустить следующие конвейеры:
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 виртуальных машинах.