2016-05-06 59 views
0

我試圖重新編碼this到的PowerShell v2的,但是當我嘗試插入TIFF使用一個MemoryStream作爲參數創建iTextSharp.text.pdf.PdfReader我得到過載錯誤:iTextSharp的PdfReader超載錯誤

"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支持的話,爲什麼我得到這個錯誤(也很在原來的代碼中使用)

使用豪華v2和v3也試過,86 & 64 ...

謝謝!

+0

錯誤提示您在構建「PdfReader」實例時提供了18270個參數。這不是iText問題。這是一個PowerShell問題。使用帶有單個參數的'PdfReader'。 –

+0

嗨布魯諾,你可以在https://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray(v=vs.110).aspx看到,'toArray'方法返回一個字節數組,但是正如你所說,構造函數並不像數組那樣獲得它。使用PowerShell的PDF閱讀器的所有示例都使用文件作爲源,它們中的任何一個都使用字節數組。也許這是一種豪華的不兼容...... – SalvaG

+0

正如我所說:我不知道PowerShell,但我覺得很難相信有人會創建一種語言,你有時會使用'New-Object iTextSharp.text.pdf.PdfReader $ (無括號;無分號),有時還有New-Object iTextSharp.text.pdf.PdfReader($ m.ToArray());(括號和分號)。這看起來非常糟糕的編碼規範。 –

回答

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