2016-12-11 8 views
0

추가 처리 전에 텍스트가 포함되어 있으면 사용자가 지정한 파일이 .txt 파일로 변환되었는지 확인해야합니다.일반적으로 파일 형식을 읽고 .txt 형식으로 변환하십시오.

현재 특정 형식을 확인하고 그 형식을 .txt 형식으로 변환하는 switch 문이 있습니다.

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

문제는 내가 지정된 파일이 .txt 또는이 아니지만 변환 할 수 있다면, 그렇게 할 경우 확인하는 더 일반적인 뭔가 필요할 것입니다.

+0

리디렉션하지가있다 당신 ITextSharp 라이브러리를 사용할 수 있습니다. doc의 경우 MS Office interop 라이브러리를 사용하거나 최신 docx 파일의 경우 OpenXmlSDK 라이브러리 –

+0

@MichalHainc이 작업을 수행하기가 쉽지 않을 것 같습니다. –

+0

여기 pdf 및 itextsharp와 함께 http://stackoverflow.com/questions/12953965/how-to-convert-pdf-to-text-file-in-itextsharp –

답변

3

L.B의 조언에 따라 나는 this으로 환생하려고합니다. 이 무서운 이단 들릴 수는 있지만, 당신이 잡힐없는 TCP 소켓 또는 웹 서비스와 닷넷 응용 프로그램에서 자바 라이브러리를 활용할 수 있습니다 알지 못했다

iKVM을 가진 당신의 .NET 응용 프로그램에서 티카 자바 라이브러리 사용

일제 공격? 솔직히 마술 인 IKVM을 소개해 드리겠습니다.

IKVM.NET은 Mono 및 Microsoft .NET Framework 용 Java의 구현입니다. 그것은 다음과 같은 구성 요소가 포함

  • 자바 가상 머신은 .NET에서 구현을
  • 자바 클래스 라이브러리
  • 자바를 사용 도구 및 .NET 상호 운용성

