Подсчёт количества изображений в Writer

Автор Ципихович Эндрю, 17 февраля 2026, 14:16

0 Пользователи и 1 гость просматривают эту тему.

Ципихович Эндрю

здравствуйте, считал кодом:
import uno      # Universal Network Objects - мост между Python и API LibreOffice
import winsound # Модуль для воспроизведения звукового сигнала

def Message_box(title, text):
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    toolkit = smgr.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx)
   
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    frame = desktop.getCurrentFrame()
    window = frame.getContainerWindow()
   
    msgbox = toolkit.createMessageBox(
        window,
        'infobox',
        1,
        title,
        text
    )
    winsound.MessageBeep(winsound.MB_OK)
    msgbox.execute()
    winsound.MessageBeep(winsound.MB_OK)
    msgbox.dispose()

def Count_images():
    # Получаем текущий документ
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    doc = desktop.getCurrentComponent()

    # Проверяем, что документ — Writer
    if not doc.supportsService("com.sun.star.text.TextDocument"):
        Message_box("Ошибка", "Документ не является Writer-документом.")
        return

    image_count = 0
   
    try:
        # Получаем все графические объекты через доступ к DrawPages
        draw_pages = doc.getDrawPages()
        for page in draw_pages:
            for i in range(page.getCount()):
                obj = page.getByIndex(i)
                # Проверяем, что объект является графическим
                if obj.supportsService("com.sun.star.drawing.GraphicObjectShape"):
                    image_count += 1
    except Exception as e:
        Message_box("Ошибка", f"Не удалось получить графические объекты: {str(e)}")
        return

    # Формируем сообщение
    result_msg = f"В документе обнаружено {image_count} изображений."
   
    # Выводим результат в диалоговое окно
    Message_box("Подсчёт изображений", result_msg)
    return image_count

# Точка входа для макроса
g_exportedScripts = Count_images,
выдало
В документе обнаружено 0 изображений
но они реально есть, правда файл ещё не сохранялся НЕ ужели в этом проблема?-вряд-ли...

sokol92

Запустите MRI и посмотрите, какой именно сервис поддерживает Ваше изображение в документе.
Владимир.

Ципихович Эндрю

Цитата: sokol92 от 17 февраля 2026, 16:16Запустите MRI и посмотрите, какой именно сервис поддерживает Ваше изображение в документе
ок, скачал MRI-1.3.5.oxt с https://github.com/hanya/MRI/releases/tag/v1.3.5
вот код:
def inspect_selection():
    ctx = XSCRIPTCONTEXT.getComponentContext()
    mri = ctx.getServiceManager().createInstanceWithContext("mytools.Mri", ctx)
    doc = XSCRIPTCONTEXT.getDocument()
    mri.inspect(doc)

