2016-12-11 3 views
0

Je dois m'assurer que le fichier donné par l'utilisateur est converti en fichier .txt s'il contient du texte, avant tout autre traitement.Générallement lire n'importe quel format de fichier et le convertir au format .txt

Pour le moment, j'ai une instruction switch vérifiant les formats spécifiques et passant de ceux-ci au format .txt.

switch (extension) 
{ 
    case ".pdf": 
     //Convert from .pdf to .txt file 
     break; 
    case ".doc": 
     //Convert from .doc to .txt file 
     break; 
    default: 
     Console.WriteLine("The file could not be converted!"); 
     break; 
} 

Le problème est, je besoin de quelque chose plus générique pour vérifier si le fichier est donné .txt ou si ce n'est pas, mais pourrait être converti, de le faire.

+0

pas facile ... pour pdf vous pourrait utiliser la bibliothèque ITextSharp, pour doc, vous devrez utiliser la librairie interop Microsoft Office ou pour les nouveaux fichiers docx la librairie OpenXmlSDK –

+0

@MichalHainc J'avais peur que ce ne soit pas une chose facile à faire. –

+0

Ici vous allez avec pdf et itextsharp http://stackoverflow.com/questions/12953965/how-to-convert-pdf-to-text-file-in-itextsharp –

Répondre

3

En suivant les conseils de L.B je vais me réincarner this.

Utilisation de la Tika Java Library dans votre application .Net avec IKVM

Cela peut sembler effrayant et hérétique, mais saviez-vous qu'il est possible de tirer parti des bibliothèques Java à partir d'applications .Net sans sockets TCP ou les services Web se faire prendre dans le feu croisé? Permettez-moi de vous présenter IKVM, qui est franchement magique:

IKVM.NET est une implémentation de Java pour Mono et Microsoft .NET Framework. Il comprend les éléments suivants:

  • Une machine virtuelle Java mis en œuvre dans .NET
  • Une implémentation .NET des bibliothèques de classes Java
  • Outils qui permettent Java et l'interopérabilité .NET

aide IKVM nous avons réussi à intégrer notre application de recherche Dovetail Seeker à la bibliothèque d'extraction de texte Tika implémentée en Java. Avec Tika, nous pouvons facilement extraire du texte des documents riches de nombreux formats pris en charge. Pourquoi Tika? Parce qu'il n'y a rien de comparable dans le monde .Net que Tika.

Ce billet examinera comment nous avons intégré Tika. Si vous aimez le code, vous pouvez trouver this example dans un repo sur Github.

un pot Compiler dans une Assemblée

chose d'abord, nous devons mettre la main sur la dernière version de Tika. J'ai téléchargé et construit le Tika source using Maven as instructed. Le résultat de ceci était quelques fichiers jar. Celui qui nous intéresse est tika-app-x.x.jar qui contient tout ce dont nous avons besoin dans un conteneur utile.

Ensuite, nous devons convertir ce pot que nous avons construit en un assemblage .Net. Pour ce faire, utilisez ikvmc.exe.

tika\build>ikvmc.exe -target:library tika-app-0.7.jar 

Malheureusement, vous verrez des tonnes de mises en garde à la recherche gênants, mais le résultat final est un assemblage .Net enveloppant le pot Java que vous pouvez référencer dans vos projets.

En utilisant Tika De .Net

IKVM est assez transparent. Vous faites simplement référence à l'ensemble de l'application Tika et votre code .Net parle aux types Java. C'est un peu bizarre au début car vous avez des versions Java de types et de versions .Net. Ensuite, vous devez vous assurer que tous les assemblys d'exécution IKVM dépendants sont inclus avec votre projet.À l'aide de Reflector, j'ai trouvé que l'assemblage de l'application Tika faisait référence à de nombreux assemblages IKVM qui ne semblaient pas être utilisés. J'ai dû déterminer par essais et erreurs quelles assemblées n'étaient pas touchées par les riches extractions de documents en cours. Si besoin est, vous pouvez simplement inclure tous les assemblages IKVM référencés avec votre application. Ci-dessous, j'ai fait le travail pour vous et j'ai éliminé toutes les références à tous les assemblages IKVM qui semblent être en jeu.

enter image description here

16 assemblées vers le bas à 5. Un déploiement beaucoup plus petit.

En utilisant Tika

Pour faire une extraction de texte que nous allons demander à Tika, très bien, pour analyser les fichiers que nous jeter. Pour mes besoins, cela impliquait que Tika détermine automatiquement comment analyser le flux et extraire le texte et les métadonnées du document.

