Extraia Texto, Links e Imagens de PDFs com Python: Guia Completo

Extraindo Informações de PDFs com Python: Um Guia Completo

Python, conhecido por sua versatilidade, frequentemente exige que desenvolvedores lidem com diversos tipos de arquivos, buscando informações neles para processamento. O formato PDF (Portable Document Format) é um dos mais comuns nesse cenário.

Arquivos PDF podem conter texto, imagens e hiperlinks. Ao trabalhar com dados em Python, pode ser necessário extrair informações de documentos PDF. Diferente de estruturas de dados como tuplas, listas e dicionários, obter dados de PDFs pode parecer um desafio.

Felizmente, existem bibliotecas que facilitam a manipulação de PDFs e a extração de dados. Exploraremos como extrair textos, links e imagens de arquivos PDF, utilizando essas ferramentas. Para acompanhar, você pode baixar um arquivo PDF de teste e salvá-lo no mesmo diretório do seu programa Python.

Extraindo Texto com PyPDF2

Para extrair texto, usaremos a biblioteca PyPDF2. Ela é gratuita e de código aberto, permitindo manipular páginas de PDF (mesclar, cortar, transformar), adicionar dados personalizados e recuperar texto de arquivos PDF.

Para usar o PyPDF2, primeiro, você precisa instalá-lo com o pip, o instalador de pacotes do Python:

1. Verifique se o pip está instalado executando:

pip --version

Se não houver um número de versão, instale o pip.

2. Baixe o script de instalação do pip aqui. Salve o arquivo como get-pip.py.

3. Abra o terminal, navegue até o diretório onde salvou o get-pip.py e execute:

sudo python3 get-pip.py

Isso instalará o pip.

4. Verifique a instalação do pip com:

pip --version

Você deve ver um número de versão.

Agora com pip instalado, podemos utilizar o PyPDF2.

1. Instale PyPDF2 com:

pip install PyPDF2

2. Crie um arquivo Python e importe a classe PdfReader:

from PyPDF2 import PdfReader

A classe PdfReader permite abrir, ler o conteúdo e extrair texto de arquivos PDF.

3. Abra o arquivo PDF criando uma instância de PdfReader, passando o nome do arquivo:

reader = PdfReader('games.pdf')

Agora, reader está pronto para acessar o conteúdo do PDF.

4. Imprima a quantidade de páginas para confirmar se tudo está funcionando:

print(len(reader.pages))

Saída:

5

5. Acesse a primeira página (índice 0):

page1 = reader.pages[0]

page1 contém a primeira página do PDF.

6. Extraia o texto da primeira página:

textPage1 = page1.extract_text()

O texto extraído está em textPage1.

7. Para visualizar o texto, imprima textPage1. O código completo é:

# import the PdfReader class from PyPDF2
from PyPDF2 import PdfReader

# create an instance of the PdfReader class
reader = PdfReader('games.pdf')

# get the number of pages available in the pdf file
print(len(reader.pages))

# access the first page in the pdf
page1 = reader.pages[0]

# extract the text in page 1 of the pdf file
textPage1 = page1.extract_text()

# print out the extracted text
print(textPage1)

Saída:

Extraindo Links com PyMuPDF

Para extrair links, usaremos PyMuPDF, uma biblioteca Python para analisar e manipular PDFs. Ela requer Python 3.8 ou superior.

1. Instale PyMuPDF:

pip install PyMuPDF

2. Importe PyMuPDF:

import fitz

3. Abra o PDF:

doc = fitz.open("games.pdf")

4. Imprima o número de páginas:

print(doc.page_count)

Saída:

5

5. Carregue a página (ex: a primeira, índice 0):

page = doc.load_page(0)

6. Extraia os links:

links = page.get_links()

Os links estão em links.

7. Imprima os links:

print(links)

Saída:

Cada link é representado por um dicionário, com o link na chave “uri”.

8. Itere e imprima os links:

import fitz

# Open the PDF file
doc = fitz.open("games.pdf")

# Print out the number of pages
print(doc.page_count)

# load the first page from the PDF
page = doc.load_page(0)

# extract all links from the page and store it under - links
links = page.get_links()