g_exportedScripts = (inspect_selection,)
вот ответ
(Name)                        (Value Type)                      (Value)             (Info.)   (Attr.)    (Handle) 
AllVersions                   [].document.CmisVersion           -Error-             Pseud     Read_Only       
AllowLinkUpdate               boolean                           False                         Read_Only  1107 
AllowMacroExecution           boolean                           True                Attr.     Read_Only       
ApplyFormDesignMode           boolean                           False                                    1013 
Args                          [].beans.PropertyValue            -Sequence-          Pseud                     
AutoStyles                    .style.XAutoStyles                -INTERFACE-         Pseud     Read_Only       
AutomaticControlFocus         boolean                           False                                    1012 
AvailableServiceNames         []string                          -Sequence-          Pseud     Read_Only       
AvailableViewControllerNames  []string                          -Sequence-          Pseud     Read_Only       
BasicLibraries                .script.XLibraryContainer         -INTERFACE-                   Read_Only  1014 
Bookmarks                     .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
BuildId                       string                            ;26.2.0.3                                1024 
ChapterNumberingRules         .container.XIndexReplace          -INTERFACE-         Pseud     Read_Only       
CharFontCharSet               short                             34                            Maybevoid    7 
CharFontCharSetAsian          short                             34                            Maybevoid   22 
CharFontCharSetComplex        short                             34                            Maybevoid   27 
CharFontFamily                short                             3                             Maybevoid    7 
CharFontFamilyAsian           short                             6                             Maybevoid   22 
CharFontFamilyComplex         short                             6                             Maybevoid   27 
CharFontName                  string                            Liberation Serif              Maybevoid    7 
CharFontNameAsian             string                            NSimSun                       Maybevoid   22 
CharFontNameComplex           string                            Lucida Sans                   Maybevoid   27 
CharFontPitch                 short                             2                             Maybevoid    7 
CharFontPitchAsian            short                             2                             Maybevoid   22 
CharFontPitchComplex          short                             2                             Maybevoid   27 
CharFontStyleName             string                            ""                            Maybevoid    7 
CharFontStyleNameAsian        string                            ""                            Maybevoid   22 
CharFontStyleNameComplex      string                            ""                            Maybevoid   27 
CharLocale                    .lang.Locale                      -STRUCT-                      Maybevoid   10 
CharacterCount                long                              149                           Read_Only  1000 
CmisProperties                [].document.CmisProperty          -Sequence-          Attr.                     
ContentControls               .container.XIndexAccess           -INTERFACE-         Pseud     Read_Only       
Controllers                   .container.XEnumeration           -INTERFACE-         Pseud     Read_Only       
CurrentController             .frame.XController                -INTERFACE-         Pseud                     
CurrentSelection              .uno.XInterface                   -INTERFACE-         Pseud     Read_Only       
DefaultPageMode               boolean                           0                                        1069 
Delegator                     .uno.XInterface                                       Pseud     WriteOnly       
DialogLibraries               .script.XLibraryContainer         -INTERFACE-                   Read_Only  1105 
DocumentIndexes               .container.XIndexAccess           -INTERFACE-         Pseud     Read_Only       
DocumentProperties            .document.XDocumentProperties     -INTERFACE-         Pseud     Read_Only       
DocumentStorage               .embed.XStorage                   -INTERFACE-         Pseud     Read_Only       
DocumentSubStoragesNames      []string                          -Sequence-          Pseud     Read_Only       
DrawPage                      .drawing.XDrawPage                -INTERFACE-         Pseud     Read_Only       
DrawPages                     .drawing.XDrawPages               -INTERFACE-         Pseud     Read_Only       
EmbeddedObjects               .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
EndnoteSettings               .beans.XPropertySet               -INTERFACE-         Pseud     Read_Only       
Endnotes                      .container.XIndexAccess           -INTERFACE-         Pseud     Read_Only       
Events                        .container.XNameReplace           -INTERFACE-         Pseud     Read_Only       
FootnoteSettings              .beans.XPropertySet               -INTERFACE-         Pseud     Read_Only       
Footnotes                     .container.XIndexAccess           -INTERFACE-         Pseud     Read_Only       
ForbiddenCharacters           .i18n.XForbiddenCharacters        -INTERFACE-                              1009 
GraphicObjects                .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
HasValidSignatures            boolean                           False                         Read_Only  1017 
HideFieldTips                 boolean                           False                                    1007 
Identifier                    string                            com.sun.star.te...  Pseud                     
ImplementationId              []byte                            -SEQUENCE-          Pseud     Read_Only       
ImplementationName            string                            SwXTextDocument     Pseud     Read_Only       
IndexAutoMarkFileURL          string                            ""                                       1006 
InteropGrabBag                [].beans.PropertyValue            -Sequence-                               1018 
IsTemplate                    boolean                           False                         Read_Only  1025 
LibraryContainer              .container.XNameContainer         -INTERFACE-         Pseud     Read_Only       
LineNumberingProperties       .beans.XPropertySet               -INTERFACE-         Pseud     Read_Only       
Links                         .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
LocalName                     string                            ""                  Attr.     Read_Only       
Location                      string                            ""                  Pseud     Read_Only       
LockUpdates                   boolean                           False                                    1016 
Modified                      boolean                                               Ignored                   
ModifiedStateDuration         hyper                             236091              Pseud     Read_Only       
Namespace                     string                            file:///C:/User...  Attr.     Read_Only       
NumberFormatSettings          .beans.XPropertySet               -INTERFACE-         Pseud     Read_Only       
NumberFormats                 .util.XNumberFormats              -INTERFACE-         Pseud     Read_Only       
NumberingRules                .container.XIndexAccess           -INTERFACE-         Pseud     Read_Only       
PagePrintSettings             [].beans.PropertyValue            -Sequence-          Pseud                     
ParagraphCount                long                              4                             Read_Only  1001 
Parent                        .uno.XInterface                   -void-              Pseud                     
Printer                       [].beans.PropertyValue                                Ignored                   
PropertySetInfo               .beans.XPropertySetInfo           -INTERFACE-         Pseud     Read_Only       
PropertyToDefault             string                                                Ignored                   
RDFRepository                 .rdf.XRepository                  -INTERFACE-         Pseud     Read_Only       
RecordChanges                 boolean                           False                                    1005 
RedlineDisplayType            short                             2                                        1008 
RedlineProtectionKey          []byte                            -SEQUENCE-                               1010 
Redlines                      .container.XEnumerationAccess     -INTERFACE-         Pseud     Read_Only       
ReferenceMarks                .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
RuntimeUID                    string                            4                             Read_Only  1015 
ScriptContainer               .document.XEmbeddedScripts        -INTERFACE-         Attr.     Read_Only       
ScriptProvider                .script.provider.XScriptProvider  -INTERFACE-         Pseud     Read_Only       
ShowChanges                   boolean                           True                                     1004 
StringValue                   string                            file:///C:/User...  Attr.     Read_Only       
StyleFamilies                 .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
SupportedServiceNames         []string                          -Sequence-          Pseud     Read_Only       
Text                          .text.XText                       -INTERFACE-         Pseud     Read_Only       
TextFieldMasters              .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
TextFields                    .container.XEnumerationAccess     -INTERFACE-         Pseud     Read_Only       
TextFrames                    .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
TextSections                  .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
TextTables                    .container.XNameAccess            -INTERFACE-         Pseud     Read_Only       
Title                         string                            Без имени 1         Pseud                     
TransferDataFlavors           [].datatransfer.DataFlavor        -Sequence-          Pseud     Read_Only       
TwoDigitYear                  short                             1950                                     1011 
Types                         []type                            -Sequence-          Pseud     Read_Only       
UIConfigurationManager        .ui.XUIConfigurationManager                           Ignored   Read_Only       
URL                           string                            ""                  Pseud     Read_Only       
UndoManager                   .document.XUndoManager            -INTERFACE-         Pseud     Read_Only       
UndocumentedWriterfilterHack  boolean                           0                                        1019 
UntitledPrefix                string                             :                  Pseud     Read_Only       
VBAGlobalConstantName         string                            ThisWordDoc                   Read_Only  1106 
ViewData                      .container.XIndexAccess           -INTERFACE-         Pseud                     
WordCount                     long                              4                             Read_Only  1002 
WordSeparator                 string                            ()    \nÿ                                  1003 
XForms                        .container.XNameContainer         -void-              Pseud     Read_Only   
я не вижу изображений))

