Como extrair texto de um PDF? [fechadas]

152

Alguém pode recomendar uma biblioteca / API para extrair o texto e as imagens de um PDF? Precisamos ser capazes de acessar o texto que está contido nas regiões pré-conhecidas do documento, portanto a API precisará nos fornecer informações posicionais de cada elemento da página.

Gostaríamos que esses dados fossem impressos xmlou jsonformatados. Atualmente, estamos vendo o PdfTextStream, que parece muito bom, mas gostaria de ouvir as experiências e sugestões de outras pessoas.

Existem alternativas (comerciais ou gratuitas) para extrair texto de um PDF programaticamente?

Budda007
fonte
1
Para aqueles que necessitam algo realmente simples (sem info posição), este regex perl pode ser suficiente: /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Ele apenas procura o operador Tj / TJ, que indica todo o texto normal em um PDF.
Alex R
1
usar a biblioteca TomRoush PdfBox isso funciona bem no android
FaisalAhmed 17/17

Respostas:

113

Foi-me dado um arquivo pdf de 400 páginas com uma tabela de dados que eu tinha que importar - felizmente sem imagens. O Ghostscript funcionou para mim:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

O arquivo de saída foi dividido em páginas com cabeçalhos, etc., mas foi fácil escrever um aplicativo para remover linhas em branco etc., e absorver todos os 30.000 registros. -dSIMPLEe -dCOMPLEXnão fez diferença neste caso.

user2176753
fonte
37
No linux e cygwin, o comando é em gsvez de gswin64c. Funciona perfeitamente. Nenhuma porcaria paga patenteada. Isso simplesmente funciona.
Janes
4
Sim, funciona muito bem! Agora eu posso usar o "grep" com impunidade nos meus arquivos pdf. Desde que eu posso grep melhor do que posso ler, é uma vitória! (:-) Voto a favor.
David Elson
1
O único problema que tive com isso foi usá-lo em pdfs com fontes 'antigas' incorporadas. Funciona perfeitamente para PDFs gerados localmente, mas mais difícil com fontes obscuras. Caso contrário, um excelente scriptlet.
Jon M
o que -sDEVICE=txtwritefaz? Eu não entendo muito depois de ler Como usar o Ghostscript | Selecionando um dispositivo de saída
Ooker 6/04
Para saída stdout em vez de salvar como um arquivo de texto, use gswin64c -sDEVICE=txtwrite -o- input.pdf. Fonte (ligeiramente alterada por mim): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH
33

Desde hoje eu sei: a melhor coisa para a extração de texto de PDFs é o TET, o kit de ferramentas de extração de texto . TET faz parte da família de produtos PDFlib.com.

PDFlib.com é a empresa de Thomas Merz. Caso você não reconheça o nome dele: Thomas Merz é o autor da "Bíblia PostScript e PDF".

A primeira encarnação do TET é uma biblioteca . Provavelmente, é possível fazer tudo o que o Budda006 queria, incluindo informações posicionais sobre todos os elementos da página. Ah, e também pode extrair imagens. Ele recombina imagens fragmentadas em pedaços.

O pdflib.com também oferece outra encarnação dessa tecnologia, o plug-in TET para Acrobat . E a terceira encarnação é o PDFlib TET iFilter . Essa é uma ferramenta independente para as áreas de trabalho dos usuários. Ambos são gratuitos (como na cerveja) para uso particular e não comercial.

E é realmente poderoso. Muito melhor do que a extração de texto da própria Adobe. Ele extraiu texto para mim, onde outras ferramentas (incluindo a Adobe) cospem apenas lixo.

Acabei de testar a ferramenta autônoma de desktop, e o que eles dizem em suas páginas é verdadeiro. Tem uma linha de comando muito boa. Alguns dos meus arquivos de teste PDF "problemáticos" que a ferramenta manipulou para minha total satisfação.

De agora em diante, isso será minha recomendação para todos os requisitos de extração de texto em PDF sofisticados e desafiadores.

TET é simplesmente incrível. Ele detecta tabelas. Nas tabelas internas, identifica células que abrangem várias colunas. Ele identifica as linhas da tabela e o conteúdo de cada célula da tabela separadamente. Lida muito bem com hifenizações: remove hífens e restaura palavras completas. Ele suporta idiomas não ASCII (incluindo CJK, árabe e hebraico). Ao encontrar ligaduras, restaura os caracteres originais ...

De uma chance.

Kurt Pfeifle
fonte
32
Não há versão de teste, e US $ 440 são um pouco demais para "Experimente".
Ano Strniša
Este serviço está disponível através de uma API?
Bart
1
Eu testei, ele não reconhece colunas. Digitalizei uma primeira página do tablóide inglês. O texto foi dividido em três colunas no papel, mas esse plugin combinou as frases, fazendo com que parecesse bobão. O Ghostscript gratuito tem exatamente a mesma saída.
NoWhereToBeSeen
1
@RedHotScalability: Também BTW, o TET faz reconhecer colums se usado com os parâmetros corretos. Mas eu deixá-lo como um exercize ao ambicioso scripter JS para ler a documentação e descobrir como ...
Kurt Pfeifle
29

Uma ferramenta eficiente de linha de comando, de código aberto, livre de qualquer taxa, disponível no Linux e no Windows: simplesmente nomeado pdftotext. Essa ferramenta faz parte da biblioteca xpdf.

http://en.wikipedia.org/wiki/Pdftotext

