Powershell和iTextsharp将多个图像添加到PDF

时间:2014-06-27 11:08:39

标签: powershell pdf itextsharp

我试图在Powershell中使用itextsharp(如果这是一个更好的选择,可以改为pdfsharp)来从图像中制作PDF。我已设法创建一个包含一个图像的PDF文件,但我不知道如何从文件夹中的所有图像创建一个。

由于这些图像的比例尺完全适合PDF,我还想设置比例,使其填满页面100%。那可能吗?

我不是经验丰富的Powershell用户,但这是我到目前为止所做的:

[System.Reflection.Assembly]::LoadFrom("C:\temp\itextsharp.dll")

$doc = New-Object iTextSharp.text.Document
$fileStream = New-Object IO.FileStream("C:\temp\output5.pdf", [System.IO.FileMode]::Create)
[iTextSharp.text.pdf.PdfWriter]::GetInstance($doc, $filestream)

$jpg = [iTextSharp.text.Image]::GetInstance( "c:\temp\horse.jpg" )
$doc.open()
$Doc.add($jpg);
$doc.close()

如果有人有任何想法,请告诉我,谢谢。

1 个答案:

答案 0 :(得分:2)

您需要使用Get-ChildItem来获取给定文件夹中的所有图片。然后,您需要在调用foreach的图片上使用ForEach-Object(有时会缩短为$doc.Add()),但在调用$doc.NewPage()之前也是如此。

以下代码显示全部关闭。一个常见的要求是每个页面的大小也适合图像,所以我也添加了它。我们为每个图片实例化System.Drawing.Bitmap以获取尺寸,创建具有这些尺寸的iTextSharp Rectangle,然后使用该尺寸通过$doc.SetPageSize()设置页面尺寸。

为了让事情变得简单,我已将大部分变量移到顶部,您需要更新它们以满足您的需求。希望这些评论可以让你完全接受。

## Set various paths
$iTextSharpFilePath = "D:\DLLs\itextsharp.dll"
$imageFolderPath    = "D:\images"
$pdfFilePath        = "D:\temp.pdf"

## Load iTextSharp and System.Drawing
[System.Reflection.Assembly]::LoadFrom($iTextSharpFilePath)
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

## Get all of the images in the folder
## Change the filter if needed
$images = Get-ChildItem $imageFolderPath -Filter *.png

## Create our stream, document and bind a writer
$fileStream = New-Object System.IO.FileStream($pdfFilePath, [System.IO.FileMode]::Create)
$doc = New-Object iTextSharp.text.Document
$writer = [iTextSharp.text.pdf.PdfWriter]::GetInstance($doc, $filestream)

## Open the document for writing
$doc.Open()

## Remove all document margins
$doc.SetMargins(0, 0, 0, 0)

## Loop through each image in the folder
foreach($image in $images)
{
    ## Create a .Net image so that we can get the image dimensions
    $bmp = New-Object System.Drawing.Bitmap($image.FullName)

    ## Create an iTextSharp rectangle that corresponds to those dimensions
    $rect = New-Object iTextSharp.text.Rectangle($bmp.Width, $bmp.Height)

    ## Set the next page size to those dimensions and add a new page
    $doc.SetPageSize( $rect )
    $doc.NewPage()

    ## Add our image to the page
    $doc.Add([iTextSharp.text.Image]::GetInstance( $image.FullName ));

    ## Cleanup
    $bmp.Dispose()
}

## Cleanup
$doc.Close()
$doc.Dispose()
$writer.Dispose()