Ler arquivo PDF com NodeJS

Veja como extrair o texto de um arquivo PDF usando NodeJS

Hoje você vai aprender como ler um arquivo PDF e extrair o seu conteúdo, para isso vamos utilizar NodeJS.

Se você não tem o NodeJS instalado em seu computador, pode baixar a partir deste endereço:

https://nodejs.org/

Uma vez instalado, a partir do seu terminal, e dentro da pasta onde você vai guardar o seu projeto, digite

npm init

Você pode responder todas as questões pressionando ENTER. No final do processo, será criado um arquivo chamado package.json, onde serão instaladas as dependências de nosso projeto.

Nosso projeto vai ter apenas uma dependência, que será a biblioteca pdf2json, ela permite abrir uma arquivo PDF e converte todo o seu conteúdo num arquivo JSON. Para instalar, basta digitar o seguinte comando:

npm install pdf2json

O arquivo PDF que vamos utilizar como exemplo está neste link:

arquivo_pdf_teste.pdf

Copie o arquivo para a mesma pasta do seu projeto.

Crie na pasta do seu projeto um arquivo chamado index.js. Dentro dele, insira as seguintes linhas:

var fs=require('fs');

var PDFParser=require('pdf2json');

var pdfCaminho = 'arquivo_pdf_teste.pdf';

if (fs.existsSync(pdfCaminho)) {

  var pdfParser = new PDFParser();

  //Vamos inserir programação aqui depois

  pdfParser.loadPDF(pdfCaminho);

  console.log('Arquivo localizado');

} else {

    console.log('Arquivo não localizado');

}

Para executar este arquivo, basta digitar o comando

node index

Neste código, adicionamos as bibliotecas pdf2json e fs. A biblioteca FS faz parte do Node, serve para trabalhar com arquivos. O código é simples, se o arquivo chamado "arquivo_pdf_teste.pdf" for localizado, ele cria uma instância de PDFParser, e executa o método "loadPDF" para ler o arquivo.

Agora precisamos adicionar a programação que vai ser executada depois que o arquivo for lido. Vamos acrescentar o seguinte:

if (fs.existsSync(pdfCaminho)) {

  var pdfParser = new PDFParser();

  pdfParser.on("pdfParser_dataError", function (errData) {

     console.error(errData.parserError)

  });

  pdfParser.on("pdfParser_dataReady", function (pdfData) {

console.log(pdfData)

  });

  pdfParser.loadPDF(pdfCaminho);

  console.log('Arquivo localizado');

} else {

    console.log('Arquivo não localizado');

}

Perceba que a instância de pdfParser vai executar dois métodos, o método "pdfParser_dataError" vai ser chamado se houver algum problema ao abrir o arquivo, e o método "pdfParser_dataReady" vai ser executado se o arquivo for aberto com sucesso. No seu console, você deve ver um objeto JSON contendo todos os elementos do arquivo PDF.

A estrutura do objeto de resposta tem muitos detalhes, segue abaixo um resumo:

- Todo o conteudo está dentro de formImage

- Dentro de formImage, vai existir um array chamado Pages, com os elementos de cada página.

- Dentro de Pages, vai existir um array chamado Texts, onde você vai ter partes do texto. O parser pode quebrar uma mesma linha em várias partes. Você vai ter a posição "x" e "y" daquele trecho de texto dentro da página.

- Para cada elemento dentro de Texts, vai existir um array de resultados chamado R. 

- Por último, cada elemento "R" vai ter uma propriedade chamada "T", com o texto.

Resumindo, para você pegar o primeiro texto que o parser conseguiu localizar na primeira página, você teria que fazer o seguinte:

console.log(pdfData.formImage.Pages[0].Texts[0].R[0].T);

Como você percebeu, o retorno possui vários arrays, então para imprimir no console todo o conteúdo teremos que iterar três arrays. Para ler o conteúdo de cada array, vamos utilizar o forEach. Desta forma, o código referente ao método "pdfParser_dataReady" ficaria assim:

pdfParser.on("pdfParser_dataReady", function (pdfData) {

  pdfData.formImage.Pages.forEach(function(page, index) { 

page.Texts.forEach(function(text, index) { 

text.R.forEach(function(t) { 

console.log(t.T);

});

});

  });

});

Para concluir, ao invés de imprimir o conteudo na tela, vamos guardar o conteúdo dentro de um arquivo HTML. Utilizando a biblioteca FS (filesystem), vamos criar depois de abrir o arquivo PDF um arquivo HTML chamado resultado.html, que será gravado na mesma pasta onde está o projeto. Vamos também acrescentar as quebras de linha, para o texto ficar mais legível.

O código completo pode ser visto abaixo:

var fs=require('fs');

var PDFParser=require('pdf2json');

var pdfCaminho = 'arquivo_pdf_teste.pdf';

if (fs.existsSync(pdfCaminho)) {

  var pdfParser = new PDFParser();

  pdfParser.on("pdfParser_dataError", function (errData) {

     console.error(errData.parserError)

  });

  pdfParser.on("pdfParser_dataReady", function (pdfData) {

  var retornoHtml = "";

  

  pdfData.formImage.Pages.forEach(function(page, index) { 

retornoHtml += "<p>Pagina " + (parseInt(index) + 1) + "</p>";

var y = 0;

page.Texts.forEach(function(text, index) { 

if (index == 0){

y = text.y;

}

text.R.forEach(function(t) { 

if (text.y !== y){

retornoHtml += "<br/>";

}

retornoHtml += decodeURIComponent(t.T);

});

y = text.y;

});

retornoHtml += "</p>";

  });

  

  fs.writeFile("resultado.html", retornoHtml, function(err) {

if(err) {

return console.log(err);

}

  });

  });




  pdfParser.loadPDF(pdfCaminho);

} else {

    console.log('Arquivo não localizado');

}

 

 

 

Quer conferir mais dicas sobre JavaScript? Clique aqui e veja mais dicas!