我正在尝试将this重新编码为PowerShell v2但是当我尝试使用memorystream作为参数插入创建iTextSharp.text.pdf.PdfReader的TIFF时,我遇到了重载错误:
"New-Object : Cannot find an overload for "PdfReader" and the argument count: "18270"."
我正在使用itextsharp 5.5.9
这是我的代码:
[System.Reflection.Assembly]::LoadFrom(c:\temp\itextsharp.dll) | Out-Null
$List = gc C:\temp\filelist.txt
$Dest = "C:\destPDF.pdf"
$document = New-Object iTextSharp.text.Document([iTextSharp.text.PageSize]::A4, 0, 0, 0, 0)
$copy = New-Object iTextSharp.text.pdf.PdfCopy($document, (New-Object System.IO.FileStream $RutaDestino, 'Create'))
$document.Open();
foreach ($file in $List)
{
$extension = (Get-Item $file).extension.toupper()
switch ($extension)
{
".PDF" {
[iTextSharp.text.pdf.PdfReader] $reader = New-Object iTextSharp.text.pdf.PdfReader $file
$reader.ConsolidateNamedDestinations()
for ($i = 1; $i -le $reader.NumberOfPages; $i++)
{
[iTextSharp.text.pdf.PdfImportedPage] $page = $copy.GetImportedPage($reader, $i)
$copy.addpage($page)
}
$reader.Close()
}
".TIF" {
[iTextSharp.text.Rectangle] $pageSize = $null;
[System.Drawing.Bitmap] $bm = New-Object System.Drawing.Bitmap($file)
$pageSize = New-Object iTextSharp.text.Rectangle(0, 0, $bm.Width, $bm.Height);
$m = New-Object System.IO.MemoryStream
$d = New-Object iTextSharp.text.Document($pageSize, 0, 0, 0, 0)
$w = [iTextSharp.text.pdf.PdfWriter]::GetInstance($d, $m)
$d.Open();
$d.Add([iTextSharp.text.Image]::GetInstance($file));
$d.Close();
$r = New-Object iTextSharp.text.pdf.PdfReader($m.ToArray());
$copy.AddDocument($r);
}
}
}
$document.Close();
我不知道为什么我收到此错误,因为PdfReader constructor支持它(也在原始代码中使用)
还尝试使用PoSh v2和v3,x86& 64 ...
谢谢!
答案 0 :(得分:0)
错误告诉您在构造PdfReader实例时提供了18270个参数。这不是iText问题。这是一个PowerShell问题。使用带有单个参数的PdfReader。
我不知道PowerShell,但我认为这是错误的:
$r = New-Object iTextSharp.text.pdf.PdfReader($m.ToArray());
这是您的代码段中唯一可以将18270参数传递给PdfReader
(18270个单独字节)的地方。
首先从byte[]
创建一个$m
对象,并在构造PdfReader
实例时将该对象作为单个参数传递。
阅读How do I call New-Object for a constructor which takes a single array parameter?的答案,了解如何做到这一点。
我再说一遍:我不知道PowerShell,但你提到的错误信息很清楚,答案很明显。另见:Using New-Object -ArgumentList when the constructor takes one parameter that is an array