将 JPEG 转换为 PDF

问题描述 投票:0回答:4

任何人都可以提供将 JPEG 转换为 PDF 的最简单方法的示例吗?

powershell pdf jpeg powershell-2.0 powershell-3.0
4个回答
1
投票

您所要做的就是打印到 PDF 虚拟打印机。有很多这样的打印机可用。


1
投票

您可以在 Windows 上执行此操作,无需任何第三方可执行文件或库。


function ConvertToPdf($files, $outFile) {
    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() }
    }
}

使用示例:

ConvertToPdf (gi *.jpeg| sort Name) out.pdf

0
投票

任何人都可以提供将 JPEG 转换为 PDF 的最简单方法的示例吗?

A

第一个正确答案与上面的 user3344003 一样简短https://stackoverflow.com/a/41068017/10802527但是没有解释 Windows 通过“Microsoft Print to PDF”具有内置功能。

这可以在没有 powershell 的情况下从命令行使用,效果良好,但由于默认情况下需要手动响应来指定文件名而变得复杂。有很多方法可以在打印 ui 中轻松配置将 file.txt 打印到 file.pdf。 (但是在某些情况下,目标文件可能尚不存在。)

图像到pdf并不那么简单,所以没有powershell我们可以通过打印

mspaint /pt image.jpg "Microsoft Print to PDF"

但再次需要解决 PortPrompt 问题:请参阅 https://stackoverflow.com/a/71225924/10802527

因此,无论有没有 powershell,我们只需要运行到具有默认表单大小的给定端口名称,这里我已将景观输入设置为 A4Landscape

mspaint /pt Landscape.jpg A4LPdf

File: C:\Users\Me\Documents\printout.pdf
Title: Untitled.jpg
Author: Me
Created: 2022-06-26 02:52:33
Modified: 2022-06-26 02:52:33
PDF Producer: Microsoft: Print To PDF
PDF Version: 1.7
File Size: 7.45 KB (7,632 Bytes)
Number of Pages: 1
Page Size: 21.0 x 29.7 cm (A4)

目光敏锐的人会发现,虽然我指定了横向,但输出是纵向,这是盲打印到 PDF 的核心问题,如果没有用户选择,就没有精细的比例或方向控制。

每项任务都应视为游戏结束。因此,如果想要一个好的 PDF,最好将图像导入 PDF 应用程序以按数字进行转换。

因此我建议这个问题,因此答案应该是这样的

问我可以使用 MuTool.exe 以受控方式将图像保存为 PDF 吗?

是的。


0
投票

为了我的目的,我对 makhdumi 的版本进行了一些修改。现在,它在以轴为中心的列中每页打印两个图像。 附:我还不明白 PowerShell 如何计算坐标...

    function ConvertToPdf($files, $outFile) {
>>     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
>>             $file2 = $files[$script:_pageIndex]
>>             if ($file2.FullName) {
>>                 $file2 = $file2.FullName
>>             }
>>             $script:_pageIndex = $script:_pageIndex + 1
>>             try {
>>                 $image = [System.Drawing.Image]::FromFile($file)
>>                 $a.Graphics.DrawImage($image, (2252 - $image.Width)/2,  (3508 - 2*$image.Height - 2*(3508 - 2*$image.Height)/3)*1100/3508 )
>>
>>
>>
>>                 try{
>>                 $image2 = [System.Drawing.Image]::FromFile($file2)
>>                 $a.Graphics.DrawImage($image2, (2252 - $image2.Width)/2,  (3508 - $image2.Height - (3508 - 2*$image2.Height)/3)*1100/3508 )
>>                 }catch{}
>>                 $a.HasMorePages = $script:_pageIndex -lt $files.Count
>>
>>
>>             }
>>             finally {
>>                 $image.Dispose()
>>                 try{
>>                 $image2.Dispose()
>>                 }catch{}
>>             }
>>         })
>>
>>         $doc.PrintController = [System.Drawing.Printing.StandardPrintController]::new()
>>
>>         $doc.Print()
>>         return $outFile
>>     }
>>     finally {
>>         if ($doc) { $doc.Dispose() }
>>     }
>> }
© www.soinside.com 2019 - 2024. All rights reserved.