2016-03-19 16 views
0

私は必要以上に多くのデータを含むツリーノートからデータを転送しようとしています(少なくともそれはそうだと思います)。 treenode内のデータを操作するのは非常に困難です。私はむしろ、データ操作に必要なデータだけを提供する配列を持っています。ツリーノード変数から配列と塗りつぶしを作成する方法

私は希望より高いレート持って次の変数: 1. BookmarkNumber(整数) 2日(文字列) 3のDocumentType(文字列) 4. BookmarkPageNumberString(文字列) 5. BookmarkPageNumberInteger(整数)

私は変数book_markからのデータから上記の定義されたレートを望みます(私のコードに見られるように)。

私はこれを2日間続けています。どんな助けでも大歓迎です。私はおそらく、質問が正しく表現されていないと確信していますので、必要に応じてさらに説明できるように質問してください。そんなに

おかげ

ところで、私が正しいでブックマークを保存しながら、それぞれのブックマーク/チャプターのための個別のPDFファイルに複数のブックマークを持っているPDFファイルを解析し、Windowsフォームのプログラムを作成されてやろうとしていますフォルダの名前と命名規則は、解析されているブックマーク/チャプタのPDF名とタイトル名に依存します。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO; 
using itextsharp.pdfa; 
using iTextSharp.awt; 
using iTextSharp.testutils; 
using iTextSharp.text; 
using iTextSharp.xmp; 
using iTextSharp.xtra; 

namespace WindowsFormsApplication1 
{ 


    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void ChooseImageFileWrapper_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
      openFileDialog1.InitialDirectory = GlobalVariables.InitialDirectory; 
      openFileDialog1.Filter = "Pdf Files|*.pdf"; 
      openFileDialog1.RestoreDirectory = true; 
      openFileDialog1.Title = "Image File Wrapper Chooser"; 

      if (openFileDialog1.ShowDialog() == DialogResult.OK) 
      { 
       try 
       { 
        GlobalVariables.ImageFileWrapperPath = openFileDialog1.FileName; 

       } 
       catch (Exception ex) 
       { 
        MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
       } 
      } 
      ImageFileWrapperPath.Text = GlobalVariables.ImageFileWrapperPath; 
     } 

     private void ImageFileWrapperPath_TextChanged(object sender, EventArgs e) 
     { 

     } 


     private void button2_Click(object sender, EventArgs e) 
     { 
      iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(GlobalVariables.ImageFileWrapperPath); 
      IList<Dictionary<string, object>> book_mark = iTextSharp.text.pdf.SimpleBookmark.GetBookmark(pdfReader); 

      List<ImageFileWrapperBookmarks> IFWBookmarks = new List<ImageFileWrapperBookmarks>(); 
      foreach (Dictionary<string, object> bk in book_mark) // bk is a single instance of book_mark 
      { 
       ImageFileWrapperBookmarks.BookmarkNumber = ImageFileWrapperBookmarks.BookmarkNumber + 1; 
       foreach (KeyValuePair<string, object> kvr in bk) // kvr is the key/value in bk 
       { 
        if (kvr.Key == "Kids" || kvr.Key == "kids") 
        { 
         //create recursive program for children 
        } 
        else if (kvr.Key == "Title" || kvr.Key == "title") 
        { 

        } 
        else if (kvr.Key == "Page" || kvr.Key == "page") 
        { 

        } 

       } 
      } 

      MessageBox.Show(GlobalVariables.ImageFileWrapperPath); 
     } 
    } 
} 

答えて

0

ここでは、PDFを解析して、説明したのと同様のデータ構造を作成する方法の1つです。まず、データ構造:(上記)Bookmarkのリストを作成する

public class BookMark 
{ 
    static int _number; 
    public BookMark() { Number = ++_number; } 
    public int Number { get; private set; } 
    public string Title { get; set; } 
    public string PageNumberString { get; set; } 
    public int PageNumberInteger { get; set; } 
    public static void ResetNumber() { _number = 0; } 

