任何人都可以提供将 JPEG 转换为 PDF 的最简单方法的示例吗?
您所要做的就是打印到 PDF 虚拟打印机。有很多这样的打印机可用。
您可以在 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
问
任何人都可以提供将 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 吗?
是的。
为了我的目的,我对 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() }
>> }
>> }