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

Облако тэгов

Мои Твиты

Twitter марта 20, 20:32
⚫️Тематика черного цвета для России http://dlvr.it/R1DKm7 https://twitter.com/f1ashr/status/1108466259765555200/photo/1

Twitter марта 20, 20:32
Автоматическое информирование о выходе новых сезонов http://dlvr.it/R1DKlZ

Twitter марта 20, 20:32
Голосовой набор тэгов http://dlvr.it/R1DKlv

Twitter марта 19, 20:27
Ради дружбы с Индией http://dlvr.it/R18YMd

Twitter марта 19, 20:27
Вконтакте 7 лет http://dlvr.it/R18YKm

Twitter марта 19, 20:27
Разбор фильма Дивергент2 Инсургент http://dlvr.it/R18YLy https://twitter.com/f1ashr/status/1108102729656762369/photo/1

Twitter марта 15, 12:51
Фильтр по стране на Ютубе http://dlvr.it/R0tgZq https://twitter.com/f1ashr/status/1106538299487739905/photo/1

Twitter марта 14, 12:25
Роскомнадзор и Криптовалюты http://dlvr.it/R0pqG6

Twitter марта 5, 19:59
Россияне встречают рассвет индийской йогой http://dlvr.it/R0DszD https://twitter.com/f1ashr/status/1103022131506425856/photo/1

Twitter февраля 24, 09:53
Что интересного есть в греческом языке? http://dlvr.it/QzZ2dK

Twitter февраля 24, 09:53
Ретро-поезд на угле с надписью СССР http://dlvr.it/QzZ2cT https://twitter.com/f1ashr/status/1099608139756843009/photo/1

Twitter февраля 24, 09:53
Следующий шаг криптовалют http://dlvr.it/QzZ2Y4 https://twitter.com/f1ashr/status/1099608134694256641/photo/1

Twitter февраля 23, 09:49
Рутин тутин Путин http://dlvr.it/QzWBXG

Twitter февраля 23, 09:49
Индия: Чем славится индийская культура? http://dlvr.it/QzWBVK https://twitter.com/f1ashr/status/1099244865022357506/photo/1

Twitter февраля 23, 09:49
Главное изменение в Твиттере http://dlvr.it/QzWBX9

Twitter февраля 12, 09:04
Роскомнадзор достучался до Azure http://dlvr.it/QyjSPS

Twitter февраля 6, 07:58
Про жизнь в Южной Осетии http://dlvr.it/QyHTwx

Twitter февраля 6, 07:58
Хиллари против Трампа в Америке и приход женщин во власть http://dlvr.it/QyHTxG https://twitter.com/f1ashr/status/1093056334906281985/photo/1

Twitter февраля 6, 07:58
Powering Down Google Reader http://dlvr.it/QyHTvM

Twitter февраля 4, 22:48
Разбор сериала Медичи: Повелители Флоренции http://dlvr.it/QyBKWh https://twitter.com/f1ashr/status/1092555544953466880/photo/1

Мой твиттер

Копирайт

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

© Copyright 2008