- Автор flashr февраля 27, 2009

При индексировании архива офисных файлов мне понадобилось извлекать текстовую информацию из различных файлов таких как 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