public TextExtractionResult Extract(string filePath) 
{ 
var parser = new AutoDetectParser(); 
var metadata = new Metadata(); 
var parseContext = new ParseContext(); 
java.lang.Class parserClass = parser.GetType(); 
parseContext.set(parserClass, parser); 

try 
{ 
var file = new File(filePath); 
var url = file.toURI().toURL(); 
using (var inputStream = MetadataHelper.getInputStream(url, metadata)) 
{ 
parser.parse(inputStream, getTransformerHandler(), metadata, parseContext); 
inputStream.close(); 
} 

return assembleExtractionResult(_outputWriter.toString(), metadata); 
} 
catch (Exception ex) 
{ 
throw new ApplicationException("Extraction of text from the file '{0}' failed.".ToFormat(filePath), ex); 
} 
} 

importante Cavet

Java a un concept appelé ClassLoader qui a quelque chose à voir avec la façon dont les types Java sont trouvés et chargés. Il existe probablement un meilleur moyen de contourner ce problème, mais pour une raison quelconque, si vous n'implémentez pas un ClassLoader personnalisé et que vous définissez également un paramètre d'application indiquant l'exécution IKVM sur le type .Net à utiliser comme ClassLoader.

public class MySystemClassLoader : ClassLoader 
{ 
public MySystemClassLoader(ClassLoader parent) 
: base(new AppDomainAssemblyClassLoader(typeof(MySystemClassLoader).Assembly)) 
{ 
} 
} 

Voici un exemple App.Config dire IKVM où se trouve le ClassLoader.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<appSettings> 
<add key="ikvm:java.system.class.loader" value="TikaOnDotNet.MySystemClassLoader, TikaOnDotNet" /> 
</appSettings> 
</configuration> 

Cette étape est très importante. Si IKVM ne trouve pas de chargeur de classe, pour une raison horrible, Tika fonctionnera correctement mais extraira uniquement les documents vides sans métadonnées. La principale raison pour laquelle cela est troublant est qu'aucune exception n'est soulevée. Pour cette raison, nous avons une étape de validation dans notre application, garantissant que le paramètre de l'application est présent et qu'il est résolu en un type valide.

Demo

Voici un test qui démontre une extraction et le résultat.

[Test] 
public void should_extract_from_pdf() 
{ 
var textExtractionResult = new TextExtractor().Extract("Tika.pdf"); 

textExtractionResult.Text.ShouldContain("pack of pickled almonds"); 

Console.WriteLine(textExtractionResult); 
} 

Mettez simplement riches documents comme celui-ci aller

enter image description here

Et un TextExtractionResult sort.

public class TextExtractionResult 
{ 
public string Text { get; set; } 
public string ContentType { get; set; } 
public IDictionary<string, string> Metadata { get; set; } 
//toString() override 
} 

est ici la sortie brute de Tika:

enter image description here

Conclusion

J'espère que cela aide à augmenter votre confiance que vous pouvez utiliser les bibliothèques Java dans votre code .Net et j'espère que mon example repo sera utile si vous avez besoin de faire un travail avec Tika sur la. Plate-forme nette. Prendre plaisir.


Infos pour le mettre en place:

Utilisez Nuget pour rechercher TikaOnDotnet et installer à la fois TikaOnDotnet & TikaOnDotnet.TextExtractor à votre projet. Voici le code pour le tester sur une Winform App:

public partial class Form1 : Form 
{ 
    private System.Windows.Forms.TextBox textBox1; 
    private TextExtractor _textExtractor; 
    public Form1() 
    { 
     InitializeComponent(); 
     _textExtractor = new TextExtractor(); 

     textBox1 = new System.Windows.Forms.TextBox(); 
     textBox1.Dock = System.Windows.Forms.DockStyle.Fill; 
     textBox1.Multiline = true; 
     textBox1.Name = "textBox1"; 
     textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; 
     textBox1.AllowDrop = true; 
     textBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.textBox1_DragDrop); 
     textBox1.DragOver += new System.Windows.Forms.DragEventHandler(this.textBox1_DragOver); 
     Controls.Add(this.textBox1); 
     Name = "Drag/Drop any file on to the TextBox"; 
     ClientSize = new System.Drawing.Size(867, 523); 
    } 

    private void textBox1_DragOver(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
      e.Effect = DragDropEffects.Copy; 
     else 
      e.Effect = DragDropEffects.None; 
    } 

    private void textBox1_DragDrop(object sender, DragEventArgs e) 
    { 
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
     if (files != null && files.Length != 0) 
     { 
      TextExtractionResult textExtractionResult = _textExtractor.Extract(files[0]); 
      textBox1.Text = textExtractionResult.Text; 
     } 
    } 
} 

Edit: La page de blog d'origine a déménagé, mais il n'y a pas 302 perm redirigent http://clarify.dovetailsoftware.com/kmiller/2010/07/02/using-the-tika-java-library-in-your-net-application-with-ikvm/

+1

Howdy le blog le message que vous faites référence est le mien. J'ai des Nugets que vous pouvez utiliser pour faire de l'extraction de texte. Commander TikaOnDotnet. https://kevm.github.io/tikaondotnet/ – KevM

+0

Grand merci @KevM –