Pergunta

Eu tenho um monte de arquivos PDF e as minhas necessidades programa Perl para fazer uma pesquisa de texto completo deles para retorno quais contêm uma seqüência específica. Até o momento eu tenho usado este:

my @search_results = `grep -i -l \"$string\" *.pdf`;

onde $ string é o texto a procurar. No entanto, este não para a maioria pdf do porque o formato de arquivo não é, obviamente, ASCII.

O que posso fazer que é mais fácil?

Esclarecimento: Há cerca de 300 de pdf cujo nome eu não sei com antecedência. PDF :: Core é provavelmente um exagero. Eu estou tentando obter pdftotext e grep para jogar bonito com o outro dado Eu não sei os nomes do pdf de, eu não consigo encontrar a sintaxe certo ainda.

solução final usando a sugestão de Adam Bellaire abaixo:

@search_results = `for i in \$( ls ); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`;
Foi útil?

Solução

Os PerlMonks fio fala aqui sobre este problema.

Parece que para a sua situação, pode ser mais simples de obter pdftotext (a ferramenta de linha de comando), então você pode fazer algo como:

my @search_results = `pdftotext myfile.pdf - | grep -i -l \"$string\"`;

Outras dicas

Eu segunda solução Adam Bellaire. Eu costumava utilidade pdftotext para criar índice de texto completo de minha biblioteca ebook. É um pouco lento, mas faz o seu trabalho. Quanto de texto completo, tente PLucene ou KinoSearch para armazenar índice de texto completo.

A minha biblioteca, CAM :: PDF , tem suporte para extração de texto, mas é um problema inerentemente difícil dada a orientação gráfica de sintaxe PDF. Então, a saída é às vezes sem sentido. CAM :: PDF feixes um getpdftext.pl programa ou você pode invocar a funcionalidade assim:

my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n";
for my $pagenum (1 .. $doc->numPages()) {
   my $text = $doc->getPageText($pagenum);
   print $text;
}

Você pode querer olhar em PDF :: Núcleo .

O mais fácil índice de texto completo / seach que usei é mysql. Você acabou de inserir na tabela com o índice apropriado sobre ela. Você precisa gastar algum tempo trabalhando fora os pesos relativos para campos (um jogo no título pode pontuação mais elevada do que um jogo no corpo), mas tudo isso é possível, embora com algum sql cabeludo.

Plucene está obsoleta (não houve qualquer trabalho ativo nele nos últimos dois anos AFAIK) em favor de KinoSearch. KinoSearch cresceu, em parte, fora de compreender as limitações arquitetônicas de Plucene.

Se você tem ~ 300 pdfs, em seguida, uma vez que você extraiu o texto do PDF (assumindo que o PDF possui texto e não apenas imagens de texto;) e dependendo de seus volumes de consulta você pode encontrar grep é suficiente.

No entanto, eu sugiro fortemente a / kinosearch rota mysql como eles cobriram um lote de terreno (decorrentes, stopwords, ponderação prazo, análise de token) que não beneficiam de encalhar com.

KinoSearch é provavelmente mais rápido do que a rota mysql, mas a rota mysql lhe dá mais amplamente usado software / ferramentas / desenvolvedor experiência-padrão. E você terá a capacidade de usar o poder do SQL para augement suas consultas de pesquisa FREETEXT.

Assim a menos que você está falando enormes conjuntos de dados e volumes de consulta insanos, meu dinheiro seria no mysql.

Você poderia tentar Lucene (a porta Perl é chamado Plucene). As pesquisas são incrivelmente rápido e eu sei que PDFBox já sabe como arquivos de índice de PDF com Lucene. PDFBox é Java, mas as chances são de que há algo muito em algum lugar similar no CPAN. Mesmo se você não consegue encontrar algo que já adiciona arquivos PDF para um índice de Lucene não deve ser mais do que algumas linhas de código para fazê-lo sozinho. Lucene lhe dará algumas opções mais procura do que simplesmente à procura de uma corda em um arquivo.

Há também uma maneira muito rápida e suja. Texto em um arquivo PDF é armazenado como texto simples. Se você abrir um PDF em um editor de texto ou use 'cordas' você pode ver o texto lá dentro. O lixo binário é normalmente incorporado fontes, imagens, etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top