2016-05-06 2 views
0

Я пытаюсь перекодировать this в PowerShell v2, но когда я пытаюсь вставить TIFF создавая iTextSharp.text.pdf.PdfReader с помощью MemoryStream в качестве аргумента я получаю ошибку перегрузки: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 поддерживает его (также это используется в исходном коде)

пытался также с помощью Posh v2 и v3, x86 x64 & ...

Спасибо!

+0

Ошибка сообщает вам, что вы предоставляете параметры 18270 при создании экземпляра 'PdfReader'. Это не проблема iText. Это проблема PowerShell. Используйте 'PdfReader' с одним параметром. –

+0

Привет, Бруно, как вы можете видеть на https://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray(v=vs.110).aspx, метод toArray возвращает массив байтов , но конструктор не получает его как массив, как вы сказали. Все образцы PDF-ридера, использующие powershell, используют его, используя файл в качестве источника, любой из которых использует массив байтов. Возможно, это шикарная несовместимость ... – SalvaG

+0

Как я уже сказал: я не знаю PowerShell, но мне трудно поверить, что кто-то создаст язык, где вы иногда будете использовать 'New-Object iTextSharp.text.pdf.PdfReader $ file' (без скобок), а иногда 'New-Object iTextSharp.text.pdf.PdfReader ($ m.ToArray());' (круглые скобки и точка с запятой). Это выглядит очень плохой кодирующей дисциплиной. –

ответ

0

Ошибка сообщает вам, что вы предоставляете параметры 18270 при создании экземпляра PdfReader. Это не проблема 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

Смежные вопросы