OCR em lote - muitos PDFs


20

Isso foi discutido há um ano aqui:

OCR em lote para muitos arquivos PDF (ainda não OCR)?

Existe alguma maneira de agrupar PDFs de OCR que ainda não foram OCR? Acho que esse é o estado atual das coisas que lidam com dois problemas:

PDFs de OCR em lote

janelas

  • Acrobat - este é o mecanismo ocr mais direto que processa o OCR em lote. O único problema parece ser 1) ele não pula arquivos que já foram OCRed 2) tenta lançar um monte de PDFs nele (alguns antigos) e vê-lo travar. É um pouco de buggy. Ele avisará você sobre cada erro encontrado (embora você possa dizer ao software para não notificá-lo. Mas, novamente, ele morre horrivelmente em certos tipos de PDFs, portanto sua milhagem pode variar.

  • ABBYY FineReader (Lote / Scansnap), Omnipage - Esses devem ser alguns dos piores programas de software conhecidos pelo homem. Se você descobrir como automatizar totalmente o OCR em lote (sem aviso) de PDFs salvando com o mesmo nome , poste aqui. Parece que as únicas soluções que eu encontrei falharam em algum lugar - renomear, não totalmente automatizado etc. etc. Na melhor das hipóteses, existe uma maneira de fazer isso, mas a documentação e a programação são tão horríveis que você nunca descobrirá.

  • ABBYY FineReader Engine , ABBYY Recognition Server - Essas são realmente mais soluções corporativas, provavelmente você seria melhor se o acrobat fosse executado em uma pasta e tentasse eliminar PDFs que causam erros / travam o programa do que passar pelo incômodo de tentar instalar um software de avaliação (supondo que você seja um usuário final simples). Não parece um custo competitivo para o usuário pequeno.

  • ** Estação de trabalho Autobahn DX **, o custo deste produto é tão proibitivo que você provavelmente poderá comprar 6 cópias do acrobat. Não é realmente uma solução para o usuário final. Se você é uma configuração corporativa, isso pode valer a pena para você.

Linux

  • WatchOCR - não é mais desenvolvido, e basicamente impossível de rodar nas distribuições modernas do Ubuntu
  • pdfsandwich - não é mais desenvolvido, basicamente impossível de ser executado nas distribuições modernas do Ubuntu
  • ** ABBY LINUX OCR ** - isso deve ser scriptável e parece ter bons resultados:

http://www.splitbrain.org/blog/2010-06/15-linux_ocr_software_comparison

No entanto, como muitos outros produtos ABBYY que eles cobram pela página, novamente, é melhor tentar fazer com que o Acrobat Batch OCR funcione.

  • ** Ocrad, GOCR, OCRopus, tesseract, ** - estes podem funcionar, mas existem alguns problemas:

    1. Os resultados de OCR não são tão bons quanto, por exemplo, acrobat para alguns deles (veja o link acima).
    2. Nenhum dos programas coleta um arquivo PDF e gera um arquivo PDF. Você precisa criar um script e separar o PDF primeiro, executar os programas em cada um deles e, em seguida, remontar o arquivo como um pdf
    3. Depois de fazer isso, você pode descobrir, como eu fiz, que (tesseract) cria uma camada de OCR que é deslocada. Portanto, se você pesquisar a palavra 'the', receberá um destaque da parte da palavra ao lado.
  • DjVu em lote → Converter em PDF - ainda não o analisou, mas parece uma solução horrível e abrangente.

Conectados

  • PDFcubed.com - vamos lá, não é realmente uma solução em lote.
  • ABBYY Cloud OCR - não tenho certeza se essa é realmente uma solução em lote, de qualquer forma, você deve pagar pela página e isso pode ficar bastante caro.

Identificando PDFs não OCR

Esse é um problema um pouco mais fácil, que pode ser resolvido facilmente no Linux e muito menos no Windows. Consegui codificar um script perl usando pdffontpara identificar se as fontes estão incorporadas para determinar quais arquivos não são OCR.


"Soluções" atuais

  1. Use um script para identificar PDFs não OCR (para não executar novamente milhares de PDFs OCR) e copie-os para um diretório temporário (mantendo a árvore de diretórios correta) e use o Acrobat no Windows para executá-los, na esperança de que os menores lotes não falham.

  2. use o mesmo script, mas faça com que uma das ferramentas linux ocr funcione corretamente, arriscando a qualidade do ocr.

Acho que vou tentar o número 1, estou preocupado demais com os resultados das ferramentas de OCR do Linux (não acho que alguém tenha feito uma comparação) e separar os arquivos e juntá-los novamente parece codificação desnecessária se a Adobe puder realmente agrupar o OCR em um diretório sem sufocar.

Se você quiser uma solução totalmente gratuita, precisará usar um script para identificar os PDFs não OCR (ou apenas executar novamente os OCR), e então usar uma das ferramentas do linux para experimentá-los. O Teseract parece ter os melhores resultados, mas, novamente, algumas dessas ferramentas não são bem suportadas nas versões modernas do Ubuntu, mas se você puder configurá-lo e corrigir o problema que tive, a camada de imagem não corresponde à camada de correspondência de texto ( com tesseract), você teria uma solução bastante viável e mais uma vez Linux> Windows.


Você tem uma solução funcional para automatizar totalmente PDFs de OCR em lote , ignorando arquivos já OCR mantendo o mesmo nome, com alta qualidade ? Se assim for, eu realmente aprecio a entrada.


Script Perl para mover arquivos não OCR para um diretório temporário. Não é possível garantir que isso funcione e provavelmente precise ser reescrito, mas se alguém fizer com que funcione (supondo que não funcione) ou funcione melhor, avise-me e publicarei uma versão melhor aqui.


#!/usr/bin/perl

# move non-ocred files to a directory
# change variables below, you need a base dir (like /home/joe/), and a sourcedirectory and output
# direcotry (e.g books and tempdir)
# move all your pdfs to the sourcedirectory

use warnings;
use strict;

# need to install these modules with CPAN or your distros installer (e.g. apt-get)
use CAM::PDF;
use File::Find;
use File::Basename;
use File::Copy;

#use PDF::OCR2;
#$PDF::OCR2::CHECK_PDF   = 1;
#$PDF::OCR2::REPAIR_XREF = 1;

my $basedir = '/your/base/directory';
my $sourcedirectory  = $basedir.'/books/';
my @exts       = qw(.pdf);
my $count      = 0;
my $outputroot = $basedir.'/tempdir/';
open( WRITE, >>$basedir.'/errors.txt' );

#check file
#my $pdf = PDF::OCR2->new($basedir.'/tempfile.pdf');
#print $pdf->page(10)->text;



find(
    {
        wanted => \&process_file,

        #       no_chdir => 1
    },
    $sourcedirectory
);
close(WRITE);

sub process_file {
    #must be a file
    if ( -f $_ ) {
        my $file = $_;
        #must be a pdf
        my ( $dir, $name, $ext ) = fileparse( $_, @exts );
        if ( $ext eq '.pdf' ) {
            #check if pdf is ocred
            my $command = "pdffonts \'$file\'";
            my $output  = `$command`;
            if ( !( $output =~ /yes/ || $output =~ /no/ ) ) {
                #print "$file - Not OCRed\n";
                my $currentdir = $File::Find::dir;
                if ( $currentdir =~ /$sourcedirectory(.+)/ ) {
                    #if directory doesn't exist, create
                    unless(-d $outputroot.$1){
                    system("mkdir -p $outputroot$1");
                    }
                    #copy over file
                    my $fromfile = "$currentdir/$file";
                    my $tofile = "$outputroot$1/$file";
                    print "copy from: $fromfile\n";
                    print "copy to: $tofile\n";
                    copy($fromfile, $tofile) or die "Copy failed: $!";
#                       `touch $outputroot$1/\'$file\'`;
                }
            }

        }

    }
}

Olá, você poderia compartilhar o script do Windows "para identificar pdfs não OCR (...) e copiá-los para um diretório temporário (mantendo a árvore de diretórios correta)? Agradecemos antecipadamente;)
Erb

@ David ok, está tudo bem. Eu aviso que ele pode não funcionar corretamente na primeira vez. Isso não danifica os seus pdfs (apenas copia, não toca nos originais), mas o que quero dizer é que você pode precisar modificar o script. Se você conhece perl, seria fácil, se não me avise, ou poderá depurar você mesmo e fazer as pequenas edições necessárias.
12123 Joe

Muito Obrigado. Vou tentar fazê-lo funcionar (mesmo que eu seja novo no perl). Obrigado.
Erb

Talvez outra idéia no Windows (funcionou no XP)? Eu usei isso no passado para "remover de uma pasta (com subpastas) todos os arquivos pdf que não possuem senhas". A idéia era manter todos os arquivos PDF protegidos por senha. Copie com o Syncback freeware todos os pdf (com subpastas relacionadas) em uma nova pasta (C: \ 5 \ "). Adicione pdftotext.exe e esse arquivo de texto renomeado em del_pdf_no_password.bat. Seu conteúdo:" FOR / RC: \ 5 \% % x IN (* .PDF) DO (pdftotext %% x NUL && DEL %% x) "em que" C: \ 5 \ "é a pasta a ser alterada. Em seguida, inicie o pdftotext.exe e somente o arquivo .bat.
Erb

Mais detalhes: você precisará remover espaços vazios (+ caracteres especiais como "," ...) dentro de qualquer nome de pasta com um renomeador de freeware (como por exemplo: alternativeto.net/software/renamer ). Caso contrário, não funcionará para todas as subpastas! Ps: Eu não escrevi este roteiro (I foi ajudado por alguém em ... 2004!)
Erb

Respostas:


3

Também procurei uma maneira de fazer o OCR em lote de muitos PDFs de maneira automatizada, sem muita sorte. No final, criei uma solução viável semelhante à sua, usando o Acrobat com um script da seguinte maneira:

  1. Copie todos os PDFs relevantes para um diretório específico.

  2. Remova os PDFs que já contêm texto (supondo que eles já sejam OCRd ou já sejam texto - não é o ideal que eu sei, mas é bom o suficiente por enquanto).

  3. Use o AutoHotKey para executar automaticamente o Acrobat, selecione o diretório específico e faça o OCR de todos os documentos, acrescentando "-ocr" ao nome do arquivo.

  4. Mova os PDFs do OCRd de volta para o local original, usando a presença de um arquivo "-ocr.pdf" para determinar se foi bem-sucedido.

É um pouco Heath Robinson , mas na verdade funciona muito bem.


Por que você precisa usar o AutoHotKey se o Acrobat já fará o lote de um diretório? Se você estiver preocupado em repetir o processo se o acrobat travar, o carimbo de data / hora modificado do arquivo informará onde você parou. Se você deseja manter os originais, basta copiar o diretório. Se você deseja apenas o -ocr no final, basta alterar o nome do lote após concluir.
Joe

1
Olá, Por sorte, você poderia compartilhar como você aponta os pontos 2. e 3. no Windows? Agradecemos antecipadamente;)
Erb

2

Eu acredito que você precisa perceber que o ABBYY FineReader é uma solução para o usuário final projetada para fornecer um OCR rápido e preciso e pronto para uso.

Com base na minha experiência, os projetos de OCR têm detalhes significativamente diferentes a cada vez e não há como criar uma alma pronta para cada caso único.

  • Dê uma olhada no ABBYY Recognition Server , este é um produto profissional para automação de OCR.

  • Quando se trata de linux, dê uma olhada em http://ocr4linux.com , é um utilitário de linha de comando que pode ser adequado a você também.

  • Para tarefas mais complexas, o ABBYY possui SDKs muito flexíveis, como o ABBYY FineReader Engine (hospedado internamente) ou o ABBYY Cloud OCR SDK (baseado na nuvem do Microsoft Azure), que permite que você deseje processar o OCR da maneira que desejar.

Fiz parte da equipe de desenvolvimento front-end do serviço em nuvem especificado acima e posso fornecer mais informações, se necessário.

Considerando a pesquisa de uma camada de texto em PDF, não posso dar conselhos sobre isso, porque essa tarefa é um pouco à parte do OCR, que é minha especialidade, por isso considero sua abordagem de uso de script externo bastante razoável. Talvez você ache esta discussão útil: http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scanned-image-or-contains-text


1
Bem, pelo menos sabemos que a ABBYY não possui a documentação ou a funcionalidade (encontrada no Acrobat) para agrupar facilmente o OCR em uma pasta de pdf. O OCR em lote simples de uma pasta de documentos não OCR é um recurso extremamente desejado (muito mais do que alguns dos outros recursos do ABBYY). Basta pesquisar no Google para descobrir quão esmagadoramente comum esse desejo é, se não, eu posso fornecer citações. Obrigado pelas outras opções, vou examiná-las, mas, por enquanto, permita que qualquer pessoa que venha aqui em busca de como concluir essa tarefa MUITO comum (cite disponível) saiba que ouvimos pela boca do cavalo que a ABBYY não pode fazer isso.
21412 Joe

O OCR em lote está disponível no ABBYY FineReader Professional. Na sua pergunta, você declara a necessidade de automatizar completamente o OCR. Agora você precisa apenas de um processamento em lote. Por favor, seja claro no que exatamente você precisa.
Nikolay

Leia acima. Eu disse 'OCR em lote FACILMENTE', 'ocr em lote SIMPLES de uma pasta'. Mais adiante: "Se você descobrir como automatizar totalmente o OCR em lote (sem aviso) ..". É bastante óbvio o que eu quero. Portanto, fique claro para quem visita esta página: * Se você deseja 'processar em lote' uma pasta de PDFs usando uma interface horrível e complicada, com opções horríveis de salvamento em um processo pesado e intensivo para o usuário , a ABBYY pode funcionar para você * Se você quiser para 'EASILY batch OCR', 'simple batch ocr' com pouca interação do usuário como milhares de outras pessoas, como o Acrobat já faz, o ABBYY Finereader não é para você.
3131 Joe

2

No linux

A melhor e mais fácil maneira de usá- pypdfocrlo não muda o pdf

pypdfocr your_document.pdf

No final, você terá outro your_document_ocr.pdfcomo deseja com texto pesquisável. O aplicativo não altera a qualidade da imagem. Aumenta um pouco o tamanho do arquivo adicionando o texto da sobreposição.

Para lote dos pdfs

ls ./p*.pdf | xargs -L1 -I {}  pypdfocr {}

Se os PDFs estiverem em subpastas:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {}  pypdfocr {}

Atualização em 3 de novembro de 2018:

pypdfocrnão é mais suportado desde 2016 e notei alguns problemas por não serem mentidos. ocrmypdf( module ) faz um trabalho semelhante e pode ser usado assim:

ocrmypdf in.pdf out.pdf

Para instalar:

pip install ocrmypdf

ou

apt install ocrmypdf

então o comando se tornaria

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {}  ocrmypdf {} {}_ocr.pdf 

1

Tive algum sucesso no início de 2015 ao fazer OCR em lote totalmente manual usando o Nuance OmniPage Ultimate no Windows. Não é grátis, preço de tabela $ 500. Use o programa em lote "DocuDirect" incluído. Tem uma opção "Executar trabalho sem nenhum aviso", que parece a resposta direta à sua pergunta original.

Usei o DocuDirect para produzir um arquivo PDF pesquisável para cada arquivo PDF de imagem de entrada (ou seja, não pesquisável); pode ser dito para replicar a árvore do diretório de entrada na pasta de saída, bem como os nomes dos arquivos de entrada originais (quase - veja abaixo). Também usa vários núcleos. A precisão foi o melhor dos pacotes que avaliei. Os documentos protegidos por senha são ignorados (sem interromper o trabalho, sem mostrar uma caixa de diálogo).

Advertência 1: Quase os nomes dos arquivos originais - o sufixo ".PDF" se torna ".pdf" (ou seja, de maiúsculas para minúsculas) porque, ei, é tudo o mesmo no Windows. (Ugh.)

Advertência 2: Nenhum arquivo de log para diagnosticar quais arquivos falham durante o reconhecimento - o que eles definitivamente fazem - está de volta para você. O DocuDirect produzirá resultados ilegíveis, como páginas inteiras, simplesmente ausentes. Escrevi um script python usando o módulo PyPDF2 para implementar uma validação bruta: testando se a contagem de páginas de saída correspondia à contagem de páginas de entrada. Ver abaixo.

Advertência 3: Um arquivo de imagem de entrada confuso e indistinto fará com que o OmniPage seja interrompido para sempre, sem usar nenhuma CPU; isso nunca se recupera. Isso realmente inviabiliza o processamento em lote e não encontrei soluções alternativas. Eu também relatei isso à Nuance, mas não cheguei a lugar algum.

@ Joe está certo sobre o software ser mal programado e documentado. Eu noto o núcleo do OmniPage possui uma incrível tecnologia mágica de reconhecimento de caracteres, mas a camada externa (GUI e processamento em lote) é suficiente para fazer com que você se solte.

Apoio a sugestão de @ Joe e @ Kiwi de rastrear arquivos usando scripts, de modo a apresentar o pacote OCR apenas com documentos de imagem desprotegidos.

Minha única afiliação à Nuance é como um cliente não exatamente satisfeito - tenho um lote de tíquetes de suporte não resolvidos para provar isso :)

@ Joe: Resposta tardia, mas talvez ainda seja relevante. Comunidade @SuperUser: espero que você sinta que isso está no tópico.

O pacote sucessor ** Update ** é o Nuance PowerPDF Advanced, preço de tabela de apenas US $ 150. Eu tive um sucesso ainda melhor com isso, é tão preciso, mas muito mais estável.

Segue o script python de validação de árvore pré / pós-OCR.

'''
Script to validate OCR outputs against inputs.
Both input and output are PDF documents in a directory tree.
For each input document, checks for the corresponding output
document and its page count.

Requires PyPDF2 from https://pypi.python.org/pypi/PyPDF2
'''

from __future__ import print_function
from PyPDF2 import PdfFileReader
import getopt
import os
import stat
import sys

def get_pdf_page_count(filename):
    '''
    Gets number of pages in the named PDF file.
    Fails on an encrypted or invalid file, returns None.
    '''
    with open(filename, "rb") as pdf_file:
        page_count = None
        err = None
        try:
            # slurp the file
            pdf_obj = PdfFileReader(pdf_file)
            # extract properties
            page_count = pdf_obj.getNumPages()
            err = ""
        except Exception:
            # Invalid PDF.
            # Limit exception so we don't catch KeyboardInterrupt etc.
            err = str(sys.exc_info())
            # This should be rare
            print("Warning: failed on file %s: %s" % (filename, err), file=sys.stderr)
            return None

    return page_count

