Это все очередные оговорки. Для начала - читай лицензионное соглашение, в котором ты соглашаешься использовать ПО "as is". Если у тебя есть замечания - открывай багрепорт. Большинство разработчиков реагируют на замечания и оперативно исправляют баги. Но стоит понимать, что во-первых иногда это исключительно твое предпочтение. Во-вторых - системы типа винды и больших игр - сложные системы и баги неизбежны. Если в целом они помогают решить твои задачи - нет причин не платить. Но всегда можно отказаться. Аот я 2 года платил за TomTom navigator. В какой-то момент решил, что он меня не устраивает и перешел на Waze и мирюсь с рекламой.
А если ты скачал кино и оно тебе не понравилось - это повод потребовать вернуть деньги? В кинотеатре ты тоже так делаешь?
Давай не будем уходить в эту плоскость. К сожалению это реальность наших дней и нужно правильно понимать причины. Мне вот тоже недоступны российские сервисы - не считаю поводом идти и воровать это ПО.Просто перестал использовать.
Воруешь ПО. Для меня нет разницы. Кража есть кража, как ее не прикрывай. Есть продукт, который произвел другой человек. Он его продает. А ты воруешь. Нет денег - пользуйся бесплатными альтернативами, их предостаточно.
А почему ты считаешь, что в Польше нет таких воришек как Дмитрий? Потому и пасуться. Тут на скачивание пока не особо смотрят, вот за раздачу можно попасть.
Дешевый отмаз и оправдание воровской натуры. Если фигня не существует - зачем она тебе? Какая разница - вирутальный это продукт или реальный? Ты кусок хлеба сьедаешь за минуту, а за компом с пиратской виндой сидишь сутками - что реальнее. Не устраивает чужой продукт - создай свой. Нет разницы, в каком магазине воровать - виртуальном или на соседней улице. Просто там ты боишься попасться, а тут можешь сделать это безнаказанно. Пока что. В Германии за торренты такой штраф - можно не одну Винду купить. В Польше можно попасть тоже, особенно за раздачу.
Но в целом, пираты мне симпатичны свой удалью и беспринципностью 😁
Когда тебе обнесут хату - тоже будешь восторгаться их удалью?
я не собираюсь за кучу денег покупать для домашнего использования Photoshop, dreamweaver или RAD Studio (развитие Delphi)
пусть их покупают организации для коммерческого использования
Я не собираюсь в магазине покупать хлеб или джинсы, потому что это для личного использования! Пусть их покупают рестораны/организации! А у меня есть полное право своровать их!Реально омерзительны ТС с такими вопросами и все кто тут его поддерживает. Воровство и есть воровство, как его не назови. И восторгаться теми кто обходит защиту продуктов от копирования - ну такое себе. Теми, кто из магазинов вещи прет - тоже восторгаешься? А теми, кто залезет в твою квартиру и обнесет тебя по полной - тоже аплодировать будешь?
В итоге нашел, как удалять картинки, правда не до конца. В твоем документе 3 картинки, одна битая и ее удалить не может. Нужно возиться с контент-тайпами, проверять что с ней и тоже добавлять в список на удаление.Это код чисто для бэка, для колаба нужно модифицировать работу с выводом на экран, это мне уже лень.
import osimport docxfrom docx import Documentimport ipywidgets as widgetsfrom IPython.display import display, clear_output# from google.colab import filesimport iofrom PIL import Imagefrom fastapi import Pathfrom docx.enum.shape import WD_INLINE_SHAPE_TYPEfrom docx.text.run import Runfrom docx.oxml.ns import qnimport pandas as pdimport matplotlibimport matplotlib.pyplot as pltimport numpy as npfrom structlog import get_loggerlogger = 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_filenameif __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()
Российские рубли не берут, а вот гривну - вполне себе принимают. Не сочиняй, чего не знаешь.
Ну да, ну да...
В твоем коде вместо блока поиска по кртинкам
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 картинки. Но скорее всего нужно оставить и старый код, потому что в разных доках картинки могут храниться по разному.
Русский в Польше мало кто знает. Мне вот приходится в течение дня на 4-х языках общаться. Не вижу в этом ничего плохого, дополнительная тренировка мозга.
А конторкурс и у нас в Кракове есть - держат украинцы и они дают обычно самый хороший курс. Только у них и меняю, когда есть необходимость. Кто не верит - могу скинуть ссылку, Владимир написал чистую правду, никаких проблем с обменом гривны и курс как он указывал примерно - 0.0923
доступ дай к файлу