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: 19.341 ]

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

Postando mensagem no Facebook com Perl

API do Bing para traduzir textos

Gerir VirtualHosts do Apache

Upload de múltiplos arquivos para Imageshack.us

Servidor BBS


  

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 removido 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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts