Desenvolvimento - C#

Convertendo imagens para texto em .docx utilizando Office 2007 OCR e Windows Speech Recognition

Este artigo mostra como utilizar a poderosa API de OCR (Optical Character Recognition) do Office 2007 gerando documentos no novo formato de documentos OpenXML e utilizando o Speech Recognition para melhorar a usabilidade da aplicação.

por Daniel Campos



Introdução:

Muitas vezes no dia-a-dia nos deparamos com situações onde temos um documento escaneado e queremos convertê-lo em texto. Muitas scanners provêem aplicações que fazem essas conversões automaticamente no momento em que um documento é escaneado, porém na maioria das vezes  o formato na qual é gerado o documento é um .pdf, .odt, sendo necessário posteriormente utilizar uma segunda aplicação para realizar a conversão desses formatos para  o formato .docx (OpenXML).

O OpenXML por sua vez tornou-se um padrão ISO (IS 29500), e sua adoção cresce a cada dia devido a  seu desempenho. Padrão aberto, 75% menor que o antigo formato, baseado em dois padrões muito utilizados: XML e ZIP.

Para facilitar o trabalho de desenvolvedores, evitar a necessidade de integração com aplicações de terceiros, a Microsoft disponibilizou com o Office 2007 uma API que realiza o trabalho de OCR (Optical Character Recognition). É importante lembrar que a API que trabalharemos é exclusiva do Office 2007 (Office 2003 contém sua própria OCR API). Neste artigo criaremos uma aplicação que utilizará a API de OCR do Office 2007 para gerar documentos OpenXML, em adição utilizaremos a API de Speech Recognition  presente no .NET Framework 3.5 para incrementar a aplicação. A API de Speech Recognition permite que sua aplicação “fale”, veremos mais em breve.

Antes de iniciarmos é necessário que esteja instalado o Office 2007, Visual Studio 2005 ou 2008, .NET Framework 3.5 e o OpenXML SDK 1.0.

Caso não tenha alguns desses pré-requisitos, pode-se fazer o download nos seguintes links:

· Visual Studio 2008: http://www.microsoft.com/express/

· .NET Framework 3.5: http://www.microsoft.com/downloads/details.aspx?FamilyId=333325FD-AE52-4E35-B531-508D977D32A6&displaylang=en

· OpenXML SDK 1.0: http://www.microsoft.com/downloads/details.aspx?FamilyId=AD0B72FB-4A1D-4C52-BDB5-7DD7E816D046&displaylang=en

Utilizando a biblioteca Microsoft Office Document Imaging (MODI)

É necessária que seja instalado juntamente com o Office 2007 a biblioteca Microsoft Office Document Imaging 12.0 Type Library. Por padrão o Office 2007 não instala esse componente, então é necessário que a instalação do Office seja executada, clique no botão “Add or Remove Features”, e certifique-se de que o componente esteja instalado, caso contrário instale-o para correto funcionamento da aplicação.

No Visual Studio, crie um novo projeto do tipo Windows Application e chame-o de OCRSample. Para que possamos utilizar o MODI, devemos adicionar referência a esta biblioteca. No Solution Explorer, selecione Add Reference, seleciona a guia COM, adicione a referência a biblioteca Microsoft Office Document Imaging 12.0 Type Library.

Criaremos então um Objeto MODI:

No construtor da classe, logo após a chamada do método InitializeComponent, instancie o objeto MODI e crie uma Lista genérica que será posteriormente utilizada para armazenar os arquivos que foram pesquisados em um determinado diretório.

Pesquisaremos os arquivos em um diretório utilizando a classe DirectoryInfo. Ela permitirá manipular os arquivos de um diretório. O método GetFiles retorna um array de objetos do tipo FileInfo. Criaremos um método chamado SearchFiles como mostrado a seguir:

Crie o form como mostrado abaixo:

Na propriedade (Name), altere os seguintes nomes:

· Button1 (…) para btn_Path

· Button2 (Search) para btn_Search

· Button3 (Save) para btn_Save

· Button4 (Clear) para btn_Clear

· Button5 (Preview) para btn_Preview

· Button6 (Convert) para btn_Convert

· Button7 (Close) para btn_Close

· textBox1 para txt_SearchPath

· textBox2 para txt_SavePath

· textBox3 para txt_Preview

Na propriedade Multiline da Text Box txt_Preview altere seu valor para True, e a propriedade ScrollBars altere seu valor para Vertical.

Adicione ao Form os seguintes controles:

· openFileDialog

· folderBrowserDialog

· saveFileDialog

Dois cliques no botão btn_Path, o evento será gerado, escreva o seguinte código no evento:

O Path de onde estarão os possíveis arquivos será inserido na Text Box txt_SearchPath.

Dois cliques no botão btn_Search, o evento será gerado, escreva o seguinte código no evento:

Esse evento adicionará ao controle checkedListBox uma lista com os arquivos encontrados no diretório. Para agilizar o processo de filtragem, na propriedade Filter do controle openFileDialog escreva a seguinte sentença: TIFF files|*.tif|All files|*.* . Estaremos procurando imagens no formato .tif porém pode-se utilizar os formatos .jpg como filtro para pesquisa.

Convertendo Imagem para Texto

Implementaremos agora o método que fará a conversão das imagens TIFF em texto.  Crie um método sem retorno  chamado OCRImplementation e insira o código a seguir:

O método Create do objeto md recebe o path do arquivo a ser convertido. Faremos então a chamada ao método OCR. O método OCR recebe três parâmetros, o primeiro representa o idioma ou língua do documento, o segundo parâmetro especifica se o processo do método determinará a orientação da página e o terceiro parâmetro indicará se o processo corrigirá desalinhamentos dos ângulos verticais da página.