    // bookmarks title may have illegal filename character(s) 
    public string GetFileName() 
    { 
     var fileTitle = Regex.Replace(
      Regex.Replace(Title, @"\s+", "-"), 
      @"[^-\w]", "" 
     ); 
     return string.Format("{0:D4}-{1}.pdf", Number, fileTitle); 
    } 
} 

方法:

List<BookMark> ParseBookMarks(IList<Dictionary<string, object>> bookmarks) 
{ 
    int page; 
    var result = new List<BookMark>(); 
    foreach (var bookmark in bookmarks) 
    { 
     // add top-level bookmarks 
     var stringPage = bookmark["Page"].ToString(); 
     if (Int32.TryParse(stringPage.Split()[0], out page)) 
     { 
      result.Add(new BookMark() { 
       Title = bookmark["Title"].ToString(), 
       PageNumberString = stringPage, 
       PageNumberInteger = page 
      }); 
     } 

     // recurse 
     if (bookmark.ContainsKey("Kids")) 
     { 
      var kids = bookmark["Kids"] as IList<Dictionary<string, object>>; 
      if (kids != null && kids.Count > 0) 
      { 
       result.AddRange(ParseBookMarks(kids)); 
      } 
     } 
    } 
    return result; 
} 

結果をテキストファイルにダンプするには、このような上記の呼び出し方法:

void DumpResults(string path) 
{ 
    using (var reader = new PdfReader(path)) 
    { 
     // need this call to parse page numbers 
     reader.ConsolidateNamedDestinations(); 

     var bookmarks = ParseBookMarks(SimpleBookmark.GetBookmark(reader)); 
     var sb = new StringBuilder(); 
     foreach (var bookmark in bookmarks) 
     { 
      sb.AppendLine(string.Format(
       "{0, -4}{1, -100}{2, -25}{3}", 
       bookmark.Number, bookmark.Title, 
       bookmark.PageNumberString, bookmark.PageNumberInteger 
      )); 
     } 
     File.WriteAllText(outputTextFile, sb.ToString()); 
    } 
} 

大きな問題は、それぞれBookmarkを別々のファイルに抽出することです。もしすべてのBookmark開始新しいページそれは簡単です:ParseBookMarks()

  • の戻り値を超える

    1. 反復は、現在のBookMark.Numberで始まるページ範囲を選択し、BookMark.Number - 1
    2. で終わります
    3. このページ範囲を使用して、別々のファイルを作成します。

    このような何か:

    void ProcessPdf(string path) 
    { 
        using (var reader = new PdfReader(path)) 
        { 
         // need this call to parse page numbers 
         reader.ConsolidateNamedDestinations(); 
    
         var bookmarks = ParseBookMarks(SimpleBookmark.GetBookmark(reader)); 
         for (int i = 0; i < bookmarks.Count; ++i) 
         { 
          int page = bookmarks[i].PageNumberInteger; 
          int nextPage = i + 1 < bookmarks.Count 
           // if not top of page will be missing content 
           ? bookmarks[i + 1].PageNumberInteger - 1 
    
           /* alternative is to potentially add redundant content: 
           ? bookmarks[i + 1].PageNumberInteger 
           */ 
    
           : reader.NumberOfPages; 
          string range = string.Format("{0}-{1}", page, nextPage); 
    
          // DEMO! 
          if (i < 10) 
          { 
           var outputPath = Path.Combine(OUTPUT_DIR, bookmarks[i].GetFileName()); 
           using (var readerCopy = new PdfReader(reader)) 
           { 
            var number = bookmarks[i].Number; 
            readerCopy.SelectPages(range); 
            using (FileStream stream = new FileStream(outputPath, FileMode.Create)) 
            { 
             using (var document = new Document()) 
             { 
              using (var copy = new PdfCopy(document, stream)) 
              { 
               document.Open(); 
               int n = readerCopy.NumberOfPages; 
               for (int j = 0; j < n;) 
               { 
                copy.AddPage(copy.GetImportedPage(readerCopy, ++j)); 
               } 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
    } 
    

    問題は、それがすべてのブックマークは、PDFの各ページの上部にあることを行っている可能性は極めて低いということです。私が何を意味するか見るには、bookmarks[i + 1].PageNumberInteger行のコメントをつけて/コメントを外してみてください。

  • 関連する問題