Powershell и iTextSharp добавляют несколько изображений в PDF

#powershell #pdf #itextsharp

#powershell #PDF #itextsharp

Вопрос:

Я пытаюсь использовать itextsharp (можно изменить на pdfsharp, если это будет лучшим вариантом) в Powershell для создания PDF-файла из изображений. Мне удалось создать PDF-файл с одним изображением, но я не знаю, как создать его из всех изображений в папке.

Поскольку эти изображения имеют такой масштаб, который идеально подходит для PDF-файла, я также хотел бы установить масштаб, чтобы он заполнял страницу на 100%. Возможно ли это?

Я не опытный пользователь Powershell, но это то, что я получил до сих пор:

 [System.Reflection.Assembly]::LoadFrom("C:tempitextsharp.dll")

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

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

Если у кого-нибудь есть какие-либо идеи, пожалуйста, дайте мне знать, спасибо.

Ответ №1:

Вы захотите использовать Get-ChildItem , чтобы получить все изображения в заданной папке. Затем вы захотите использовать ForEach-Object (иногда сокращенный до foreach ) для изображений, вызывающих ваш $doc.Add() , но непосредственно перед вызовом $doc.NewPage() .

Приведенный ниже код показывает, что все это отключено. Одна из распространенных просьб — также настроить размер каждой страницы в соответствии с изображением, поэтому я добавил и это. Мы создаем экземпляр a System.Drawing.Bitmap для каждого изображения, чтобы получить размеры, создаем iTextSharp Rectangle с этими размерами, а затем используем его для установки размера страницы с помощью $doc.SetPageSize() .

Я переместил большую часть переменной в начало, чтобы упростить задачу, вы захотите обновить их в соответствии с вашими потребностями. Надеюсь, комментарии помогут вам пройти оставшуюся часть пути.

 ## Set various paths
$iTextSharpFilePath = "D:DLLsitextsharp.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()