PowerShell/PDF

Aller à la navigation Aller à la recherche

Création d'un document PDF depuis une image ou une liste d'images, avec une page PDF par image.

ConvertToPdf

function ConvertToPdf($files, $outFile) {
<#
.SYNOPSIS
    Conversion d'une ou plusieurs images au format JPEG en PDF et concaténation dans une seul fichier

.DESCRIPTION
    Conversion d'une ou plusieurs images au format JPEG en PDF et concaténation dans une seul fichier.
    Cela fonctionne avec une seule image ou plusieurs images.
    Pour la génération de PDF, se base sur l'imprimante virtuelle "Microsoft Print to PDF". Il faut donc que cette imprimante virtuelle existe pour que le script fonctionne.

.EXaMPLE
    ConvertToPdf (Get-ChildItem *.jpg | Sort-Object Name) catalogue.pdf

.EXAMPLE
    ConvertToPdf (Get-ChildItem image*.jpg | Sort-Object Name) catalogue.pdf

.INPUTS
    Un ou plusieurs fichiers images (JPEG...)

.OUTPUTS
    Un fichier PDF

.NOTES
    NAME: 
    AUTHOR: https://stackoverflow.com/users/2127371/makhdumi
    EMAIL: 
    WWW: https://stackoverflow.com/questions/41061219/convert-jpeg-to-pdf
    VERSION HISTORY:
        1.0    2022-06-25
        Initial Version

    TODO
        * 
.LINK
    https://stackoverflow.com/users/2127371/makhdumi
    https://stackoverflow.com/questions/41061219/convert-jpeg-to-pdf
#>
    Add-Type -AssemblyName System.Drawing
    $files = @($files)
    if (!$outFile) {
        $firstFile = $files[0] 
        if ($firstFile.FullName) { $firstFile = $firstFile.FullName }
        $outFile = $firstFile.Substring(0, $firstFile.LastIndexOf(".")) + ".pdf"
    } else {
        if (![System.IO.Path]::IsPathRooted($outFile)) {
            $outFile = [System.IO.Path]::Combine((Get-Location).Path, $outFile)
        }
    }

    try {
        $doc = [System.Drawing.Printing.PrintDocument]::new()
        $opt = $doc.PrinterSettings = [System.Drawing.Printing.PrinterSettings]::new()
        $opt.PrinterName = "Microsoft Print to PDF"
        $opt.PrintToFile = $true
        $opt.PrintFileName = $outFile

        $script:_pageIndex = 0
        $doc.add_PrintPage({
            param($sender, [System.Drawing.Printing.PrintPageEventArgs] $a)
            $file = $files[$script:_pageIndex]
            if ($file.FullName) {
                $file = $file.FullName
            }
            $script:_pageIndex = $script:_pageIndex + 1

            try {
                $image = [System.Drawing.Image]::FromFile($file)
                $a.Graphics.DrawImage($image, $a.PageBounds)
                $a.HasMorePages = $script:_pageIndex -lt $files.Count
            }
            finally {
                $image.Dispose()
            }
        })
        $doc.PrintController = [System.Drawing.Printing.StandardPrintController]::new()
        $doc.Print()
        return $outFile
    }
    finally {
        if ($doc) { $doc.Dispose() }
    }
}

Set-Location "C:\tmp\"
ConvertToPdf (Get-ChildItem *.jpg | Sort-Object Name) DocumentFinal.pdf

Voir aussi

  •