C# 一般读取任何文件格式并将其转换为.txt格式
在进一步处理之前,我需要确保用户提供的文件已转换为.txt文件(如果包含文本) 目前,我有一个switch语句检查特定的格式,并将其转换为.txt格式C# 一般读取任何文件格式并将其转换为.txt格式,c#,file,text,ikvm,C#,File,Text,Ikvm,在进一步处理之前,我需要确保用户提供的文件已转换为.txt文件(如果包含文本) 目前,我有一个switch语句检查特定的格式,并将其转换为.txt格式 switch (extension) { case ".pdf": //Convert from .pdf to .txt file break; case ".doc": //Convert from .doc to .txt file break; def
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,或者是否不是但可以转换的文件 遵照L.B.的建议,我将转世 在带有IKVM的.Net应用程序中使用Tika Java库 这听起来可能很吓人,也很离经叛道,但您知道吗,在没有TCP套接字或web服务的情况下,从.Net应用程序中利用Java库是可能的?让我向您介绍IKVM,它确实很神奇: IKVM.NET是Java for Mono和Microsoft.NET框架的一个实现。它包括以下组件:
- 在.NET中实现的Java虚拟机
- Java类库的.NET实现
- 支持Java和.NET互操作性的工具
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);
}
}
一个重要的问题
Java有一个称为类加载器的概念,它与Java类型的查找和加载方式有关。可能有更好的方法解决这个问题,但出于某种原因,如果您不实现自定义类加载器,并且还设置了一个应用程序设置,提示IKVM运行时使用哪个.Net类型作为类加载器
public class MySystemClassLoader : ClassLoader
{
public MySystemClassLoader(ClassLoader parent)
: base(new AppDomainAssemblyClassLoader(typeof(MySystemClassLoader).Assembly))
{
}
}
下面是一个示例app.config,告诉IKVM类加载器的位置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ikvm:java.system.class.loader" value="TikaOnDotNet.MySystemClassLoader, TikaOnDotNet" />
</appSettings>
</configuration>
简单地说,像这样的富文档就可以进入了
一个TextExtractionResult出来了:
public class TextExtractionResult
{
public string Text { get; set; }
public string ContentType { get; set; }
public IDictionary<string, string> Metadata { get; set; }
//toString() override
}
编辑:原始博客页面已移动到,但没有302 perm重定向遵循L.B的建议,我将转世 在带有IKVM的.Net应用程序中使用Tika Java库 这听起来可能很吓人,也很离经叛道,但您知道吗,在没有TCP套接字或web服务的情况下,从.Net应用程序中利用Java库是可能的?让我向您介绍IKVM,它确实很神奇: IKVM.NET是Java for Mono和Microsoft.NET框架的一个实现。它包括以下组件:
- 在.NET中实现的Java虚拟机
- Java类库的.NET实现
- 支持Java和.NET互操作性的工具
[Test]
public void should_extract_from_pdf()
{
var textExtractionResult = new TextExtractor().Extract("Tika.pdf");
textExtractionResult.Text.ShouldContain("pack of pickled almonds");
Console.WriteLine(textExtractionResult);
}
public class TextExtractionResult
{
public string Text { get; set; }
public string ContentType { get; set; }
public IDictionary<string, string> Metadata { get; set; }
//toString() override
}
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;
}
}
}