2016-08-03 1 views
1

Je lis dans un fichier .docx en utilisant l'API Novacode, et je suis incapable de créer ou d'afficher des images dans le fichier à une application WinForm en raison de ne pas être en mesure de convertir à partir d'une image Novacode (image) ou Image vers une image système. J'ai remarqué qu'il y a très peu d'informations dans la photo elle-même, sans aucun moyen d'obtenir des données de pixels que je peux voir. J'ai donc été incapable d'utiliser l'une des idées de conversion habituelles.C# Novacode.Picture à System.Drawing.Image

J'ai aussi levé les yeux comment enregistre des images de mots dans les fichiers ainsi que la source Novacode pour des conseils et je suis venu avec rien.

Ma question est alors il un moyen de convertir une image Novacode à un système, ou devrais-je utiliser quelque chose de différent pour recueillir les données d'image comme OpenXML? Si oui, Novacode et OpenXML sont-ils en conflit?

Il y a aussi this answer qui pourrait être un autre endroit pour commencer.

Toute aide est très appréciée.

+0

Je ne sais rien à propos de novacode, mais peut-être comme une autre idée, vous pouvez extraire l'image d'une autre manière? c'est-à-dire que si vous deviez remplacer une extension .docx par une extension .docx.zip, puis ouvrir un fichier zip, vous pouvez naviguer vers/word/media et trouver les images ici. – gattsbr

+0

Lorsque je fais cela, il répertorie toutes les images avec des noms génériques comme "image1.png" et ainsi de suite. Identique à Novacode. J'ai regardé à l'intérieur du fichier .docx pour voir si je pouvais nommer manuellement les images mais je n'ai rien trouvé. Y a-t-il un tag dans le fichier .pngs qui conserve le nom du fichier d'origine? – DCOPTimDowd

+0

Je suppose que je les passe en revue dans l'ordre, donc cela pourrait fonctionner tant qu'ils sont effectivement nommés ainsi. Cela semble toujours être une façon très détournée de faire les choses. – DCOPTimDowd

Répondre

1

D'accord. C'est ce que j'ai fini par faire. Merci à gattsbr pour le conseil. Cela ne fonctionne que si vous pouvez saisir toutes les images dans l'ordre, et avoir des noms décroissants pour toutes les images.

using System.IO.Compression; // Had to add an assembly for this 
using Novacode; 

// Have to specify to remove ambiguous error from Novacode 
Dictionary<string, System.Drawing.Image> images = new Dictionary<string, System.Drawing.Image>(); 

void LoadTree() 
{ 
    // In case of previous exception 
    if(File.Exists("Images.zip")) { File.Delete("Images.zip"); } 

    // Allow the file to be open while parsing 
    using(FileStream stream = File.Open("Images.docx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     using(DocX doc = DocX.Load(stream)) 
     { 
      // Work rest of document 

      // Still parse here to get the names of the images 
      // Might have to drag and drop images into the file, rather than insert through Word 
      foreach(Picture pic in doc.Pictures) 
      { 
       string name = pic.Description; 

       if(null == name) { continue; } 

       name = name.Substring(name.LastIndexOf("\\") + 1); 
       name = name.Substring(0, name.Length - 4); 

       images[name] = null; 
      } 

      // Save while still open 
      doc.SaveAs("Images.zip"); 
     } 
    } 

    // Use temp zip directory to extract images 
    using(ZipArchive zip = ZipFile.OpenRead("Images.zip")) 
    { 
     // Gather all image names, in order 
     // They're retrieved from the bottom up, so reverse 
     string[] keys = images.Keys.OrderByDescending(o => o).Reverse().ToArray(); 

     for(int i = 1; ; i++) 
     { 
      // Also had to add an assembly for ZipArchiveEntry 
      ZipArchiveEntry entry = zip.GetEntry(String.Format("word/media/image{0}.png", i)); 

      if(null == entry) { break; } 

      Stream stream = entry.Open(); 

      images[keys[i - 1]] = new Bitmap(stream); 
     } 
    } 

    // Remove temp directory 
    File.Delete("Images.zip"); 
}