#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()