Как можно удалить ненужные изображения и таблицы из Word-документа с помощью Python?

После экспорта документа из PDF в Word остаются много ненужных артефактов, таких как:

- бессмысленные части изображений;
- пустые таблицы, состоящие из одной ячейки.

Я хотел бы реализовать следующий функционал на Python в Google Colab:

1. Загрузить файл Word с помощью кнопки "Загрузить".
2. Отобразить в интерфейсе миниатюры всех изображений и таблиц (по одному экземпляру) с возможностью выбора с помощью галочек.
3. Убрать галочки у тех изображений и таблиц, которые не нужны.
4. Подтвердить выбор.
5. Удалить из файла Word выбранные изображения и таблицы.
6. Автоматически скачать обновленный файл Word на ПК.

Я разработал скрипт для удаления изображений и таблиц из Word, который можно найти по следующей ссылке: 
<a href="https://colab.research.google.com/drive/1armS0g5_hnUtLt6pr-ZnsCoKxazRKrbj" rel="nofollow">https://colab.research.google.com/drive/1armS0g5_h...</a> 

Также имеется образец файла по ссылке: 
<a href="https://disk.yandex.ru/i/VQkZzn7LQflE1Q" rel="nofollow">https://disk.yandex.ru/i/VQkZzn7LQflE1Q</a> 

Однако в интерфейсе выводится только таблица. Изображения и фигуры из Word не отображаются. Можете помочь мне найти и исправить ошибку?
  • 1 февраля 2025 г. 10:24
Ответы на вопрос 1
Вы можете удалить ненужные изображения и таблицы из Word-документа с помощью Python с использованием библиотеки `python-docx`. Однако Google Colab имеет ряд ограничений, и работать с графическим интерфейсом в нем может быть немного сложнее, особенно для таких целей.

При этом вы можете использовать `ipywidgets` для создания интерфейса загрузки файлов и выбора элементов, а также `python-docx` для работы с документами Word.

Вот основные шаги, которые помогут вам реализовать функционал, который вы описали:

1. **Загрузка файла Word**.
2. **Отображение всех изображений и таблиц в документе**.
3. **Возможность выбора (галочки) для удаления**.
4. **Удаление выбранных изображений и таблиц**.
5. **Скачивание обновленного файла**.

Пример кода для реализации:

```python
from google.colab import files
import docx
from docx.shared import Inches
import ipywidgets as widgets
from IPython.display import display, clear_output

# Step 1: Upload Word File
upload_widget = widgets.FileUpload(accept='.docx')
display(upload_widget)

def load_document(change):
    global doc
    doc = docx.Document(upload_widget.value[0]['content'])
    
    # Display images and table
    clear_output()  # Clear the output to show new widgets
    display(upload_widget)

    image_selection = []
    table_selection = []
    
    for i, shape in enumerate(doc.inline_shapes):
        if shape.type == 3:  # type 3 is for pictures
            image_selection.append(widgets.Checkbox(value=False, description=f'Image {i+1}'))
    
    for j, table in enumerate(doc.tables):
        table_selection.append(widgets.Checkbox(value=False, description=f'Table {j+1}'))
    
    image_box = widgets.VBox(image_selection)
    table_box = widgets.VBox(table_selection)

    display(image_box)
    display(table_box)

    # Create button to confirm deletions
    delete_button = widgets.Button(description='Delete Selected Items')
    display(delete_button)

    def delete_selected_items(b):
        # Loop through images and delete selected
        for i, checkbox in enumerate(image_selection):
            if checkbox.value:
                # For simplicity, we will just mark to remove
                doc.inline_shapes[i].element.getparent().remove(doc.inline_shapes[i].element)

        # Loop through tables and delete selected
        for j, checkbox in enumerate(table_selection):
            if checkbox.value:
                # For simplicity, we will just mark to remove
                doc.tables[j]._element.getparent().remove(doc.tables[j]._element)
        
        # Save the document
        new_file_name = "modified_document.docx"
        doc.save(new_file_name)
        
        # Provide link to download new file
        clear_output()  # Clear the output to show download link
        display(widgets.Label(value='Download the modified document:'))
        files.download(new_file_name)  # Download the file

    delete_button.on_click(delete_selected_items)

upload_widget.observe(load_document, names='value')
```

### Описание кода:
- Загрузка файла осуществляется с помощью `widgets.FileUpload`.
- После загрузки файла, вы выводите все изображения и таблицы для выбора.
- Используйте `ipywidgets.Checkbox` для каждого элемента, чтобы пользователь мог выбрать, что удалить.
- После нажатия кнопки все выбранные элементы удаляются, а документ сохраняется и готов к скачиванию.

### Примечание:
- Убедитесь, что у вас установлены библиотеки `ipywidgets` и `python-docx`.
- Код нужно запускать в ячейках Google Colab.
- К сожалению, `python-docx` не позволяет прямой работы с некоторыми форматами изображений, другой подход может потребовать использования дополнительных библиотек для конвертации сложных форматов.
Похожие вопросы