Sly32

Рейтинг
367
Регистрация
29.03.2012
Genius Ideaing #:
я вот из-за некачественности программного продукта не хочу платить за лицензию... 

Это все очередные оговорки. Для начала - читай лицензионное соглашение, в котором ты соглашаешься использовать ПО "as is". Если у тебя есть замечания - открывай багрепорт. Большинство разработчиков реагируют на замечания и оперативно исправляют баги. Но стоит понимать, что во-первых иногда это исключительно твое предпочтение. Во-вторых - системы типа винды и больших игр - сложные системы и баги неизбежны. Если в целом они помогают решить твои задачи - нет причин не платить. Но всегда можно отказаться. Аот я 2 года платил за TomTom navigator. В какой-то момент решил, что он меня не устраивает и перешел на Waze и мирюсь с рекламой.

А если ты скачал кино и оно тебе не понравилось - это повод потребовать вернуть деньги? В кинотеатре ты тоже так делаешь? 

Александр Воробьев #:
однако считаю некоторые "оправдания"  приемлимыми :)

Давай не будем уходить в эту плоскость. К сожалению это реальность наших дней и нужно правильно понимать причины. Мне вот тоже недоступны российские сервисы - не считаю поводом идти и воровать это ПО.
Просто перестал использовать. 

Dmitriy_2014 #:
Я за свою жизнь ничего ни у кого не украл, ни хлеба, ни джинс.

Воруешь ПО. Для меня нет разницы. Кража есть кража, как ее не прикрывай. Есть продукт, который произвел другой человек. Он его продает. А ты воруешь. Нет денег - пользуйся бесплатными альтернативами, их предостаточно. 

Орловский Партизан #:
Это поэтому поляки толпами на RuTrcker'е пасутся?

А почему ты считаешь, что в Польше нет таких воришек как Дмитрий? Потому и пасуться. Тут на скачивание пока  не особо смотрят, вот за раздачу можно попасть.

Dmitriy_2014 #:
Забавно, но я с тобой согласен, я против воровства в магазинах, но одно дело воровство реальных предметов и виртуальной несуществующей фигни.

Дешевый отмаз и оправдание воровской натуры. Если фигня не существует - зачем она тебе? Какая разница - вирутальный это продукт или реальный? Ты кусок хлеба сьедаешь за минуту, а за компом с пиратской виндой сидишь сутками - что реальнее. Не устраивает чужой продукт - создай свой. Нет разницы, в каком магазине воровать - виртуальном или на соседней улице. Просто там ты боишься попасться, а тут можешь сделать это безнаказанно. Пока что. В Германии за торренты такой штраф - можно не одну Винду купить. В Польше можно попасть тоже, особенно за раздачу.

Lastwarrior #:

Но в целом, пираты мне симпатичны свой удалью и беспринципностью 😁 

Когда тебе обнесут хату - тоже будешь восторгаться их удалью?

Genius Ideaing #:

я не собираюсь за кучу денег покупать для домашнего использования Photoshop, dreamweaver или RAD Studio (развитие Delphi)

пусть их покупают организации для коммерческого использования

Я не собираюсь в магазине покупать хлеб или джинсы, потому что это для личного использования! Пусть их покупают рестораны/организации! А у меня есть полное право своровать их!

Реально омерзительны ТС с такими вопросами и все кто тут его поддерживает. 
Воровство и есть воровство, как его не назови. И восторгаться теми кто обходит защиту продуктов от копирования - ну такое себе. 
Теми, кто из магазинов вещи прет - тоже восторгаешься? А теми, кто залезет в твою квартиру и обнесет тебя по полной - тоже аплодировать будешь?

В итоге нашел, как удалять картинки, правда не до конца.  В твоем документе 3 картинки, одна битая и ее удалить не может. Нужно возиться с контент-тайпами, проверять что с ней и тоже добавлять в список на удаление.
Это код чисто для бэка, для колаба нужно модифицировать работу с выводом на экран, это мне уже лень.

import os
import docx

from docx import Document
import ipywidgets as widgets
from IPython.display import display, clear_output
# from google.colab import files
import io
from PIL import Image
from fastapi import Path
from docx.enum.shape import WD_INLINE_SHAPE_TYPE
from docx.text.run import Run
from docx.oxml.ns import qn
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from structlog import get_logger

logger = get_logger(__name__)

matplotlib.use('Agg')

path_str = os.getcwd()