의 .NET 구현이 사용

  • IKVM을 통해 Dovetail Seeker 검색 응용 프로그램을 Java로 구현 된 Tika 텍스트 추출 라이브러리와 성공적으로 통합 할 수있었습니다. Tika를 사용하면 지원되는 많은 형식의 텍스트를 풍부한 문서에서 쉽게 가져올 수 있습니다. 왜 티카? 티카와 .Net 세상에서 비교할만한 것이 없기 때문이다.

    이 게시물은 Tika와 어떻게 통합되었는지 검토 할 것입니다. 코드가 마음에 들면 Github에서 this example을 찾을 수 있습니다. 조립 물

    우선 속으로 항아리를 컴파일

    , 우리는 티카의 최신 버전에 우리의 손을 얻을 필요가있다. 나는 Tika source using Maven as instructed을 다운로드하여 만들었습니다. 그 결과 몇 개의 jar 파일이 생성되었습니다. 우리가 관심을 가지고있는 것은 tika-app-x.x.jar입니다. 우리는 하나의 유용한 컨테이너에 번들링해야하는 모든 것을 가지고 있습니다.

    다음으로 우리가 만든이 jar 파일을 .Net 어셈블리로 변환해야합니다. ikvmc.exe을 사용하여이 작업을 수행하십시오.

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

    불행하게도, 당신은 골칫거리 찾고 경고의 톤을 볼 수 있지만, 최종 결과는 당신이 당신의 프로젝트에서 참조 할 수 있습니다 자바 항아리 포장 닷넷 어셈블리입니다. 닷넷에서

    iKVM을을 티카를 사용

    은 매우 투명합니다. Tika 앱 어셈블리를 참조하기 만하면 .NET 코드가 Java 유형과 통신합니다. Java 버전의 유형과 .Net 버전을 보유하고 있으므로 처음에는 조금 이상합니다. 다음으로 모든 종속 IKVM 런타임 어셈블리가 프로젝트에 포함되어 있는지 확인해야합니다.리플렉터를 사용하여 Tika 앱 어셈블리가 사용 된 것으로 보이지 않는 많은 IKVM 어셈블리를 참조했음을 발견했습니다. 나는 시행되고있는 풍부한 문서 추출에 의해 영향을받지 않는 곳에서 시행 착오를 통해 알아 내야 만했다. 필요한 경우 참조 된 모든 IKVM 어셈블리를 응용 프로그램에 간단하게 포함시킬 수 있습니다. 아래에서 나는 당신을 위해 일해 왔고 모든 IKVM 어셈블리에 대한 모든 언급을 제거했습니다. 5. 더 작은 배포 다운

    enter image description here

    16 어셈블리. 우리는 우리가 그것을 던져 파일을 구문 분석, 매우 친절, 티카를 요청할 것입니다 일부 텍스트를 추출하려면

    티카를 사용

    . 필자의 목적을 위해 Tika가 스트림을 파싱하고 문서에 대한 텍스트와 메타 데이터를 추출하는 방법을 자동으로 결정하도록하는 데 관여합니다.

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

    한 중요 Cavet

    자바는 개념은 자바 유형을 발견하고로드하는 방법을 함께 할 수있는 뭔가가있는 클래스 로더라고 있습니다. 이 문제를 해결할 수있는 더 좋은 방법이 있지만 맞춤형 ClassLoader를 구현하지 않고 ClassLoader로 사용할 .Net 유형에 대한 IKVM 런타임을 큐잉하는 응용 프로그램 설정을 설정하는 경우 어떤 이유로

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

    다음은 IKVM에 ClassLoader가있는 위치를 알려주는 app.config의 예입니다.

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

    이 단계는 매우 중요합니다. IKVM에서 클래스 로더를 찾을 수 없으면 Tika가 제대로 작동하지만 메타 데이터가없는 빈 문서 만 추출합니다. 이것이 골치 아픈 주된 이유는 아무 예외도 제기되지 않는다는 것입니다. 이러한 이유로 우리는 실제로 응용 프로그램 설정이 존재하고 유효한 유형으로 확인되도록 응용 프로그램에 유효성 검사 단계를 가지고 있습니다. 여기

    데모 추출하고 그 결과를 설명하는 시험이다. .

    [Test] 
    public void should_extract_from_pdf() 
    { 
    var textExtractionResult = new TextExtractor().Extract("Tika.pdf"); 
    
    textExtractionResult.Text.ShouldContain("pack of pickled almonds"); 
    
    Console.WriteLine(textExtractionResult); 
    } 
    

    enter image description here

    이 갈처럼 간단하게 다양한 문서를 넣고 TextExtractionResult가 나온다 :

    : 여기

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

    는 티카에서 원시 출력 enter image description here

    결론

    나는 이것이 당신이 당신의 닷넷 코드에서 자바 라이브러리를 사용할 수있는 자신감을 향상 도움이되기를 바랍니다 그리고 난 당신이에 티카 몇 가지 작업을 수행해야하는 경우 내 example repo 도움이 될 것입니다 바랍니다. 닷넷 플랫폼. 즐겨.


    정보는이를 설정합니다 :

    사용 Nuget TikaOnDotnet을보고 프로젝트에 모두 TikaOnDotnet & TikaOnDotnet.TextExtractor를 설치합니다. 여기의 WinForm 응용 프로그램에 그것을 테스트하는 코드이다 :

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

    편집 : 원래 블로그 페이지로 이동하지만, PDF의 ... 더 (302) 파마가 쉽지 않다 http://clarify.dovetailsoftware.com/kmiller/2010/07/02/using-the-tika-java-library-in-your-net-application-with-ikvm/

  • +1

    블로그보기 Howdy the blog 참조하는 게시물은 내 것입니다. 나는 텍스트 추출을 할 수있는 너겟을 가지고 있습니다. TikaOnDotnet을 확인하십시오. https://kevm.github.io/tikaondotnet/ – KevM

    +0

    큰 감사 @KevM –