Updated script that can be controled by Nodejs web app
This commit is contained in:
71
lib/python3.13/site-packages/openpyxl/reader/drawings.py
Normal file
71
lib/python3.13/site-packages/openpyxl/reader/drawings.py
Normal file
@ -0,0 +1,71 @@
|
||||
|
||||
# Copyright (c) 2010-2024 openpyxl
|
||||
|
||||
|
||||
from io import BytesIO
|
||||
from warnings import warn
|
||||
|
||||
from openpyxl.xml.functions import fromstring
|
||||
from openpyxl.xml.constants import IMAGE_NS
|
||||
from openpyxl.packaging.relationship import (
|
||||
get_rel,
|
||||
get_rels_path,
|
||||
get_dependents,
|
||||
)
|
||||
from openpyxl.drawing.spreadsheet_drawing import SpreadsheetDrawing
|
||||
from openpyxl.drawing.image import Image, PILImage
|
||||
from openpyxl.chart.chartspace import ChartSpace
|
||||
from openpyxl.chart.reader import read_chart
|
||||
|
||||
|
||||
def find_images(archive, path):
|
||||
"""
|
||||
Given the path to a drawing file extract charts and images
|
||||
|
||||
Ignore errors due to unsupported parts of DrawingML
|
||||
"""
|
||||
|
||||
src = archive.read(path)
|
||||
tree = fromstring(src)
|
||||
try:
|
||||
drawing = SpreadsheetDrawing.from_tree(tree)
|
||||
except TypeError:
|
||||
warn("DrawingML support is incomplete and limited to charts and images only. Shapes and drawings will be lost.")
|
||||
return [], []
|
||||
|
||||
rels_path = get_rels_path(path)
|
||||
deps = []
|
||||
if rels_path in archive.namelist():
|
||||
deps = get_dependents(archive, rels_path)
|
||||
|
||||
charts = []
|
||||
for rel in drawing._chart_rels:
|
||||
try:
|
||||
cs = get_rel(archive, deps, rel.id, ChartSpace)
|
||||
except TypeError as e:
|
||||
warn(f"Unable to read chart {rel.id} from {path} {e}")
|
||||
continue
|
||||
chart = read_chart(cs)
|
||||
chart.anchor = rel.anchor
|
||||
charts.append(chart)
|
||||
|
||||
images = []
|
||||
if not PILImage: # Pillow not installed, drop images
|
||||
return charts, images
|
||||
|
||||
for rel in drawing._blip_rels:
|
||||
dep = deps.get(rel.embed)
|
||||
if dep.Type == IMAGE_NS:
|
||||
try:
|
||||
image = Image(BytesIO(archive.read(dep.target)))
|
||||
except OSError:
|
||||
msg = "The image {0} will be removed because it cannot be read".format(dep.target)
|
||||
warn(msg)
|
||||
continue
|
||||
if image.format.upper() == "WMF": # cannot save
|
||||
msg = "{0} image format is not supported so the image is being dropped".format(image.format)
|
||||
warn(msg)
|
||||
continue
|
||||
image.anchor = rel.anchor
|
||||
images.append(image)
|
||||
return charts, images
|
Reference in New Issue
Block a user