class WordEditor:

    def __init__(self, file):
        self.file = file
        self.document = None
        self.tables = []
        self.images = []

    def load_file(self):
        if isinstance(self.file, str):
            with open(self.file, 'rb') as f:
                self.document = Document(f)
        else:
            self.document = Document(io.BytesIO(self.file))
        return self.document

    def get_empty_tables(self):
        for i, table in enumerate(self.document.tables):
            if all(not cell.text.strip() for row in table.rows for cell in row.cells):
                self.tables.append(table)
        return self.tables

    def get_images(self):
        """Extract images from both inline shapes and shapes in Word document"""
        images = []

        try:
            # Handle inline shapes (embedded images)
            for shape in self.document.inline_shapes:
                try:
                    if shape.type == WD_INLINE_SHAPE_TYPE.PICTURE:
                        rId = shape._inline.graphic.graphicData.pic.blipFill.blip.embed
                        image_part = self.document.part.related_parts[rId]
                        if image_part and hasattr(image_part, 'blob'):
                            images.append({
                                'image_data': image_part.blob,
                                'content_type': image_part.content_type
                            })
                except Exception as e:
                    logger.error(f"Error processing inline shape: {str(e)}")

            # Handle floating shapes
            for rel in self.document.part.rels.values():
                try:
                    if "image" in rel.target_part.content_type:
                        self.images.append(rel.target_part)
                except Exception as e:
                    logger.error(f"Error processing relation: {str(e)}")

        except Exception as e:
            logger.error(f"Error accessing document: {e}")

        logger.info(f"Found {len(images)} images in document")
        return self.images

    def remove_empty_tables(self):
        """Remove empty tables from document using the result of get_empty_tables."""
        removed_count = 0
        for table in self.tables:
            table._element.getparent().remove(table._element)
            removed_count += 1
        return removed_count

    def remove_images(self):
        """Remove all images from document use self.images."""
        removed_count = 0
        for image in self.images:
            del self.document.part.rels[image.rId]
            removed_count += 1
        return removed_count

    def save_new_document(self):
        """Save self.document with new name with prefix cleared_"""
        new_filename = os.path.join(path_str, "media/cleared_document.docx")
        self.document.save(new_filename)
        return new_filename

if __name__ == "__main__":
    print("path:", path_str)
    filename = os.path.join(path_str, "media/worddoc.docx")
    executor = WordEditor(file=filename)
    executor.load_file()
    executor.get_empty_tables()
    executor.get_images()
    executor.remove_empty_tables()
    executor.remove_images()
    executor.save_new_document()
poruchick #:
Так вот, в Польше все валюты берут в таких окошках, а гривну не берут.

Российские рубли не берут, а вот гривну  - вполне себе принимают. Не сочиняй, чего не знаешь. 


rob_zombie #:
Ну или контролируемо снижаем курс для пользы отечественной экономики. Ту уж какой вариант больше нравится. 

Ну да, ну да... 

В твоем коде вместо блока поиска по кртинкам

document.inline_shapes
   for idx, shape in enumerate(document.inline_shapes):
        shape_type = shape.type
        # Получаем родительский элемент run
        parent_run_element = shape._inline.getparent().getparent()
        run = Run(parent_run_element, None)

        if shape_type == WD_INLINE_SHAPE_TYPE.PICTURE:
            # Получаем часть с изображением
            image_part_id = shape._inline.graphic.graphicData.pic.blipFill.blip.embed
            image_part = document.part.related_parts[image_part_id]
            # Получаем данные изображения
            image_data = image_part.blob
        else:
            # Для фигур напрямую получить изображение нельзя
            image_data = None

        shapes_info.append({
            'shape': shape,
            'type': shape_type,
            'run': run,
            'image_data': image_data,
            })

Попробуй сделать так:

            # Handle floating shapes
            for rel in self.document.part.rels.values():
                try:
                    if "image" in rel.target_part.content_type:
                        images.append({
                            'image_data': rel.target_part.blob,
                            'content_type': rel.target_part.content_type
                        })  
                except Exception as e:
                    print(f"Error processing relation: {str(e)}")

Только адаптируй под свой колаб исключения и лист картинок, как тебе надо.

У меня этот код находит в твоем файле 2 картинки. 
Но скорее всего нужно оставить и старый код, потому что в разных доках картинки могут храниться по разному. 

Devstory #:
Зачем общаться на трёх языках, кода все на русском могут и общаются? 

Русский в Польше мало кто знает. Мне вот приходится в течение дня на 4-х языках общаться. Не вижу в этом ничего плохого, дополнительная тренировка мозга.

А конторкурс и у нас в Кракове есть - держат украинцы и они дают обычно самый хороший курс. Только у них и меняю, когда есть необходимость. Кто не верит - могу скинуть ссылку, Владимир написал чистую правду, никаких проблем с обменом гривны и курс как он указывал примерно -  0.0923

rownong4 :
Скрипт для удаление изображений и таблиц из W

доступ дай к файлу

Всего: 7119