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.