def validate_pdf_pair(verbose, img_file, txt_file):
    '''
    Checks for existence and size of target PDF file;
    number of pages should match source PDF file.
    Returns True on match, else False.
    '''
    #if verbose: 
    #    print("Image PDF is %s" % img_file)
    #    print("Text PDF is %s" % txt_file)

    # Get source and target page counts
    img_pages = get_pdf_page_count(img_file)
    txt_pages = get_pdf_page_count(txt_file)
    if img_pages is None:
        # Bogus PDF, skip.
        print("Warning: failed to get page count for %s" % img_file, file=sys.stderr)
        return None
    if txt_pages is None:
        # Bogus PDF, skip.
        print("Warning: failed to get page count for %s" % txt_file, file=sys.stderr)
        return None

    retval = True
    if img_pages != txt_pages:
        retval = False
        print("Mismatch page count: %d in source %s, %d in target %s" % (img_pages, img_file, txt_pages, txt_file), file=sys.stderr)

    return retval


def validate_ocr_output(verbose, process_count, total_count, img_dir, txt_dir):
    '''
    Walks a tree of files to compare against output tree, calling self recursively.
    Returns a tuple with PDF file counts (matched, non-matched).
    '''
    # Iterate over the this directory
    match = 0
    nonmatch = 0
    for dirent in os.listdir(img_dir):
        src_path = os.path.join(img_dir, dirent)
        tgt_path = os.path.join(txt_dir, dirent)
        if os.path.isdir(src_path):
            if verbose: print("Found source dir %s" % src_path)
            # check target
            if os.path.isdir(tgt_path):
                # Ok to process
                (sub_match, sub_nonmatch) = validate_ocr_output(verbose, process_count + match + nonmatch, total_count, 
                                         src_path, tgt_path)
                match += sub_match
                nonmatch += sub_nonmatch
            else:
                # Target is missing!?
                print("Fatal: target dir not found: %s" % tgt_path, file=sys.stderr)

        elif os.path.isfile(src_path):
            # it's a plain file
            if src_path.lower().endswith(".pdf"):
                # check target
                # HACK: OmniPage changes upper-case PDF suffix to pdf;
                # of course not visible in Windohs with the case-insensitive 
                # file system, but it's a problem on linux.
                if not os.path.isfile(tgt_path):
                    # Flip lower to upper and VV
                    if tgt_path.endswith(".PDF"):
                        # use a slice
                        tgt_path = tgt_path[:-4] + ".pdf"
                    elif tgt_path.endswith(".pdf"):
                        tgt_path = tgt_path[:-4] + ".PDF"
                # hopefully it will be found now!
                if os.path.isfile(tgt_path):
                    # Ok to process
                    sub_match = validate_pdf_pair(verbose, src_path, tgt_path)
                    if sub_match:
                        match += 1
                    else:
                        nonmatch += 1
                    if verbose: print("File %d vs %d matches: %s" % (process_count + match + nonmatch, total_count, sub_match))

                else:
                    # Target is missing!?
                    print("Fatal: target file not found: %s" % tgt_path, file=sys.stderr)
                    nonmatch += 1

        else:
            # This should never happen
            print("Warning: not a directory nor file: %s" % src_path, file=sys.stderr)
    return (match, nonmatch)

