PDF / DOC to TXT

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

Метки:   Категории:Csharp | Code


blog comments powered by Disqus

Добавить комментарий

Кто я?

Программист. Я слежу за блогосферой и знаю, как будет развиваться интернет. Когда у меня есть время я даже прилагаю для этого усилия. Подробнее

Последние комментарии

Не отображать

Topbot at FeedsBurner

Облако тэгов

Мои Твиты

Копирайт

Все мысли, высказанные в блоге, являются моим мнением и за это мнение меня никто не забанит! Кроме того, никто не имеет право копировать материалы блога без использования ctrl+C/V!

© Copyright 2008