131
fonte
4
Em uma nota lateral: use a -layoutopção para preservar tabelas, funciona muito bem.
Sebastian
12

Aqui está minha sugestão. Se você deseja extrair texto do PDF, importe o arquivo pdf para o Google Docs e exporte-o para um formato mais amigável, como .html, .odf, .rtf, .txt etc. Tudo isso usando a API do Google Drive . É gratuito * e robusto. Dê uma olhada em:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

Por ser uma API de descanso, é compatível com TODAS as linguagens de programação. Os links que eu publiquei acima têm exemplos úteis para muitas linguagens, incluindo: Java, .NET, Python, PHP, Ruby e outros.

Espero que ajude.

oabarca
fonte
2
Eu usei essa opção e não a recomendaria. A extração de texto em pdf do Google não é tão boa quanto muitas alternativas (especialmente para o inglês) e também é muito, muito pouco.
Björn Lindqvist
10

O PDFTextStream (que você disse estar vendo) agora é gratuito para aplicativos de thread único. Na minha opinião, sua qualidade é muito melhor do que outras bibliotecas (especialmente para coisas como fontes incorporadas funky, etc.).

Como alternativa, você deve dar uma olhada no Apache PDFBox , de código aberto.

Renaud
fonte
PdfTextStream não é suportado no Android. Existe algumas boas bibliotecas como esta disponíveis para android?
precisa saber é o seguinte
@FaisalAhmed e quanto ao PDFBox?
Renaud
Sim PdfBox também não é suportado no android .... tanto PdfTextStream e PdfBox usa alguma parte awt que não é suportado no android
FaisalAhmed
Estou usando esta biblioteca que funciona bem no android github.com/TomRoush/PdfBox-Android
FaisalAhmed 17/17
6

Um dos comentários aqui usou gs no Windows. Também tive algum sucesso com isso no Linux / OSX, com a seguinte sintaxe:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

Eu usei em dSIMPLEvez de dCOMPLEXporque o último gera 1 caractere por linha.

kvz
fonte
5

Como a pergunta é especificamente sobre ferramentas alternativas para obter dados de PDF como XML , você pode estar interessado em dar uma olhada na ferramenta comercial "ByteScout PDF Extractor SDK" que é capaz de fazer exatamente isso: extrair texto de PDF como XML junto com os dados de posicionamento (x, y) e as informações da fonte:

Texto no PDF de origem:

Products | Units | Price 

XML de saída:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

PS: além disso, também divide o texto em uma estrutura baseada em tabela.

Divulgação: Trabalho para o ByteScout

Eugene
fonte
3

A melhor coisa que posso pensar atualmente (na lista de ferramentas "simples") é o Ghostscript (a versão atual é a v.8.71) e o programa utilitário PostScript ps2ascii.ps. O Ghostscript o envia em seu libsubdiretório. Tente isto (no Windows):

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

Este comando processa as páginas 3-7 de input.pdf. Leia os comentários no ps2ascii.pspróprio arquivo para ver o que significam os números "estranhos" e informações adicionais ( eles indicam seqüências de caracteres, posições, larguras, cores, figuras, retângulos, fontes e quebras de página ... ). Para obter uma saída de texto "simples", substitua a -dCOMPLEXpeça por -dSIMPLE.

Kurt Pfeifle
fonte
2
Como você poderia imaginar, isso gera apenas o teste ASCII. Embora gratuito, não é uma ótima opção para o software que você planeja com outros idiomas que não o inglês.
userx
3
@ userx: Como você pode imaginar, este é um software livre: portanto, o código fonte está disponível. Possível estender o apoio de não-ASCII ...
Kurt Pfeifle
@ userx: hoje descobri o 'TET', o Text Extraction Toolkit do pdflib.com. Veja minha outra resposta.
Kurt Pfeifle
O ps2ascii do Ghostscript 9.07 funcionou perfeitamente no meu sistema OpenBSD. Acabei de converter um PDF de 526 páginas em texto sem formatação. Agora posso facilmente grep e extrair texto para anotações. Eu usei o comando simples ps2ascii book.pdf notes.txt. Se o seu documento é predominantemente ASCII, você está com sorte.
Clint Pachl
3

Eu sei que esse tópico é bastante antigo, mas essa necessidade ainda está viva. Leio muitos documentos, fórum e script e construo um novo e avançado que suporta pdf compactado e descompactado:

https://gist.github.com/smalot/6183152

Em alguns casos, a linha de comando é proibida por razões de segurança. Portanto, uma classe PHP nativa pode atender a muitas necessidades.

Espero que ajude todos

Sebastien Malot
fonte
1

O QuickPDF parece ser uma biblioteca razoável que deve fazer o que você deseja por um preço razoável.

http://www.quickpdflibrary.com/ - Eles têm uma avaliação de 30 dias.

Andrew Cash
fonte
0

Nos meus sistemas Macintosh, acho que o "Adobe Reader" faz um trabalho razoavelmente bom. Criei um alias na área de trabalho que aponta para o "Adobe Reader.app" e tudo o que faço é soltar um arquivo pdf no alias, o que o torna o documento ativo no Adobe Reader e, em seguida, no menu Arquivo, Escolha "Salvar como texto ...", atribua um nome e onde salvá-lo, clique em "Salvar" e pronto.

Dick Guertin
fonte
5
O OP procurou uma solução para extrair texto de um pdf programaticamente . Sua resposta propõe uma rotina manual.
Mkl