En esta sección de Código fuente en Delphi vamos a mostrar cómo podemos extraer el texto sin formato (lo que es un .txt) de un documento ".doc" de MicroSoft Word.
Para ello, he escrito esta pequeña app de ejemplo
Para poder realizar esta tarea tendremos que trabajar con objetos COM (Component Object Model), y para poder hacer esto debemos incluir en la clausula "Uses" la unidad "ComObj"
Dicho esto, en nuestro código tenemos dos funciones:
La tarea de extraer el texto de un documento Word la podemos realizar unicamente si la aplicación MicroSoft Word está instalada en el equipo donde se ejecute nuestra app, es por ello que la función WordFile2Txt lo primero que hace es comprobar que se cumple esta condición, llamando a la función WordInslatado
Los objetos COM se almacenan en Delphi como variables tipo variant, que debemos crear llamando a la función "CreateOleObject('Word.Application');" esta llamada nos devolverá un puntero a un objeto COM que guardamos en una variable tipo variant. Con las propiedades y métodos expuestos por este objeto podremos manipular un documento de Word.
La forma de funcionar de WordFile2txt es la siguiente:
La versión de MicroSoft Word 2016 tiene la capacidad de abrir documentos ".PDF" y transformarlos a documentos Word, si tiene instalada esta versión en el equipo, nuestra aplicación podrá extraer el texto de documentos ".PDF" ademá de poder hacerlo con el resto de tipos de documentos soportados por MicroSoft Word.
En la siguiente imagen puedes ver un ejemplo de uso de esta app.
A continuación, puedes ver el código completo de la app, y si lo deseas puedes descargarlo todo (código y app) en un archivo "zip".
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtDlgs, ExtCtrls; type TForm1 = class(TForm) OpenTextFileDialog1: TOpenTextFileDialog; Memo1: TMemo; Panel1: TPanel; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses ComObj; function WordInstalado: boolean; var WordApp: variant; begin try WordApp := CreateOleObject('Word.Application'); WordApp.Visible := False; WordApp.Quit; result := true; except result := false; end; end; function WordFile2txt(const FileName: string): string; var WordApp: Variant; CharsCount, i: integer; begin result := ''; if not WordInstalado then begin ShowMessage('Es necesario que MicroSoft Word esté instalado para poder realizar esta tarea.'); exit; end; WordApp := CreateOleObject('Word.Application'); try WordApp.Visible := False; WordApp.Documents.open(FileName, false, true); CharsCount := Wordapp.Documents.item(1).Characters.Count; Result := WordApp.Documents.item(1).Range(0, CharsCount).Text; WordApp.documents.item(1).Close; finally WordApp.Quit; end; //La cadena obtenida marca el final de línea con #13 en lugar de #13#10 for i := 1 to length(Result) - 1 do if (Result[i] = #13) and (Result[i + 1] <> #10) then Insert(#10, Result, i + 1); Result := trim(Result); end; procedure TForm1.Button1Click(Sender: TObject); begin if OpenTextFileDialog1.Execute then begin Panel1.Caption:= 'Un momento por favor. Estamos realizamos la conversión...'; Screen.Cursor:= crHourGlass; Button1.Enabled:=false; memo1.Text:=WordFile2Txt(OpenTextFileDialog1.FileName); Button1.Enabled:=true; Screen.Cursor:= crDefault; Panel1.Caption:=ExtractFileName(OpenTextFileDialog1.FileName); end; end; end.