Baixar o Diário Oficial da União e salvar como um único PDF completo

Publicado por Ademir Ferreira Furtado (última atualização em 08/01/2014)

[ Hits: 18.591 ]

Homepage: diariooficialhoje.com.br

Download in_lwp.pl

Download 1389042833.in_lwp.pl (versão 2)




O script foi feito para facilitar a vida de quem precisa baixar diariamente o Diário Oficial da União.
Está simplificado e comentado, contendo a parte essencial e suficiente para o que se propõe.
Basta executá-lo no prompt de comando ou chamá-lo em um script shell.

Foi feito para ser executado sem nenhuma dependência externa além da linguagem Perl e dos módulos usados: DateTime, LWP::Simple, LWP::Simple::Cookies e CAM::PDF. Estes módulos podem ser instalados facilmente digitando no prompt:

$ cpan nome::do::modulo

Caso surja alguma dúvida na instalação dos módulos, consulte esta página: http://www.cpan.org/modules/INSTALL.html

Com os módulos instalados, é só colocar o script para funcionar. Ex.: para baixar o Diário Oficial da Seção 2 do DOU, basta digitar no prompt de comando:

$ perl in_lwp.pl 2

Que ele irá baixar todas as páginas do DOU-2 e criar um PDF contendo todas elas.

Os diários disponíveis testados são: 1, 2, 3, 20 e 1010.

  



Versões atualizadas deste script

Versão 2 - Enviado por Ademir Ferreira Furtado em 06/01/2014

Changelog: Com a mudança da localização da página dos Jornais na Imprensa Oficial, houve a necessidade de se alterar o script em duas linhas que fazem referência às URLs.

Download 1389042833.in_lwp.pl


Esconder código-fonte

$|=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";

use DateTime;
my $dt=DateTime->now;      # recupera a data do sistema
$ymd=$dt->ymd;             # string da data no formato yyyy-mm-dd
$dmy=$dt->dmy("/");       # string da data no formato dd/mm/yyyy 

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 
      if ( $i == 1) {                           # se for a primeira página...
            use CAM::PDF; 
            $bigpdf = CAM::PDF->new("$arq");          # a primeira página será a base para anexar os outros pdf
      } else {
            my $anotherpdf = CAM::PDF->new("$arq");    # demais páginas pdf   
            $bigpdf->appendPDF($anotherpdf);        # anexadas  à primeira
      }
   }
   $bigpdf->cleanoutput("IN-Jornal $jornal - $ymd.pdf");       #salva o pdf com todas as páginas

 }else { print "IN-Jornal $jornal não disponível!\n" }                 #avisa se  o caderno  não está disponível 

Scripts recomendados

Obtendo a temperatura com Perl

Servidor BBS

Tweetin - Poste tweets pelo terminal

Script para fazer buscas no arquivo de logs do squid

Synner Novo Sys(TCP) Flooder em Perl


  

Comentários
[1] Comentário enviado por ademirff63 em 02/04/2013 - 10:41h

Automatizei e coloquei tudo em um site, facilitando pra quem quiser fazer download diariamente (armazeno apenas uma semana):

http://diariooficialhoje.com.br

[2] Comentário enviado por talencargomes em 08/01/2014 - 15:34h

Não consigo utilizar, só me retorna que o jornal não está disponível.

[3] Comentário enviado por ademirff63 em 08/01/2014 - 16:42h

Faça o download da versão 2 do script, pois o código fonte exibido na página ainda está mostrando a primeira versão.
As seguintes linhas foram modificadas (apenas as URL do site da imprensa nacional que foram alteradas em meados de dezembro):

linha:
$doc = get("http://www.in.gov.br/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy");
substituida por:
$doc = get("http://pesquisa.in.gov.br/imprensa/jsp/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy");

linha:
getstore("http://www.in.gov.br/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess", $arq ) && print "$arq (ok)\n" ;

substituida por:
getstore("http://pesquisa.in.gov.br/imprensa/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess", $arq ) && print "$arq (ok)\n";



[4] Comentário enviado por talencargomes em 08/01/2014 - 18:46h

Obrigado! percebi que não estava atualizado e fui no site e peguei a url nova, mas não consegui mesmo assim. Com a que c postou funcionou.

[5] Comentário enviado por talencargomes em 08/01/2014 - 19:14h

[code] foreach $teste(1..$paginas){
my $arq2 ="IN-Jornal $jornal - $ymd - pag_$teste.pdf";
unlink $arq2;

}
[/code]
quem quiser deletar os arquivos das páginas só adicionar esse FOR depois da linha 36.

[6] Comentário enviado por orthophilos em 22/09/2014 - 19:04h

Toda vez que rodo com um caderno do DOu com muitas paginas, aleatoriamente , ( as vezes na pagina 3, as vezes na 30, as vezes na 16, etc...) o script interrompe a execução com a seguinte mensagem : :

Can't call method "getRootDict" on an undefined value at /usr/local/share/perl/5.14.2/CAM/PDF.pm line 3786.


alguem sabe, como pelo menos , prosseguir o loop de downloads, ainda que perdendo aquela pagina especifica que deu problemas??? Grato

[7] Comentário enviado por ademirff63 em 22/09/2014 - 19:59h

Para fazer o download dos pdf sem criar o pdf único com todas as páginas e assim não correr o risco de se querer anexar uma página vazia (que não foi recuperada por qualquer motivo) ao pdf completo, é só retirar as linhas seguintes do script, que fazem uso do módulo CAM::PDF:

if ( $i == 1) { # se for a primeira página...
use CAM::PDF;
$bigpdf = CAM::PDF->new("$arq"); # a primeira página será a base para anexar os outros pdf
} else {
my $anotherpdf = CAM::PDF->new("$arq"); # demais páginas pdf
$bigpdf->appendPDF($anotherpdf); # anexadas à primeira
}
}
$bigpdf->cleanoutput("IN-Jornal $jornal - $ymd.pdf"); #salva o pdf com todas as páginas


E se tiver o pdftk instalado no seu linux, há mais de uma maneira de fazer isto com perl: é só substituir todas as linhas citadas pela seguinte linha, que deve ser colocada como a última do script:

system("pdftk IN-Jornal\\ $jornal\\ -\\ $ymd\\ -\\ pag*.pdf output 'IN-Jornal $jornal - $ymd.pdf'");

[8] Comentário enviado por ademirff63 em 14/01/2015 - 12:48h

Se alguém precisar do DOU ou do DOESP diariamente e quiser saber quando o pdf inteiro estiver disponível para download no site em http://diariooficialhoje.com.br.

[9] Comentário enviado por ademirff63 em 07/01/2021 - 18:50h

Se alguém precisar do DOU ou do DOESP diariamente e quiser saber quando o pdf inteiro estiver disponível para download confira o novo domínio que criei:
http://diariooficialhoje.com.br


Contribuir com comentário