[PYTHON] Fügen Sie kontinuierlich Bilder in den Stromanschluss ein, der auf pywin32 ausgeführt wird

Es sieht so aus ↓

202004272092216.png

Rufen Sie bei Verwendung unter Windows die Datei ".py" aus dem unten stehenden Powershell-Cmdlet auf und führen Sie sie aus. Der Cmdlet-Name ist ziemlich lang, aber es sollte kein Problem geben, da die Vervollständigung funktioniert.

Es gibt auch einen direkteren Weg für die Arbeit mit Office-Produkten während der Ausführung, jedoch seit Powershell 6 [System.Runtime.InteropServices.Marshal]: : GetActiveObject () ist nicht mehr verfügbar, daher wird stattdessen pywin32 verwendet.

function Add-Image2ActivePptSlideWithPython {
    <#
        .SYNOPSIS
Verwenden Sie pywin32, um kontinuierlich Bilder in die aktuell geöffnete Powerpo-Folie einzufügen
    #>
    if ((Get-Process | Where-Object ProcessName -EQ "POWERPNT").Count -lt 1) {
        return
    }
    $targetPath = @($input).Fullname
    if (-not $targetPath) {
        return
    }

    if ((Read-Host "Ist die Einstellung "Bilder in Datei nicht komprimieren" aktiviert?(y/n)") -ne "y") {
        return
    }

    $tmp = New-TemporaryFile
    $targetPath | Out-File -Encoding utf8 -FilePath $tmp.FullName #Mit Stückliste
    
    #Platzieren Sie das unten beschriebene Python-Skript im selben Verzeichnis wie dieses Skript.
    $pyCodePath = "{0}\activeppt_insert-image.py" -f $PSScriptRoot
    'python -B "{0}" "{1}"' -f $pyCodePath, $tmp.FullName | Invoke-Expression
    Remove-Item -Path $tmp.FullName
}

Zu Beginn [Bildkomprimierung deaktivieren](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) Ich überprüfe, ob es fertig ist (denn wenn Sie dies vergessen, sinkt die Auflösung des eingefügten Bildes).

Übergeben Sie in der eigentlichen Befehlszeile das Bildobjekt, das Sie einfügen möchten, wie unten gezeigt über die Pipeline.

ls -File | Add-Image2ActivePptSlideWithPython

Es gibt auch eine Möglichkeit, den Pfad des über die Pipeline übergebenen Bilds als Argument zu übergeben. In diesem Fall ist es jedoch schwierig, Sonderzeichen und die Obergrenze des Arguments zu umgehen, sodass es in eine temporäre Datei geschrieben wird, die mit "New-TemporaryFile" erstellt wurde. Selbst wenn zu diesem Zeitpunkt "UTF8" gemäß den Spezifikationen von Powershell angegeben wird, wird die Stückliste angehängt. Achten Sie daher auf den Zeichencode.

Die aufgerufene Python-Datei sollte folgendermaßen aussehen: Wenn Sie es mit Powerpo ausführen, fängt ActivePresentation den laufenden Prozess ab. Ich habe sichergestellt, dass auf dem Anrufer PowerPoint im Voraus ausgeführt wird, aber ich versuche nichts zu tun, wenn die Präsentation nicht geöffnet ist. Wenn Sie einen unsichtbaren Zombie-Prozess abfangen, wird der Prozess selbst beendet.

activeppt_insert-image.py


"""
Fügen Sie mit pywin32 eine Reihe von Bildern in die aktuell geöffnete PowerPoint-Folie ein
"""
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)

Schließlich

(´- \ ) .. oO (Ich frage mich, ob GetActiveObject ()` bald implementiert wird ...)

Recommended Posts

Fügen Sie kontinuierlich Bilder in den Stromanschluss ein, der auf pywin32 ausgeführt wird
Fügen Sie Bilder mit Python + α automatisch in Powerpo-Materialien ein