2017-02-06 2 views
0

私は正常にこのようなコードを使用してPDFポートフォリオのファイルの内容を抽出しています: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); 
        } 
       } 
      } 
     } 
    } 
} 

しかし、私は彼らが元に表示しているよりも、これらのコンポーネントのファイルが異なる順序で抽出されていることに気付きましたAdobe Reader XIを使用したPDF。これらのコンポーネントファイルの表示順序は、「インデックス」プロパティで明示的に指定されています。このプロパティは、ファイルモード(レイアウトモードではなく)でPortfolioファイルを表示するように選択し、コンポーネントファイルを右クリックしてコンテキストメニューから[表示]> [インデックス]を選択します。

私の質問:PDFポートフォリオファイルからファイルを抽出する前に、この「インデックス」プロパティを見つけるにはどうすればよいですか?

+0

明らかに私自身の質問でタグを編集することはできません。おそらく誰かが[itext]タグを削除して[itextsharp]タグを追加するのに十分親切でしょうか? – Windy

+0

itextタグとitextsharpタグは、どちらも同じAPIを記述しているため、同義です(Javaで実装されたものとC#で実装されたもの)。 –

+0

@AmedeeVanGasse私は理解していますが、私のコードスニペットはC#であり、実際には.NET解決策を探しています。私はitextsharpが将来のサーチャーにとってより適切なタグであると考えました。もちろん、Java/iTextのソリューションも見たいと思っています! – Windy

答えて

0

"インデックス"プロパティは、ポートフォリオがソートされた実際のメタデータである場合とそうでない場合があります。ポートフォリオは、非表示のものも含めて任意の数のコレクションフィールドでソートできます。実際のソート順を確認するには、「ソート」辞書を「カタログ」内の「コレクション」辞書から取得する必要があります。いったんこれを取得すると、各添付ファイルの "CI"(コレクション情報)ディクショナリに基づいてファイルをソートできます。

私はあなたの方法でいくつかのコードをスローしたいと思いますが、私はiTextを使用しません。シャープまたはそれ以外。

関連する問題