Пятница, 27 Февраля 2009 г. 02:38
+ в цитатник
При индексировании архива офисных файлов мне понадобилось извлекать текстовую информацию из различных файлов таких как DOC или PDF.
Решение несложное, достаточно воспользоваться несколькими библиотеками. Для PDF - это
PDFBox, портированный с Java на CSharp. Для DOC - это Microsoft.Office.Interop.Word.dll из набора OfficeAPI. Для удобства, необходимые библиотеки можно скачать одним архивов
по ссылке
Под катом я приведу код, показывающего как с ними работать.
Начнем с PDF, подключим имена:
Copy Source | Copy HTML
using org.pdfbox.pdmodel;//PDF library
using org.pdfbox.util;
После этого документ можно преобразовать в текст 3мя строчками:
Copy Source | Copy HTML
PDDocument pdfFile = PDDocument.load(onefile);
PDFTextStripper stripper = new PDFTextStripper();
String innertext = stripper.getText(pdfFile);
Для DOC больше кода, поэтому я вынес все в отдельный класс, производя конвертирование как innertext = ConvertDoc.GetDocText(onefile);
Copy Source | Copy HTML
using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
/// <summary>
/// объект для операция с Вордовыми документами
/// </summary>
public class ConvertDoc
{
// Объект отвечающий за результат конвертации.
// Ставим .txt - текстовый в досовской кодировке
static ConvConfig tmpItem = new ConvConfig(".txt", WdSaveFormat.wdFormatDOSText);
/// <summary>
/// Получение текста из доковского файла
/// </summary>
/// <param name="file">Ссылка на документ</param>
/// <returns>Текст документа</returns>
public static String GetDocText(String inFileName)
{
String retText = String.Empty;
//создаем объекты для дальнейшей передачи в вордовые функции
object fileName = inFileName;
object fileSaveName = Path.GetTempFileName() + tmpItem.itemExtension; //случайное уникальное имя + .txt;
object vk_read_only = true;
object vk_visible = false;
object vk_true = true;
object vk_false = false;
object vk_dynamic = 2;
object vk_saveformat = tmpItem.itemWord;
object missing = Missing.Value;//все параметры, которые мы пропустим
/////
object vk_range = missing;
object vk_to = missing;
object vk_from = missing;
/////
// создаем класс для работы с вордом
ApplicationClass vk_word_app = new ApplicationClass();
Document aDoc = null;
try
{
// вызываем скрытое открытие документа
aDoc = vk_word_app.Documents.Open(
ref fileName, ref missing,
ref vk_read_only, ref vk_false,
ref missing, ref missing,
ref missing, ref missing,
ref missing, ref missing,
ref missing, ref vk_visible,
ref missing, ref missing,
ref missing);
//Сохраняем в файл в заданном формате
aDoc.SaveAs(ref fileSaveName, ref vk_saveformat,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing);
//корректно закрывает все открытое
if (aDoc != null)
{
aDoc.Close(ref vk_false, ref missing, ref missing);
}
//читаем из временного файла в досовской кодировке и удаляем его
retText = File.ReadAllText(fileSaveName.ToString(), Encoding.GetEncoding(866));
File.Delete(fileSaveName.ToString());
}
catch (Exception err)
{
Debug.WriteLine("Ошибка чтения файла: " + inFileName + " - " + err.Message);
}
finally
{
vk_word_app.Quit(ref vk_false, ref missing, ref missing);
}
return retText;
}
}
/// <summary>
/// Настройки для конвертации
/// </summary>
public class ConvConfig
{
//расширение
public String itemExtension;
//тип объекта на выдаче
public Object itemWord;
//The constructors
public ConvConfig() { }
public ConvConfig(String inExtension, Object inWordType)
{
// This allows us to set the properties
itemExtension = inExtension;
itemWord = inWordType;
}
}
Метки:
code
csharp
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-