2012-01-23 2 views
0

noob to C# здесь, используя примеры iTextSharp со всех сторон. Я создал базовый exe, чтобы изменить название, описание и ключевые слова для существующего PDF. Использование MS Visual C# 2010, я не понимаю, все эти изменения 'Generic' на языке C#, так что я получаю эту ошибку:Свойства iTextSharp с использованием HashTable или что-то еще?

Cannot implicitly convert type 'System.Collections.Generic.Dictionary<string,string>' to 'System.Collections.Hashtable' 

и

Cannot implicitly convert type 'System.Collections.Hashtable' to 'System.Collections.Generic.IDictionary<string,string>'. An explicit conversion exists (are you missing a cast?) 

Кодекс:

using System; 
using System.Collections; 
using System.IO; 
using System.Linq; 
using System.Text; 
using iTextSharp.text.pdf; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if ((args == null) || (args.Length < 3)) 
      { 
       Console.WriteLine("args: PDFProp [fileName] [outputPath] [Title] [Description] [Keywords]"); 
       Console.WriteLine(); 
       Console.Write("<Continue>"); 
       Console.ReadLine(); 
       return; 
      } 

      string filePath = args[0]; 
      string newFilePath = args[1]; 
      string title = args[2]; 
      string desc = ""; 
      string keywords = ""; 
      if (args.Length > 3) 
       desc = args[3]; 
      if (args.Length > 4) 
       keywords = args[4]; 

      Console.Write(filePath + "->" + newFilePath + " title: " + title + " description: " + desc + " keywords: " + keywords); 
      Console.WriteLine(); 
      Console.ReadLine(); 

      PdfReader pdfReader = new PdfReader(filePath); 
      using (FileStream fileStream = new FileStream(newFilePath, FileMode.Create, FileAccess.Write)) 
      { 
       // string title = pdfReader.Info["Title"] as string;   

       PdfStamper pdfStamper = new PdfStamper(pdfReader, fileStream); 

       // The info property returns a copy of the internal HashTable 
       Hashtable newInfo = pdfReader.Info;    // error 1 

       newInfo["Title"] = title; 

       if (args.Length > 3) 
        newInfo["Description"] = desc; 
       if (args.Length > 4) 
        newInfo["Keywords"] = keywords; 

       pdfStamper.MoreInfo = newInfo;     // error 2 

       pdfReader.Close(); 
       pdfStamper.Close(); 
      } 
     } 
    } 
} 

ответ

2

Изменение ниже линии:

Dictionary<string,string> newInfo = pdfReader.Info;    

вместо

Hashtable newInfo = pdfReader.Info; 

Если исправить обе ошибки.

Причина, по которой это происходит, заключается в том, что вы пытаетесь отбросить из Hashtable в общий словарь, и для хеш-таблицы не доступно преобразование типа implicit. посмотрите here, чтобы увидеть разницу между хэш-таблицей и словарем.

+0

Ваш, безусловно, правильный, поэтому я буду голосовать. Я просто хотел добавить, что при открытии новой библиотеки с C# иногда проще использовать ключевое слово 'var' при получении методов вызова и доступа к свойствам. 'var newInfo = pdfReader.Info;' Вы можете определенно злоупотреблять 'var', но для таких вещей это может быть очень полезно. –

+0

Крис, да, но для ясности я предпочел бы использовать полное определение, чтобы избежать путаницы. –

+0

Ahh thankyou, ребята, я для жизни меня не видел, где: pdfReader.Info был определен как словарь, где есть документация для pdfReader.Info? – ChrisAdmin

1

Я полагаю, эта линия

Hashtable newInfo = pdfReader.Info; 

броски й е ошибки, а затем и это одна:

pdfStamper.MoreInfo = newInfo; 

pdfStamper.MoreInfo, кажется, типа System.Collections.Generic.Dictionary, поэтому все, что вам нужно сделать, это заменить

Hashtable newInfo = pdfReader.Info; 

по

System.Collections.Generic.Dictionary<string,string> newInfo = pdfReader.Info; 

Типы должны соответствовать. Я не могу проверить это, поэтому не знаю, нашел ли я правильные строки, но что-то вроде этого будет работать.

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