Как сохранить свойство .MoreInfo PDF-файла с помощью iTextSharp? - PullRequest
1 голос
/ 16 апреля 2011

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

    public class PdfEnricher
{
    readonly IFileSystem fileSystem;

    public PdfEnricher(IFileSystem fileSystem)
    {
        this.fileSystem = fileSystem;
    }

    public void Enrich(string pdfFile, Hashtable fields)
    {
        if (!fileSystem.FileExists(pdfFile)) return;

        var newFile = GetNewFileName(pdfFile);
        var stamper = GetStamper(pdfFile, newFile);

        SetFieldsAndClose(stamper, fields);
    }

    string GetNewFileName(string pdfFile)
    {
        return fileSystem.GetDirectoryName(pdfFile) + @"\NewFileName.pdf";
    }

    static void SetFieldsAndClose(PdfStamper stamper, Hashtable fields)
    {
        stamper.MoreInfo = fields;
        stamper.FormFlattening = true;
        stamper.Close();
    }

    static PdfStamper GetStamper(string pdfFile, string newFile)
    {
        var reader = new PdfReader(pdfFile);
        return new PdfStamper(reader, new FileStream(newFile, FileMode.Create));
    }
}

Есть идеи?

1 Ответ

1 голос
/ 16 апреля 2011

Как всегда, используйте источник.

  • В этом случае я увидел возможность довольно быстро (кстати, источник Java):

    public void close() throws DocumentException, IOException {
      if (!hasSignature) {
        stamper.close( moreInfo );
        return;
      }

Есть ли в этой форме какие-либо подписи?Давайте посмотрим, когда hasSignatures будет истинным.

Этого не может быть с вашим источником.hasSignatures устанавливается только тогда, когда вы подписываете PDF через PdfStamper.createSignature (...), так что это явно не так.?Это не будет в метаданных XMP.MoreInfo добавляется непосредственно в словарь Doc Info.Вы видите их на вкладке «Пользовательские» Acrobat (и, скорее всего, Reader, хотя в данный момент мне это не удобно).

Вы абсолютно уверены, что MoreInfo неNULL, и все его значения не являются NULL?

Словарь просто передается по ссылке, поэтому любые изменения (в другом потоке) будут отражены в PDF, как он был написан.


Правильный способ итерации по «информационному словарю документа»:

PdfReader reader = new PdfReader(somePath);
Map<String, String> info = reader.getInfo();

for (String key : info.keySet()) {
  System.out.println( key + ": " + info.get(key) );
}

Обратите внимание, что при этом будут проходить все поля всловарь информации о документе, а не только пользовательские.Также имейте в виду, что изменения, внесенные Map из getInfo(), будут не перенесены в PDF.Карта обновлена, заполнена и возвращена.

...