sokol92

1. Почитайте об использовании MRI в интерактивном режиме (не макросом).
2. Выделите изображение, далее Меню / Сервис / Дополнения / MRI <- Selection.
3. На вкладке "Сервисы" Вы увидите список сервисов, которые поддерживает выделенный объект.
4. Откорректируйте текст своего макроса.
Владимир.

Ципихович Эндрю


Ципихович Эндрю

MRI мне сообщила:
1
LinkDisplayName               string                         Изображение1                    Read_Only            22415 
Name                          string                         Изображение1          Pseud     
2
LinkDisplayName               string                         Изображение2                    Read_Only            22415 
Name                          string                         Изображение2          Pseud
и как подправить макрос из сообщения № 1, спасибо

sokol92

Я написал: на вкладке "Сервисы" (Services), а Вы указали в сообщении фрагмент содержания вкладки Properties.
В списке поддерживаемых сервисов (на вкладке "Services") мы увидим "com.sun.star.text.TextGraphicObject". Эту текстовую константу и следует использовать в Вашем макросе вместо "com.sun.star.drawing.GraphicObjectShape".
Владимир.

Ципихович Эндрю

спасибо за подсказку, итог
import uno      # Universal Network Objects - мост между Python и API LibreOffice
import winsound # Модуль для воспроизведения звукового сигнала

def Message_box(title, text):
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    toolkit = smgr.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx)
   
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    frame = desktop.getCurrentFrame()
    window = frame.getContainerWindow()
   
    msgbox = toolkit.createMessageBox(
        window,
        'infobox',
        1,
        title,
        text
    )
    winsound.MessageBeep(winsound.MB_OK)
    msgbox.execute()
    winsound.MessageBeep(winsound.MB_OK)
    msgbox.dispose()

def Count_images():
    image_count = 0
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    doc = desktop.getCurrentComponent()

    if not doc.supportsService("com.sun.star.text.TextDocument"):
        Message_box("Ошибка", "Документ не является Writer-документом")
        return
    try:
        draw_pages = doc.getDrawPages()
        for page in draw_pages:
            for i in range(page.getCount()):
                obj = page.getByIndex(i)
                services = obj.getSupportedServiceNames()
                if "com.sun.star.text.TextGraphicObject" in services: image_count += 1
    except Exception as e:
        Message_box("Ошибка", f"Не удалось получить объекты: {str(e)}")
        return

    # Итоговый результат
    if image_count == 0:
        Message_box("Подсчёт изображений", "В документе изображения не обнаружены")
    elif image_count == 1:
        Message_box("Подсчёт изображений", "В документе обнаружено одно изображение")
    else:
        result_msg = f"В документе обнаружены изображения, их количество: {image_count} шт."
        Message_box("Подсчёт изображений", result_msg)
    return image_count

# Точка входа для макроса
g_exportedScripts = Count_images,
считает верно, указало, что два изображения, это я для теста вставил в документ изображения с png и svg файлов, далее макрос может как-то определить какое из изображений есть png или svg файлом? или при вставке этих изображений, которые будет делать макрос можно будет их как-то помечать?