# print the links object
#print(links) 

# print the actual links stored under the key "uri"
for obj in links:
  print(obj["uri"])

Saída:

5
https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/
https://sparkian.com/
https://www.codemonkey.com/

9. Refatorando para reutilização: Crie funções para extrair e imprimir links de qualquer PDF:

import fitz

# Extract all the links in a PDF document
def extract_link(path_to_pdf):
  links = []
  doc = fitz.open(path_to_pdf)

  for page_num in range(doc.page_count):
    page = doc.load_page(page_num)
    page_links = page.get_links()
    links.extend(page_links)
  return links

# print out all the links returned from the PDF document
def print_all_links(links):
  for link in links:
    print(link["uri"])

# Call the function to extract all the links in a pdf
# all the return links are stored under all_links
all_links = extract_link("games.pdf")

# call the function to print all links in the PDF
print_all_links(all_links)

Saída:

https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/
https://sparkian.com/
https://www.codemonkey.com/
https://scratch.mit.edu/
https://www.tynker.com/
https://codecombat.com/
https://lightbot.com/
https://sparkian.com

extract_link() extrai links de todas as páginas do PDF. print_all_links() imprime os links.

Extraindo Imagens com PyMuPDF e PIL

Para extrair imagens, usaremos PyMuPDF, io e PIL (Python Imaging Library).

1. Importe as bibliotecas:

import fitz
from io import BytesIO
from PIL import Image

2. Abra o PDF:

doc = fitz.open("games.pdf")

3. Carregue a página (ex: a primeira, índice 0):

page = doc.load_page(0)

4. Obtenha as referências cruzadas das imagens:

image_xref = page.get_images()
print(image_xref)

Saída:

[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]

get_images() retorna uma lista de tuplas com informações sobre a imagem. O primeiro elemento (ex: 7) é a referência cruzada (xref).

5. Extraia o valor xref da imagem da lista de tuplas:

# get xref value of the image
xref_value = image_xref[0][0]
print(xref_value)

Saída:

[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]
7

6. Extraia a imagem usando a referência xref:

img_dictionary = doc.extract_image(xref_value)

A função retorna um dicionário com dados binários e metadados da imagem.

7. Obtenha a extensão do arquivo:

# get file extenstion
img_extension = img_dictionary["ext"]
print(img_extension)

Saída:

png

8. Extraia os dados binários da imagem:

# get the actual image binary data
img_binary = img_dictionary["image"]

9. Crie um objeto BytesIO:

# create a BytesIO object to work with the image bytes
image_io = BytesIO(img_binary)

10. Abra a imagem com PIL:

# open the image using Pillow
image = Image.open(image_io)

11. Defina o caminho para salvar a imagem:

output_path = "image_1.png"

12. Salve a imagem e feche o objeto BytesIO:

# save the image
image.save(output_path)

# Close the BytesIO object 
image_io.close()

Código completo para extrair uma imagem:

import fitz
from io import BytesIO
from PIL import Image

doc = fitz.open("games.pdf")
page = doc.load_page(0)

# get a cross reference(xref) to the image
image_xref = page.get_images()

# get the actual xref value of the image
xref_value = image_xref[0][0]

# extract the image
img_dictionary = doc.extract_image(xref_value)

# get file extenstion
img_extension = img_dictionary["ext"]

# get the actual image binary data
img_binary = img_dictionary["image"]

# create a BytesIO object to work with the image bytes
image_io = BytesIO(img_binary)

# open the image using PIL library 
image = Image.open(image_io)

#specify the path where you want to save the image
output_path = "image_1.png"

# save the image
image.save(output_path)

# Close the BytesIO object 
image_io.close()

Após executar o código, você encontrará a imagem extraída no mesmo diretório, com o nome image_1.png:

Conclusão

Experimente refatorar os códigos apresentados, tornando-os mais reutilizáveis, como no exemplo de extração de links. Assim, seu programa poderá extrair textos, links e imagens de qualquer PDF, apenas passando o arquivo. Continue praticando e explorando outras possibilidades! Além disso, você também pode analisar algumas das melhores APIs de PDF para suas necessidades de negócio.