Após a chamada ao método OCR, o texto passa a estar disponível para formatação. Para “pegar” o texto, é necessário adicionar referências às propriedades dos objetos Image e Layout.

O objeto Layout permite que o texto seja resgatado. A propriedade Words deste objeto contém a propriedade Count que permite a iteração pela lista de palavras. Pode-se resgatar cada palavra separadamente pela propriedade Words através de um índex, porém faremos uma iteração por todas as palavras e adicionaremos um espaço em branco para separá-las umas das outras.

O método Close do objeto md recebe um único argumento boolean indicando se o mesmo deve salvar as alterações feitas no arquivo da imagem.

Todo o trabalho de conversão é realizado pelo método OCR.

Dois cliques no botão btn_Convert, o evento será gerado, escreva o seguinte código no evento:

Criando um documento OpenXML

No Solution Explorer clique em Add Reference e adicione referência a duas bibliotecas: DocumentFormat.OpenXML e WindowsBase. Essas bibliotecas permitirão que o texto proveniente do OCR seja transformado em um documento OpenXML (.docx).

No escopo de classe crie uma constante com o seguinte valor:

Essa constante definirá a estrutura e os relacionamentos internos do documento.

Criaremos agora um método sem retorno chamado de CreateDocument. Esse método deverá receber como parâmetro uma string contendo o texto proveniente do OCR.

Perceba que estamos utilizando o SDK v1.0, por conseqüência o esforço para criar um documento OpenXML foi bastante reduzido. O objeto WordprocessingDocument define o pacote (package) que representa um documento Word. O objeto MainDocumentPart é responsável por definir a parte principal de um documento.

O método AddMainDocumentPart é responsável por adicionar a parte principal a estrutura de um documento.

Obs.: Para mais informações sobre o formato OpenXML: http://msdn.microsoft.com/en-us/library/aa338205.aspx

A string proveniente do OCR substituirá a palavra REPLACE no método Replace, dessa forma moldando o texto no formato WordprocessingML.

Implementando o Speech Recognition

O Speech Recognition foi lançado para melhorar a experiência de usuário, e permitir o acesso a informações de forma mais natural e eficiente. Provê poderosas APIs e ferramentas para construção de aplicações speech-enabled. Utilizaremos a Speech API de forma mais simples, porém a mesma pode ser extendida para uma maior abrangência em suas aplicações.

O Speech acompanha por padrão o Windows Vista e sua API está disponível a partir da versão 3.0 do .NET Framework.

No Solution Explorer adicione referência ao Namespace System.Speech. No escopo de classe crie um objeto do tipo SpeechSynthesizer

No Construtor da classe inicialize as propriedades Rate e Volume do objeto speaker. A propriedade Rate define o tempo em que a sentença será executada, a propriedade volume define o nível do som.

No evento btn_Search_Click, adicione a chamada ao método Speak antes da instrução If. Esse método aceita como parâmetro uma string que será executada (falada) durante tempo de execução.

Implementaremos agora o método OCRImplementationPreview. Esse método é bem parecido om o método OCRIMplementation, a única diferença é que o mesmo ao invés de realizar a conversão e chamar o método CreateDocument, exibirá na Text Box txt_Preview a prévia do documento que será gerado posteriormente.

Perceba que estamos utilizando o Speech Recognition para a leitura do preview. Uma MessageBox é exibida para ativação ou não da leitura da Text Box.

Dois cliques no botão btn_Save_Click, o evento será gerado, escreva o seguinte código no evento:

O path e nome do arquivo a ser gerado será exibido na Text Box txt_SavePath, no momento em que o usuário clicar no botão Convert, o evento OCRImplementation será chamado, a imagem convertida e salva como um documento OpenXML.

Dois cliques no botão btn_Clear_Click, o evento será gerado, escreva o seguinte código no evento:

Esse evento fará com que todos os campos da aplicação sejam limpos.

Dois cliques no botão btn_Close_Click, o evento será gerado, escreva o seguinte código no evento:

Esse evento encerrará a aplicação.

Compilação x86

O componente MODI não será instanciado se sua aplicação for compilado pela runtime 64-bit do .NET. Para assegurar que sua aplicação possa instanciar o componente MODI, será necessário configurar o projeto para compilar em uma CPU x86 ao invés de Any CPU como é marcado por padrão no Visual Studio.

Executando a aplicação

No menu Debug, selecione Start Without Debugging (Ctrl+F5), a tela da aplicação será exibida, clique nas reticências (...) e selecione o local dos arquivos a serem procurados (Crie previamente um arquivo no Paint com o texto “Testing Office Character Recognition”)

Em seguida clique no botão Search, a lista de arquivos com a extensão .tif será exibida.

Selecione um arquivo e clique no botão Preview, uma message Box aparecerá desejando ativar o Speech Recognition, clique em OK, o texto será lido.

Selecione o Path onde deseja salvar o documento clicando no botão Save. Clique no botão convert, o documento .docx será gerado.

Clique no botão Clear para reiniciar o processo e converter mais algum arquivo, ou em Close para encerrar a aplicação.

Conclusão

O código para a implementação do Office OCR é de certa forma curto se comparado com APIs providas por terceiros. É uma ferramenta muito poderosa que pode ser explorada de várias formas, e integrada com os benefícios do OpenXML e do Speech Recognition. Juntas trazem uma riqueza maior à aplicação que as utiliza.

Daniel Campos

Daniel Campos - Desenvolvedor no Microsoft Innovation Center Fortaleza (www.centrodeinovacao.org.br), trabalha principalmente com tecnologias ligadas ao desenvolvimento com a plataforma Office e .NET, especialista em VSTO, OpenXML. Possui certificações MCTS e MOS.