2016-03-19 14 views
0

Bir treenode'dan (en azından bence öyle olduğunu düşünüyorum) veri aktarmaya çalışıyorum. Verileri treenode'da işlemek çok zor olurdu. Veri manipülasyonu için sadece gerekli verileri sağlayan bir diziye sahip olmayı tercih ederim.Bir dizi oluşturma ve ağaç düğümü değişkeni doldu

isterim yüksek oranlar var aşağıdaki değişkenleri: 1. BookmarkNumber (tamsayı) 2. Tarih (string) 3. DocumentType (string) 4. BookmarkPageNumberString (string) 5. BookmarkPageNumberInteger (tamsayı)

Değişken book_mark verilerinden (kodumdan da görülebileceği gibi) yukarıda tanımlanan oranı uygulamak istiyorum.

İki gündür bununla güvendim. Herhangi bir yardım çok takdir edilecektir. Muhtemelen sorunun doğru bir şekilde ifade edilmediğinden eminim, bu yüzden lütfen soruları sorun. çok

Teşekkür

BTW ne doğru yer imi tasarruf ederken her imi/bölüm için ayrı PDF dosyalarının içine birden fazla yer işaretini içeren bir PDF dosyası ayrıştırır Windows Form programı oluşturmak olduğunu yapmaya çalışıyorum doğru adlandırma kuralı, ayrıştırılmakta olan yer iminin/bölümün PDF adı ve başlık adına bağlı olan klasör ve adlandırma kurallarına sahip klasör.

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); 
     } 
    } 
} 

cevap

0

PDF'yi ayrıştırmanın ve tanımladığınıza benzer bir veri yapısı oluşturmanın bir yolu. İlk veri yapısı:

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); 
    } 
} 

bir yöntem (yukarıda) Bookmark bir listesini oluşturmak için:

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()); 
    } 
} 
: Yukarıdaki böyle

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; 
} 

Çağrı yöntemi bir metin dosyasına sonuçları dökümü

Büyük sorun, her bir Bookmark'un ayrı bir dosyaya nasıl çıkarılacağıdır. Eğer herBookmarkbaşlar yeni bir sayfa çok kolay: ParseBookMarks()

  • dönüş değeri üzerinden

    1. Bıkmadan akım BookMark.Number ile başlayan bir sayfa aralığını seçin ve sonrakiBookMark.Number - 1
    2. ile biter
    3. Ayrı dosyalar oluşturmak için bu sayfa aralığını kullanın. Böyle

    şey:

    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)); 
               } 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
    } 
    

    sorun tüm imleri PDF her sayfasının üst kısmında olacak pek olası olmasıdır. Ne demek istediğimi görmek için, bookmarks[i + 1].PageNumberInteger satırlarını yorumlayarak/uncommenting ile deneyin.