2017-02-06 8 views
0

Я успешно извлекая содержимое файла PDF Portfolio, используя код, подобный этому:Порядок встраиваемых файлов в файл портфолио PDF?

internal void ExtractAttachments(string file_name, string folderName) { 
    PdfDictionary documentNames = null; 
    PdfDictionary embeddedFiles = null; 
    PdfDictionary fileArray = null; 
    PdfDictionary file = null; 
    PRStream stream = null; 

    using (PdfReader reader = new PdfReader(file_name)) { 
     PdfDictionary catalog = reader.Catalog; 

     documentNames = (PdfDictionary)PdfReader.GetPdfObject(catalog.Get(PdfName.NAMES)); 

     if (documentNames != null) { 
      embeddedFiles = (PdfDictionary)PdfReader.GetPdfObject(documentNames.Get(PdfName.EMBEDDEDFILES)); 
      if (embeddedFiles != null) { 
       PdfArray filespecs = embeddedFiles.GetAsArray(PdfName.NAMES); 

       for (int i = 0; i < filespecs.Size; i++) { 
        i++; 
        fileArray = filespecs.GetAsDict(i); 
        file = fileArray.GetAsDict(PdfName.EF); 

        foreach (PdfName key in file.Keys) { 
         stream = (PRStream)PdfReader.GetPdfObject(file.GetAsIndirectObject(key)); 
         string attachedFileName = fileArray.GetAsString(key).ToString(); 
         byte[] attachedFileBytes = PdfReader.GetStreamBytes(stream); 

         System.IO.File.WriteAllBytes(Path.Combine(folderName, attachedFileName), attachedFileBytes); 
        } 
       } 
      } 
     } 
    } 
} 

Однако я заметил, что эти файлы компонентов извлекаются в порядке, иначе, чем они отображаются в оригинале PDF с использованием Adobe Reader XI. Порядок отображения этих файлов компонентов, по-видимому, представлен в свойстве «Index», который вы можете показать в пользовательском интерфейсе Reader, выбрав для просмотра файла Portfolio в режиме «Файлы» (в отличие от режима макета), щелкнув правой кнопкой мыши любой файл компонента и выбрав «Просмотр»> «Индекс» в контекстном меню.

Мой вопрос: как я могу найти это свойство «index» перед извлечением файлов из файла портфолио PDF?

+0

По-видимому, я не могу редактировать теги по моему собственному вопросу; возможно, кто-то будет достаточно любезен, чтобы удалить тег [itext] и добавить тег [itextsharp]? – Windy

+0

Теги itext и itextsharp являются синонимами, потому что оба они описывают точно тот же API, один реализованный на Java, а другой в C#. –

+0

@AmedeeVanGasse Я понимаю это, но я понял, что, поскольку мой фрагмент кода - это C#, и я действительно ищу .NET-решение, я решил, что itextsharp будет более подходящим тегом для будущих поисковиков. Мне бы очень хотелось увидеть решения Java/iText! – Windy

ответ

0

Свойство «Index» может быть или не быть фактическим фрагментом метаданных, которые сортируются по портфолио. Портфели можно сортировать по любому числу полей коллекции, включая скрытые. Чтобы найти фактический порядок сортировки, вам нужно получить словарь «Сортировка» из словаря «Коллекция» в «Каталоге». После этого вы можете сортировать файлы на основе словаря «CI» (Collection Info) в каждом из вложений.

Я бы выбрал какой-то код, но я не использую iText ... Sharp или иначе.