[PYTHON] Insérez en continu des images dans le port d'alimentation fonctionnant sur pywin32

Ça ressemble à ça ↓

202004272092216.png

En supposant une utilisation sous Windows, appelez le fichier .py à partir de l'applet de commande PowerShell ci-dessous et exécutez-le. Le nom de l'applet de commande est assez long, mais il ne devrait y avoir aucun problème car la complétion fonctionne.

Il existe également un moyen plus direct pour travailler avec les produits Office pendant son exécution, mais depuis powershell 6 [System.Runtime.InteropServices.Marshal]: : GetActiveObject () n'est plus disponible, donc pywin32 est utilisé à la place.

function Add-Image2ActivePptSlideWithPython {
    <#
        .SYNOPSIS
Utilisez pywin32 pour insérer en continu des images dans la diapositive powerpo actuellement ouverte
    #>
    if ((Get-Process | Where-Object ProcessName -EQ "POWERPNT").Count -lt 1) {
        return
    }
    $targetPath = @($input).Fullname
    if (-not $targetPath) {
        return
    }

    if ((Read-Host "Le paramètre "Ne pas compresser les images dans le fichier" est-il activé?(y/n)") -ne "y") {
        return
    }

    $tmp = New-TemporaryFile
    $targetPath | Out-File -Encoding utf8 -FilePath $tmp.FullName #Avec BOM
    
    #Placez le script python décrit ci-dessous dans le même répertoire que ce script.
    $pyCodePath = "{0}\activeppt_insert-image.py" -f $PSScriptRoot
    'python -B "{0}" "{1}"' -f $pyCodePath, $tmp.FullName | Invoke-Expression
    Remove-Item -Path $tmp.FullName
}

Au début, [Désactivez la compression d'image](https://support.office.com/ja-jp/article/%E7%94%BB%E5%83%8F%E3%81%AE%E5% 9C% A7% E7% B8% AE% E3% 82% 92% E7% 84% A1% E5% 8A% B9% E3% 81% AB% E3% 81% 99% E3% 82% 8B-81a6b603-0266- 4451-b08e-fc1bf58da658) Je vérifie si c'est fait (car si vous oubliez cela, la résolution de l'image insérée baissera).

Sur la ligne de commande réelle, transmettez l'objet image que vous souhaitez insérer via le pipeline comme indiqué ci-dessous.

ls -File | Add-Image2ActivePptSlideWithPython

Il existe également une méthode pour passer le chemin de l'image passée via le pipeline en tant qu'argument, mais dans ce cas, il est gênant d'échapper les caractères spéciaux et la limite supérieure de l'argument, donc il est écrit dans un fichier temporaire créé avec New-TemporaryFile. À ce stade, même si ʻUTF8` est spécifié selon les spécifications PowerShell, la nomenclature est attachée, donc faites attention au code de caractère.

Le fichier python appelé devrait ressembler à ceci: Si vous l'exécutez avec Powerpo en cours d'exécution, ʻActivePresentation` interceptera le processus en cours. Je me suis assuré que PowerPoint fonctionnait à l'avance, mais j'essaie de ne rien faire si la présentation n'est pas ouverte. De plus, si vous attrapez un processus zombie invisible, le processus lui-même sera interrompu.

activeppt_insert-image.py


"""
Utilisez pywin32 pour insérer une série d'images dans la diapositive PowerPoint actuellement ouverte
"""
import win32com.client
import argparse

class vb:
    msoFalse        = 0
    msoTrue         = -1
    ppLayoutBlank   = 12

def main(file_list_path):
    pptApp = win32com.client.Dispatch("PowerPoint.Application")
    if pptApp.Presentations.Count < 1:
        if not pptApp.Visible:
            pptApp.Quit()
        return

    with open(file_list_path, "r", encoding="utf_8_sig") as f:
        all_lines = f.read()
    image_path_list = all_lines.splitlines()

    presen = pptApp.ActivePresentation
    slide_width = presen.PageSetup.SlideWidth
    slide_height = presen.PageSetup.SlideHeight

    for img_path in image_path_list:
        slide_index = presen.Slides.Count + 1
        presen.Slides.Add(slide_index, vb.ppLayoutBlank)
        last_slide = presen.Slides(slide_index)
        inserted_img = last_slide.Shapes.AddPicture(
            FileName = img_path,
            LinkToFile = vb.msoFalse,
            SaveWithDocument = vb.msoTrue,
            Left = 0,
            Top = 0
            )
        inserted_img.Left = (slide_width - inserted_img.Width) / 2
        inserted_img.Top = (slide_height - inserted_img.Height) / 2
        print(f"inserted: {img_path}")

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("file_list_path")
    args = parser.parse_args()
    main(args.file_list_path)

finalement

(´- \ ) .. oO ( GetActiveObject () `sera bientôt implémenté ...)

Recommended Posts

Insérez en continu des images dans le port d'alimentation fonctionnant sur pywin32
Collez automatiquement des images dans des matériaux Powerpo avec python + α