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.