Powershell удалить изображение из документа Word

Я пишу сценарий для просмотра каждого текстового документа в каталоге и удаления всех изображений. Это потому, что у меня есть клиент, которому нужно дебрендировать большой набор документов.

Я написал сценарий PowerShell, и он работает для большинства. Однако я наткнулся на документ, и изображение не регистрируется в PowerShell как фигура, встроенная фигура, фигура в таблице, фигура в текстовом поле. Кажется, я не могу заставить PowerShell распознать изображение в документе как изображение, поэтому оно отсутствует каждый раз, когда он пытается его удалить.

Есть ли другой способ программного удаления всех изображений из документа Word, поскольку функция «форма» в PowerShell, похоже, не работает в половине случаев. Ниже мой код:

`# Инициализируем переменную для хранения общего количества фигур $totalShapeCount = 0

    # Loop through each story range in the document
    foreach ($storyRange in $doc.StoryRanges) {
        # Get the range of the current story
        $currentRange = $storyRange

        # Check if the current story range is not null
        if ($currentRange -ne $null) {
            # Loop through all shapes in the current story range and count them
            $shapeCount = $currentRange.Shapes.Count
            $totalShapeCount += $shapeCount
        }
    }

    # Output the total number of shapes found in the entire document
    Write-Host "Number of shapes found in the entire document: $totalShapeCount"


    # Get the first page range
    $firstPageHeight = $doc.PageSetup.PageHeight - $doc.PageSetup.TopMargin - $doc.PageSetup.BottomMargin
    $firstPageRange = $doc.Range(0, $firstPageHeight)

    # Output the range information for debugging
    Write-Host "First Page Range Start: $($firstPageRange.Start)"
    Write-Host "First Page Range End: $($firstPageRange.End)"

    # Loop through all inline shapes in the first page
    $inlineShapeCount = $firstPageRange.InlineShapes.Count
    Write-Host "Number of inline shapes found on the first page: $inlineShapeCount"
    
    # Loop through all shapes in the first page
    $shapeCount = $firstPageRange.Shapes.Count
    Write-Host "Number of shapes found on the first page: $shapeCount"

    # Loop through all inline shapes in the first page
    foreach ($shape in $firstPageRange.InlineShapes) {
        # Check if the inline shape is an image
        if ($shape.Type -eq 3) { # 3 corresponds to wdInlineShapePicture
            # Delete the image
            $shape.Delete()
            Write-Host "Deleted inline image on the first page"
        }
    }
    
    # Loop through all shapes in the first page and delete images
    foreach ($shape in $firstPageRange.Shapes) {
        if ($shape.Type -eq "msoPicture") {
            $shape.Delete()
            Write-Host "Deleted image on the first page"
        }
    }`

Я пробовал перебирать каждую строчную фигуру, фигуру, текстовое поле, таблицу в документе, чтобы увидеть, есть ли там какое-либо изображение. Все возвращается как отсутствие изображений в отладках.

Взгляните еще раз на перечисление WdInlineShapeType , где вы найдете больше значений, похожих на картинки, например wdInlineShapeLinkedPicture (значение 4), wdInlineShapeLinkedPictureHorizontalLine (значение 8) или даже wdInlineShapeWebVideo (значение 16) и т. д. Еще есть перечисление MsoShapeType где вы найдете, например, msoGraphic (значение 28), msoLinkedGraphic (значение 29), msoLinkedPicture (значение 11), msoPicture (значение 13) и т. д.

Theo 19.04.2024 12:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как уже отмечалось, существует гораздо больше типов фигур и встроенных фигур, которые вы можете считать «изображениями».

Чтобы проверить, имеет ли определенная фигура тип, который вы можете рассматривать как изображение, измените циклы foreach на этот

типы встроенных фигур, похожие на изображения

# wdInlineShapePicture, wdInlineShapeLinkedPicture, wdInlineShapePictureHorizontalLine,
# wdInlineShapeLinkedPictureHorizontalLine, wdInlineShapePictureBullet, 
# wdInlineShapeLockedCanvas, wdInlineShapeSmartArt, wdInlineShapeWebVideo
$inlineImages = 3,4,7,8,9,14,15,16
# Loop through all inline shapes in the first page
foreach ($shape in $firstPageRange.InlineShapes) {
    # Check if the inline shape is an image
    if ($shape.Type -in $inlineImages) {
        # Delete the image
        $shape.Delete()
        Write-Host "Deleted inline image on the first page"
    }
}

# or like this:

# $inlineImages = 3,4,7,8,9,14,15,16
# $firstPageRange.InlineShapes | Where-Object {$inlineImages -contains $_.Type} | 
# ForEach-Object { 
#     $_.Delete()
#     Write-Host "Deleted inline image on the first page"
# }

типы фигур Mso, похожие на изображения

# msoLinkedPicture, msoPicture, msoMedia, msoCanvas, msoIgxGraphic, 
# msoWebVideo, msoGraphic, msoLinkedGraphic
$msoImages = 11,13,16,20,24,26,28,29
# Loop through all shapes in the first page and delete images
foreach ($shape in $firstPageRange.Shapes) {
    if ($shape.Type -in $msoImages) {
        $shape.Delete()
        Write-Host "Deleted image on the first page"
    }
}

# or like this:

# $msoImages = 11,13,16,20,24,26,28,29
# $firstPageRange.Shapes | Where-Object {$msoImages -contains $_.Type} | 
# ForEach-Object { 
#     $_.Delete()
#     Write-Host "Deleted image on the first page"
# }

Проблема в том, что следующие хосты записи печатают как фигуры 0. На первой странице документа фигур не обнаружено. Я попробовал проанализировать весь документ, но все равно возвращает 0. Даже если есть изображение. # Получение первого диапазона страниц $firstPageHeight = $doc.PageSetup.PageHeight - $doc.PageSetup.TopMargin - $doc.PageSetup.BottomMargin $firstPageRange = $doc.Range(0, $firstPageHeight) # Перебор всех встроенных фигур в первая страница $inlineShapeCount = $firstPageRange.InlineShapes.Count Write-Host «Количество встроенных фигур, найденных на первой странице: $inlineShapeCount»

DanielSCG 22.04.2024 10:18

@DanielSCG Я протестировал свой код, используя $doc.InlineShapes и $doc.Shapes, и все сработало нормально. Возможно, у вас $firstPageRange вещи неправильные? Само собой разумеется, что после внесения изменений в документ его необходимо сохранить.

Theo 22.04.2024 22:12

Да, по большей части это работает. Код, который я использую для тестирования, на самом деле проверяет весь документ, а не только первую страницу. Это работает в 99% случаев, однако конкретный текстовый документ, который они мне предоставили, кажется исключением, сценарий не обнаруживает в нем никаких изображений.

DanielSCG 24.04.2024 10:56

@DanielSCG В этом случае вы можете проверить, какие типы фигур используются в этом старом документе, который вам нужно протестировать, и, возможно, добавить дополнительные значения в массивы $msoImages и $inlineImages. Поскольку у меня нет вашего тестового документа, я не могу помочь вам в этом конкретном примере. А пока было бы полезно, если бы вы приняли мой ответ, чтобы другим было легче его найти.

Theo 24.04.2024 15:29

Другие вопросы по теме