sokol92

Цитата: Ципихович Эндрю от 19 февраля 2026, 08:01далее макрос может как-то определить какое из изображений есть png или svg файлом
У объекта TextGraphicObject есть свойство Graphic, которое возвращает объект, отвечающий за изображение. Свойство MimeType объекта Graphic показывает тип графического объекта. Другие полезные свойства Graphic: размер изображения в пикселях и размер в сотых долях сантиметра.
Это можно проиллюстрировать следующим образом.
Замените в своем последнем макросе строку
if "com.sun.star.text.TextGraphicObject" in services: image_count += 1на
if "com.sun.star.text.TextGraphicObject" in services:
    image_count += 1
    graphic = obj.Graphic
    info = ""
    for prop in ("MimeType", "SizePixel", "Size100thMM",):
        info = f'{info}{prop}: {str(getattr(graphic, prop, "Not found"))}\n'
    Message_box("Информация об объекте", info)
Отметим также, что свойство Graphic не сохраняет путь к файлу, из которого было получено исходное изображение.
Владимир.

Ципихович Эндрю

подправил макрос:
import uno      # Universal Network Objects - мост между Python и API LibreOffice
import winsound # Модуль для воспроизведения звукового сигнала

def Message_box(title, text):
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    toolkit = smgr.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx)
   
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    frame = desktop.getCurrentFrame()
    window = frame.getContainerWindow()
   
    msgbox = toolkit.createMessageBox(
        window,
        'infobox',
        1,
        title,
        text
    )
    winsound.MessageBeep(winsound.MB_OK)
    msgbox.execute()
    winsound.MessageBeep(winsound.MB_OK)
    msgbox.dispose()

def Count_images():
    image_count = 0
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    doc = desktop.getCurrentComponent()

    if not doc.supportsService("com.sun.star.text.TextDocument"):
        Message_box("Ошибка", "Документ не является Writer-документом")
        return
    try:
        draw_pages = doc.getDrawPages()
        for page in draw_pages:
            for i in range(page.getCount()):
                obj = page.getByIndex(i)
                services = obj.getSupportedServiceNames()
                if "com.sun.star.text.TextGraphicObject" in services:
                    image_count += 1
                    graphic = obj.Graphic
                    # Получаем информацию о свойствах объекта graphic
                    property_set_info = graphic.getPropertySetInfo()
                    properties = property_set_info.getProperties()
                    info = ""
                    for prop in properties:
                        # Получаем значение каждого свойства
                        value = graphic.getPropertyValue(prop.Name)
                        # Преобразуем значение в читаемый вид (некоторые типы, такие как структуры, могут потребовать дополнительного преобразования)
                        value_str = str(value)
                        # Добавляем строку с названием и значением свойства
                        info += f"{prop.Name}: {value_str}\n"
                    Message_box(f"Информация об изображении № {image_count}", info)
    except Exception as e:
        Message_box("Ошибка", f"Не удалось получить объекты: {str(e)}")
        return

    # Итоговый результат
    if image_count == 0:
        Message_box("Подсчёт изображений", "В документе изображения не обнаружены")
    elif image_count == 1:
        Message_box("Подсчёт изображений", "В документе обнаружено одно изображение")
    else:
        Message_box("Подсчёт изображений", f"В документе обнаружены изображения, их количество: {image_count} шт.")
    return image_count

# Точка входа для макроса
g_exportedScripts = Count_images,
получил ответ:
Animated: False
GraphicType: 1
MimeType: image/svg+xml
SizePixel: (com.sun.star.awt.Size){ Width = (long)0x148, Height = (long)0xeb }
Size100thMM: (com.sun.star.awt.Size){ Width = (long)0xd95, Height = (long)0x9ba }
BitsPerPixel: 32
Linked: False
Transparent: True
Alpha: True
OriginURL:
инет говорит о свойствах:
Animated: Информация о том, анимировано ли изображение.
GraphicType: Тип графического формата (например, растровое изображение).
MimeType: MIME-тип изображения (например, image/png).
SizePixel: Размер изображения в пикселях.
Size100thMM: Размер изображения в сотых долях миллиметров.
BitsPerPixel: Количество бит на пиксел (цветовая глубина).
Linked: Признак того, связано ли изображение с внешним источником.
Transparent: Присутствует ли альфа-канал (прозрачность).
Alpha: Поддерживает ли изображение прозрачные области.
OriginURL: Оригинальный URL изображения (если оно загружено из сети или указано явно)
так может воспользоваться: OriginURL: Оригинальный URL изображения (если оно загружено из сети или указано явно) указать явно, можно, как? я бы указал саму формулу с которой модуль для перевода формулы LaTeX преобразовал формулу в изображение