2016-12-11 3 views
0

Ich muss sicherstellen, dass die vom Benutzer angegebene Datei in die TXT-Datei konvertiert wird, wenn Text vor jeder weiteren Verarbeitung enthält.Generisch jedes Dateiformat lesen und in .txt-Format konvertieren

Im Moment habe ich eine switch-Anweisung, die nach den spezifischen Formaten sucht und von diesen in das .txt-Format konvertiert.

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

Das Problem ist, dass ich etwas allgemeinere bräuchten zu überprüfen, ob die angegebene Datei .txt ist oder wenn es nicht ist, sondern umgewandelt werden könnte, dies zu tun.

+0

nicht so einfach ... für pdf Sie könnte ITextSharp-Bibliothek verwenden, für doc müssen Sie entweder die MS Office-Interop-Bibliothek oder für neuere docx-Dateien die OpenXmlSDK-Bibliothek verwenden –

+0

@MichalHainc Ich hatte Angst, es würde nicht eine einfache Sache zu tun sein. –

+0

Hier gehts mit pdf und itextsharp http://stackoverflow.com/questions/12953965/how-to-convert-pdf-to-text-file-in-itextsharp –

Antwort

3

Nach LBS Ratschlag werde ich this reinkarnieren.

Mit der Tika Java-Bibliothek in Ihrer Net Application Mit IKVM

Das klingt beängstigend und ketzerisch, aber wussten Sie, es möglich ist, Java-Bibliotheken von .NET-Anwendungen ohne TCP-Sockets oder Web-Service zu nutzen, erwischt zu werden im Kreuzfeuer? Lassen Sie mich Ihnen das IKVM vorstellen, das offen gesagt magisch ist:

IKVM.NET ist eine Implementierung von Java für Mono und das Microsoft .NET Framework. Es umfasst die folgenden Komponenten:

  • Eine Java Virtual Machine in .NET implementiert
  • Eine .NET-Implementierung der Java-Klassenbibliotheken
  • Tools, die Java- und .NET-Interoperabilität

Verwendung ermöglichen IKVM ist es gelungen, unsere Suchanwendung Dovetail Seeker erfolgreich mit der in Java implementierten Tika-Textextraktions-Bibliothek zu integrieren. Mit Tika können wir Text aus reichen Dokumenten aus vielen unterstützten Formaten herausziehen. Warum Tika? Weil es in der .NET-Welt nichts Vergleichbares wie Tika gibt.

In diesem Beitrag erfahren Sie, wie wir Tika integriert haben. Wenn Sie Code mögen, können Sie this example in einem Repo auf Github finden.

ein Glas in eine

Das erste, was Assembly kompilieren, müssen wir unsere Hände auf die neueste Version von Tika zu bekommen. Ich habe das Tika source using Maven as instructed heruntergeladen und gebaut. Das Ergebnis waren ein paar JAR-Dateien. Der, an dem wir interessiert sind, ist tika-app-x.x.jar, der alles, was wir brauchen, in einen nützlichen Container gebündelt hat.

Als nächstes müssen wir dieses Glas, das wir gebaut haben, in eine .Net-Baugruppe konvertieren. Tun Sie dies mit ikvmc.exe.

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

Leider werden Sie Tonnen mühsam suchen Warnungen sehen, aber das Endergebnis ist eine .NET-Assembly die Java jar Einwickeln, die Sie in Ihren Projekten verweisen können.

Mit Tika Von .Net

IKVM ist ziemlich transparent. Sie verweisen einfach auf die Tika-App-Assembly und Ihr .Net-Code spricht mit Java-Typen. Es ist ein bisschen seltsam auf den ersten, da Sie Java-Versionen von Typen und .NET-Versionen haben. Als Nächstes sollten Sie sicherstellen, dass alle abhängigen IKVM-Laufzeitassemblys in Ihrem Projekt enthalten sind.Verwenden von Reflector Ich habe festgestellt, dass die Tika-App-Assembly viele IKVM-Assemblies referenziert, die scheinbar nicht verwendet werden. Ich musste durch Versuch und Irrtum herausfinden, welche Versammlungen von den reichen Dokumentenextraktionen nicht berührt wurden. Bei Bedarf können Sie alle referenzierten IKVM-Assemblies einfach in Ihre Anwendung einbinden. Im Folgenden habe ich die Arbeit für Sie erledigt und alle Referenzen auf alle IKVM-Assemblies, die scheinbar im Spiel sind, eliminiert.

enter image description here

16 Baugruppen bis 5. viel kleiner Entfaltungs A.

Tika Mit

Um einen Text-Extraktion tun wir Tika fragen werden, sehr schön, um die Dateien zu analysieren wir an ihm werfen. Für meine Zwecke musste Tika automatisch bestimmen, wie der Stream analysiert und der Text und die Metadaten über das Dokument extrahiert werden.

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

Ein wichtiger Cavet

Java hat ein Konzept, einen Classloader genannt, die etwas mit dem zu tun hat, wie Java-Typen gefunden und geladen. Es gibt wahrscheinlich einen besseren Weg, aber aus irgendeinem Grund, wenn Sie keinen benutzerdefinierten ClassLoader implementieren und auch eine Anwendungseinstellung festlegen, die die IKVM-Laufzeit angibt, über welchen .Net-Typ der ClassLoader verwendet werden soll.

Hier ist ein Beispiel app.config, das IKVM sagt, wo der ClassLoader gefunden wird.

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

Dieser Schritt ist sehr wichtig. Wenn IKVM aus einem schrecklichen Grund keinen Klassenlader findet, funktioniert Tika gut, extrahiert aber nur leere Dokumente ohne Metadaten. Der Hauptgrund dafür ist, dass keine Ausnahme gemacht wird. Aus diesem Grund haben wir in unserer Anwendung einen Validierungsschritt, der sicherstellt, dass die App-Einstellung vorhanden ist und in einen gültigen Typ aufgelöst wird.

Demo

Dies ist ein Test eine Extraktion und das Ergebnis zeigt.

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

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

Console.WriteLine(textExtractionResult); 
} 

Einfach gesagt reiche Dokumente wie diese in gehen

enter image description here

Und ein TextExtractionResult kommt.

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

Hier ist die Rohausgangssignal von Tika ist:

enter image description here

Fazit

Ich hoffe, das Ihr Vertrauen steigern hilft, die Sie Java-Bibliotheken in Ihrem .NET-Code verwenden können, und ich hoffe, dass meine example repo hilfreich sein, wenn Sie einige Arbeit mit Tika auf der Notwendigkeit zu tun. Netzplattform. Genießen.


Info dies einzurichten:

Verwenden Nuget TikaOnDotnet nachzuschlagen und installieren beide TikaOnDotnet & TikaOnDotnet.TextExtractor zu Ihrem Projekt. Hier ist der Code, es zu testen, auf einem 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: Die ursprüngliche Blog-Seite wird verschoben, aber es gibt keine 302 zul umleiten http://clarify.dovetailsoftware.com/kmiller/2010/07/02/using-the-tika-java-library-in-your-net-application-with-ikvm/

+1

Howdy der Blog Post, auf den du dich beziehst, gehört mir. Ich habe Nugets, mit denen man Texte extrahieren kann. Kasse TikaOnDotnet. https://kevm.github.io/tikaondotnet/ – KevM

+0

Vielen Dank @KevM –

Verwandte Themen