Свойства iTextSharp, использующие HashTable или что-то еще? - PullRequest
0 голосов
/ 23 января 2012

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

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 ]

2 голосов
/ 23 января 2012

Измените следующую строку:

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

вместо

Hashtable newInfo = pdfReader.Info;

Должны исправить обе ошибки.

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

1 голос
/ 23 января 2012

Полагаю, эта строка

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;

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

...