Я пишу сценарий для просмотра каждого текстового документа в каталоге и удаления всех изображений. Это потому, что у меня есть клиент, которому нужно дебрендировать большой набор документов.
Я написал сценарий 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"
}
}`
Я пробовал перебирать каждую строчную фигуру, фигуру, текстовое поле, таблицу в документе, чтобы увидеть, есть ли там какое-либо изображение. Все возвращается как отсутствие изображений в отладках.
Как уже отмечалось, существует гораздо больше типов фигур и встроенных фигур, которые вы можете считать «изображениями».
Чтобы проверить, имеет ли определенная фигура тип, который вы можете рассматривать как изображение, измените циклы 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 Я протестировал свой код, используя $doc.InlineShapes и $doc.Shapes, и все сработало нормально. Возможно, у вас $firstPageRange
вещи неправильные? Само собой разумеется, что после внесения изменений в документ его необходимо сохранить.
Да, по большей части это работает. Код, который я использую для тестирования, на самом деле проверяет весь документ, а не только первую страницу. Это работает в 99% случаев, однако конкретный текстовый документ, который они мне предоставили, кажется исключением, сценарий не обнаруживает в нем никаких изображений.
@DanielSCG В этом случае вы можете проверить, какие типы фигур используются в этом старом документе, который вам нужно протестировать, и, возможно, добавить дополнительные значения в массивы $msoImages
и $inlineImages
. Поскольку у меня нет вашего тестового документа, я не могу помочь вам в этом конкретном примере. А пока было бы полезно, если бы вы приняли мой ответ, чтобы другим было легче его найти.
Взгляните еще раз на перечисление WdInlineShapeType , где вы найдете больше значений, похожих на картинки, например
wdInlineShapeLinkedPicture
(значение 4),wdInlineShapeLinkedPictureHorizontalLine
(значение 8) или дажеwdInlineShapeWebVideo
(значение 16) и т. д. Еще есть перечисление MsoShapeType где вы найдете, например,msoGraphic
(значение 28),msoLinkedGraphic
(значение 29),msoLinkedPicture
(значение 11),msoPicture
(значение 13) и т. д.