Como o script que compartilhei para as pessoas que precisam baixar o Diário Oficial da União normalmente é utilizado para permitir posterior pesquisa de palavras no PDF, esta alteração faz a pesquisa no DOU escolhido procurando as palavras que estão listadas em um arquivo específico.
Deixa de salvar o PDF e cria um arquivo texto com o resultado da pesquisa.
É necessário criar o arquivo com a lista de palavras a serem pesquisadas e salvá-lo no mesmo diretório do script com o nome de "palavras.lst".
Após executar o script, abra o arquivo com o resultado da pesquisa.
Ex.: para executar o script e consultar a seção 2 do DOU, digite na linha de comando:
$ perl in_lwpsearch.pl 2
O resultado da pesquisa estará em um arquivo com o nome "grep_out_yyyy-mm-dd.txt", onde yyyy-mm-dd indica a data da execução da pesquisa.
$|=1; # variável que indica para fazer "flush" após cada operação de escrita
my $jornal= shift; # recebe o numero do jornal desejado passado como parâmetro ( 1, 2, 3, 20 ou 1010)
print "Jornal: $jornal\n";
my $arq_palavras= 'palavras.lst'; #nome do arquivo contendo a lista de palavras a serem pesquisadas no texto do pdf (uma palavra ou expressão por linha)
# cada linha com palavra ou expressão será pesquisada em cada linha do pdf;
# se no texto do pdf a ser pesquisado a expressão estiver parte em uma linha e parte em outra ,
# não será encontrada.
use DateTime;
my $dt=DateTime->now->subtract(hours=>3); # recupera a data do sistema e subtrai o fuso horário
$ymd=$dt->ymd; # string da data no formato yyyy-mm-dd
$dmy=$dt->dmy("/"); # string da data no formato dd/mm/yyyy
$year=$dt->year;
$mon=substr("0".$dt->month,-2);
$day=substr("0".$dt->day,-2);
print "Data: $dmy\n";
use LWP::Simple; # módulo para fazer as requisições http de forma simples
use LWP::Simple::Cookies ( autosave => 1,
file => "lwp_cookies.dat" ); # módulo que trata automaticamente do armazenamento e envio de cookies feitos com as requisições de LWP::Simple
$doc = get("http://www.in.gov.br/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy"); #requisição inicial da página do caderno
if ( $doc=~/&totalArquivos=(\d*)"/ ){ # verifica quantas páginas o caderno tem
$paginas=$1;
print "Paginas: $paginas\n";
foreach $i ( 1..$paginas) { # loop para fazer a requisição de todas as páginas
my $arq="IN-Jornal $jornal - $ymd - pag_$i.pdf"; # nome local do arquivo pdf a ser recuperado
getstore("http://www.in.gov.br/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess",
$arq ) && print "$arq (ok)\n" ; # faz a requisição e armazena
# a linha abaixo extrai o texto do pdf e faz a pesquisa no texto das palavras contidas no arquivo indicado pela variável $arq_palavras
# incluindo no resultado cinco linhas acima e cinco linhas abaixo da linha com a palavra e indicando o nome do arquivo e pagina onde a palavra foi encontrada
# o resultado é redirecionado para um arquivo txt cujo nome indica a data da pesquisa. Ex: grep_out_2013_03_10.txt
system("pdftotext -q '$arq' - |grep -A5 -B5 -i -f $arq_palavras -H --label='$arq ------> '>> ./grep_out_$year-$mon-$day.txt");
unlink $arq;
}
}else { print "IN-Jornal $jornal não disponível!\n" } #avisa se o caderno não está disponível
[4] Comentário enviado por ademirff63 em 08/01/2014 - 22:44h
As seguintes linhas devem ser modificadas (apenas as URL do site da imprensa nacional que foram alteradas em meados de dezembro), enquanto a versão atualizada não estiver disponível para download:
[5] Comentário enviado por reaje em 20/01/2014 - 10:47h
Bom dia, parabéns pelo script.
Tentei rodar e está dando o erro abaixo:
IN-Jornal 3 - 2014-01-20 - pag_198.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
[6] Comentário enviado por ademirff63 em 20/01/2014 - 16:25h
O script, apesar de ter sido escrito no linux, e ser compartilhado em um site que reverencia o Linux, que vem com estes programas instalados em praticamente todas as distribuições, também funciona em outros Sistemas Operacionais.
Neste outro S.O. que você usa, é necessária a instalação do programa pdftotext, disponível no link: ftp://ftp.foolabs.com/pub/xpdf/xpdfbin-win-3.03.zip
Basta fazer o download, descompactar e colocar no mesmo diretório do script ou em algum diretório do path. Tem as duas versões, 32 e 64 bits, conforme a versão do seu S.O..
O mesmo deve ser feito para o programa grep, disponível no link: http://sourceforge.net/projects/unxutils/files/unxutils/current/UnxUtils.zip/download
Nos dois casos é necessário extrair do arquivo zip apenas o executável citado: pdftotext.exe e grep.exe.
[8] Comentário enviado por reaje em 21/01/2014 - 13:46h
ok! o erro que falei sumiu mas
está exibindo o seguinte:
--------------------------------------------------------------------------------
IN-Jornal 3 - 2014-01-21 - pag_207.pdf (ok)
pdftotext version 3.03
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdftotext [options] <PDF-file> [<text-file>]
-f <int> : first page to convert
-l <int> : last page to convert
-layout : maintain original physical layout
-fixed <fp> : assume fixed-pitch (or tabular) text
-raw : keep strings in content stream order
-htmlmeta : generate a simple HTML file, including the meta informatio
n
-enc <string> : output text encoding name
-eol <string> : output end-of-line convention (unix, dos, or mac)
-nopgbrk : don't insert page breaks between pages
-opw <string> : owner password (for encrypted files)
-upw <string> : user password (for encrypted files)
-q : don't print any messages or errors
-cfg <string> : configuration file to use in place of .xpdfrc
-v : print copyright and version info
-h : print usage information
-help : print usage information
grep: unrecogniz --helped option `--label='IN-Jornal'
: print usage informationUsage:
grep -? [OPTION]: print usage information...PATTERN [FILE]...
Try `grep --help' for more information.
--------------------------------------------------------------------------------
[9] Comentário enviado por ademirff63 em 28/01/2014 - 20:30h
No seu Sistema Operacional há alguns problemas com as aspas simples e também há a necessidade de usar caracteres de escape para preservar as aspas duplas, além de não funcionar a opção --label.
Então faça a seguinte alteração, para funcionar:
[10] Comentário enviado por chamojo em 26/05/2014 - 11:38h
Bom dia.
Ademir, pode me tirar uma dúvida. Estou tentando passar o suplemento da Anvisa (DOU) para TXT. Só que o arquivo ele formata errado, pois eles usam as vezes 2 colunas e quando salvo o pdf em txt não fica legal. Ja passou por isso? tem alguma sugestão? obrigado Eduardo
[11] Comentário enviado por rmenezes em 18/06/2014 - 15:27h
Pessoal, bom dia!
Estou tentando usar este script, mas ainda não consegui. Baixei e instalei o pdftotext e o grep. Depois ele pediu para instalar os módulos DateTime e LPW::Simple::Cookies, instalei também. E então tentei rodar o script, mas ele está acusando algum erro relacionado ao pdftotext, mas como disse acima, eu instalei este programa.
C:\Perl64\bin>perl in_lwpsearch3.pl 2
Jornal: 2
Data: 18/06/2014
Paginas: 48
IN-Jornal 2 - 2014-06-18 - pag_1.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
IN-Jornal 2 - 2014-06-18 - pag_2.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
IN-Jornal 2 - 2014-06-18 - pag_3.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
IN-Jornal 2 - 2014-06-18 - pag_4.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
[12] Comentário enviado por ademirff63 em 25/06/2014 - 05:50h
O programa pdftotext não deve estar em um diretório listado no path. É só acrescentar o diretório à variável path, ou então colocá-lo no mesmo diretório do script, ou ainda em um diretório listado no path, como o c:\windows.
[14] Comentário enviado por rmenezes em 17/07/2014 - 09:04h
ademirff63, bom dia!
Se não for pedir demais gostaria de uma dica para que, ao invés de retornar 5 linhas acima e 5 cinco linhas abaixo, ele retornasse somente o termo presente na lista de palavras, caso ele esteja presente no diário oficial. Na verdade trabalho em outra área profissional e estou adaptando esta busca que você fez para me informar somente se um número de processo foi citado no DOU. Pois na verdade tenho uma lista de centenas de numeros de processos e se por um acaso houverem 10 processos da minha lista citados num só dia, retornará um arquivo txt com um resultado muito grande. Até tentei modificar o comando grep -A5 -B5 para grep -A1 -B1, mas mesmo assim o retorno de palavras ainda é muito grande, pois é o que o que o script entende como uma linha do pdf.
Ou seja, quero somente que retorne o termo presente na minha lista de palavras.
[18] Comentário enviado por ademirff63 em 03/08/2014 - 19:29h
Considerando que o domínio diariooficial.kissr.com apontava para os arquivos disponibilizados no meu dropbox e não está mais disponível, quem quiser fazer download dos diários oficiais da União e do estado de São Paulo, é só seguir no Twitter @dokissr, onde publico os links assim que faço o upload para http://dou.ademirff63.com.br, diariamente.
[20] Comentário enviado por AmarEl em 22/05/2015 - 11:00h
Olá Ademir!
Tenho feito o download do diário da união no formato que vc disponibiliza na sua pagina e copio como txt para manipula-lo melhor, mas preciso do txt de alguns diários mais antigos e que sua pagina não disponibiliza. Qual código você aplica para gerar um arquivo txt com a sequencia correta igual da sua pagina? Tentei com diversos comandos do pdftotext mas sempre havia uma quebra de padrões...
[21] Comentário enviado por ademirff63 em 22/05/2015 - 12:54h
Boa Tarde!
Nao sei bem se entendi a sua pergunta.
Para gerar o txt formatado como no site (html), utilizo o parametro -htmlmeta no comando:
pdftotext -htmlmeta arquivo.pdf
Depois, para retirar os caracteres indesejados ou substituir alguns cabecalhos ou rodapes, utilizo o seguinte comando perl com expressao regular para substituicao de texto:
perl -pi -e "s/indesejado/desejado/g" arquivo.html
Assim substituo tudo que for indesejado pelo desejado no arquivo.html
Agora precisa dar uma olhada no tutorial perl para expressoes regulares e ver o que pode ser feito, que vai muito alem disso.
Depois , tudo pode ser colocado em um arquivo de lote (.bat) e fica muito mais facil.