def count_pdfs_listdir(verbose, src_dir):
    '''
    Counts PDF files in a tree using os.listdir, os.stat and recursion.
    Not nearly as elegant as os.walk, but hopefully very fast on
    large trees; I don't need the whole list in memory.
    '''
    count = 0
    for dirent in os.listdir(src_dir):
        src_path = os.path.join(src_dir, dirent)
        # stat the entry just once
        mode = os.stat(src_path)[stat.ST_MODE]
        if stat.S_ISDIR(mode):
            # It's a directory, recurse into it
            count += count_pdfs_listdir(verbose, src_path)
        elif stat.S_ISREG(mode):
            # It's a file, count it
            if src_path.lower().endswith('.pdf'):
                count += 1
        else:
            # Unknown entry, print an error
            print("Warning: not a directory nor file: %s" % src_path, file=sys.stderr)
    return count

def main(args):
    '''
    Parses command-line arguments and processes the named dirs.
    '''
    try:
        opts, args = getopt.getopt(args, "vi:o:")
    except getopt.GetoptError:
        usage()
    # default values
    verbose = False
    in_dir = None
    out_dir = None
    for opt, optarg in opts:
        if opt in ("-i"):
            in_dir = optarg
        elif opt in ("-o"):
            out_dir = optarg
        elif opt in ("-v"):
            verbose = True
        else:
            usage()
    # validate args
    if in_dir is None or out_dir is None: usage()
    if not os.path.isdir(in_dir):
        print("Not found or not a directory: %s" % input, file=sys.stderr)
        usage()
    if not os.path.isdir(out_dir):
        print("Not found or not a directory: %s" % out_dir, file=sys.stderr)
        usage()
    if verbose: 
        print("Validating input %s -> output %s" % (in_dir, out_dir))
    # get to work
    print("Counting files in %s" % in_dir)
    count = count_pdfs_listdir(verbose, in_dir)
    print("PDF input file count is %d" % count)
    (match,nomatch) = validate_ocr_output(verbose=verbose, process_count=0, total_count=count, img_dir=in_dir, txt_dir=out_dir) 
    print("Results are: %d matches, %d mismatches" % (match, nomatch))

def usage():
    print('Usage: validate_ocr_output.py [options] -i input-dir -o output-dir')
    print('    Compares pre-OCR and post-OCR directory trees')
    print('    Options: -v = be verbose')
    sys.exit()

# Pass all params after program name to our main
if __name__ == "__main__":
    main(sys.argv[1:])

Acabei de ver sua atualização. Eu vou tentar isso. Espero que faça o OCR silenciosamente e sem travar! (Uau! 1GB arquivo de download!)
Erb

0

Você pode considerar o Autobahn DX do Aquaforest: http://www.aquaforest.com/en/autobahn.asp

Ele foi desenvolvido para processar lotes de PDFs e possui uma variedade de opções (por exemplo, arquivos OCRed de salto ou passagem), além de opções para tratamento inteligente de PDFs que podem oferecer um melhor resultado (por exemplo, se um PDF tiver algumas páginas de imagem e algumas páginas de texto, ele pode apenas registrar as páginas da imagem)


Se você é afiliado a esse produto, diga-o explicitamente editando sua pergunta.
Slhck 17/05/12

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.