Nesse tutorial vamos mostrar como usar um script em python para obter metadados de imagens e PDFs.
Esse script pode ser interessante em cenários em que você deseja fazer uma investigação sobre os arquivos. Como exemplo temos algumas possibilidades abaixo.
- Obter a geolocalização de uma foto. Isso pode ser útil em uma investigação sobre o local onde o fotografo estava no momento da foto.
- Descobrir os autores de um documento e sua data de criação original. Isso pode ser útil em investigações forenses.
- Descobrir o software usado na edição ou criação, sistema operacional, configurações da câmera usada entre outras informações úteis.
Instalando as bibliotecas necessárias para o python
Inicialmente, vamos começar a instalar as bibliotecas necessárias para que nosso script em python funcione corretamente. Estamos usando como exemplo uma máquina Windows, mas o processo é semelhante em uma máquina Linux.
Para isso, vamos acessar um terminal de uma máquina que já tem o python instalado. Se tiver dúvidas em como instalar o python pode ver esse post: Instalar Python no Windows.
![python_windows_6](https://simplificandoredes.com/wp-content/uploads/2024/07/python_windows_6.webp)
Agora vamos começar a instalar as bibliotecas com os comando abaixo.
pip install exifread
![install_python_bib1](https://simplificandoredes.com/wp-content/uploads/2024/07/install_python_bib1.webp)
pip install pymediainfo
![install_python_bib2](https://simplificandoredes.com/wp-content/uploads/2024/07/install_python_bib2.webp)
pip install PyPDF2
![install_python_bib3](https://simplificandoredes.com/wp-content/uploads/2024/07/install_python_bib3.webp)
Executando o código para metadados de imagens e PDFs
Agora, vamos copiar o código abaixo e colar em um arquivo com extensão “.py”. Nesse caso, estamos dando o nome de “metadata.py” para nosso arquivo.
import os
import sys
import time
import exifread
from pymediainfo import MediaInfo
from PyPDF2 import PdfReader
def print_media_metadata(file_path):
try:
media_info = MediaInfo.parse(file_path)
for track in media_info.tracks:
for key, value in track.to_data().items():
print(f"{key}: {value}")
except Exception as e:
print(f"Error: {e}")
def print_exif_metadata(file_path):
def get_if_exist(data, key):
return data[key] if key in data else None
def convert_to_degrees(value):
d = float(value.values[0].num) / float(value.values[0].den)
m = float(value.values[1].num) / float(value.values[1].den)
s = float(value.values[2].num) / float(value.values[2].den)
return d + (m / 60.0) + (s / 3600.0)
try:
with open(file_path, 'rb') as f:
tags = exifread.process_file(f)
for tag in tags.keys():
print(f"EXIF TAG {tag}: {tags[tag]}")
lat_ref = get_if_exist(tags, 'GPS GPSLatitudeRef')
lat = get_if_exist(tags, 'GPS GPSLatitude')
lon_ref = get_if_exist(tags, 'GPS GPSLongitudeRef')
lon = get_if_exist(tags, 'GPS GPSLongitude')
if lat and lon and lat_ref and lon_ref:
lat = convert_to_degrees(lat)
if lat_ref.values[0] != 'N':
lat = -lat
lon = convert_to_degrees(lon)
if lon_ref.values[0] != 'E':
lon = -lon
print(f"=====Geolocation: Latitude: {lat}, Longitude: {lon}")
except Exception as e:
print(f"Error: {e}")
def print_pdf_metadata(file_path):
try:
reader = PdfReader(file_path)
info = reader.metadata
for key, value in info.items():
print(f"{key}: {value}")
if info.title:
print(f"=====Título: {info.title}")
if info.subject:
print(f"=====Assunto: {info.subject}")
if info.keywords:
print(f"=====Palavras-chave/Keywords: {info.keywords}")
if info.producer:
print(f"=====Produ.: {info.producer}")
if info.creation_date:
print(f"=====Data de criação: {info.creation_date}")
if info.modification_date:
print(f"=====Data de modificação: {info.modification_date}")
if info.author:
print(f"=====Autor: {info.author}")
if info.creator:
print(f"=====Criador: {info.creator}")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("python script.py <file>")
sys.exit(1)
file_path = sys.argv[1]
print_media_metadata(file_path)
if file_path.lower().endswith(('.jpg', '.jpeg', '.png', 'webp', 'avif')):
print_exif_metadata(file_path)
elif file_path.lower().endswith('.pdf'):
print_pdf_metadata(file_path)
Se você estiver no Windows, você pode digitar no terminal o comando abaixo.
Notepad metadata.py
![create_notetad_metadata](https://simplificandoredes.com/wp-content/uploads/2024/07/create_notetad_metadata.webp)
Em seguida, vai aparecer um tela perguntando por uma confirmação. Confirme e depois cole o código que você copiou acima.
![confirm_create_notepad](https://simplificandoredes.com/wp-content/uploads/2024/07/confirm_create_notepad.webp)
Agora vamos salvar o arquivo com o código.
![save_python_code](https://simplificandoredes.com/wp-content/uploads/2024/07/save_python_code.webp)
Usando uma imagem simples
Agora, vamos executar nosso script “metadata.py” e vamos passar como parâmetro uma imagem “jpg”. Para isso, vamos usar o comando abaixo.
O arquivo de imagem que estamos passando é o “ssh_server_Windows_7.jpg”, você pode escolher um arquivo que você copiou para a pasta do seu script em python.
python metadata.py ssh_server_Windows_7.jpg
![exec_prim](https://simplificandoredes.com/wp-content/uploads/2024/07/exec_prim.webp)
Em seguida, vamos ver que temos algumas informações de metadados. Nesse caso, as informações são bem restritas porque não temos informações de exif na imagem que usamos.
![result_prim_exec](https://simplificandoredes.com/wp-content/uploads/2024/07/result_prim_exec.webp)
Usando uma imagem que tem informações exif
Agora vamos realizar o mesmo procedimento descrito acima com uma imagem com exif. Nesse caso estamos usando uma imagem que tem informações sobre o dispositivo usado para tirar a foto e informações de GPS, data e configuração da câmera.
![foto_exif](https://simplificandoredes.com/wp-content/uploads/2024/07/foto_exif.webp)
Temos os itens 1 a 4 demonstrando informações descritas abaixo.
- Item 1: Informação sobre o dispositivo usado para tirar a foto.
- Item 2: Informação de geolocalização como latitude e longitude. Isso possibilita investigar o local onde foi retirada a foto.
- Item 3: Informação sobre a data original da imagem e sua digitalização.
- Item 4: Informação sobre a configuração da câmera do dispositivo como: disparo de flash, distancia focal entre outras.
Obtendo metadados de um arquivo PDF
Agora vamos passar um arquivo PDF como parâmetro para nosso código. Depois de executar o nosso script veremos algo semelhante a figura abaixo.
![pdf_metadados](https://simplificandoredes.com/wp-content/uploads/2024/07/pdf_metadados.webp)
Nesse caso, podemos ver informações sobre a data de criação do documento PDF e o software usado para criar o documento. Além disso, temos também a informação sobre o sistema operacional usado, nesse caso o Windows.
Caso queira aumentar seu conhecimento na área, sugiro esses livros.
Explicando o código para metadados de imagens e PDFs
A seguir vamos explicar o código usado no script para metadados de imagens e PDFs.
Bibliotecas do python para metadados de imagens e PDFs
Primeiramente vamos ver as bibliotecas do python que vamos importar. Abaixo, vamos descrever a função de das 6 bibliotecas usadas nesse script.
![code_biblio](https://simplificandoredes.com/wp-content/uploads/2024/07/code_biblio.webp)
- “import os“: Importa o módulo para interagir com o sistema operacional, permitindo manipulação de arquivos e diretórios.
- “import sys“: Importa o módulo para acessar variáveis e funções que interagem fortemente com o interpretador Python, como argumentos da linha de comando.
- “import time”: Importa o módulo para manipulação de tempo, especialmente útil para converter timestamps.
- “import exifread“: Importa a biblioteca para leitura de metadados EXIF de arquivos de imagem.
- “from pymediainfo import MediaInfo”: Importa a classe MediaInfo do módulo pymediainfo para leitura de metadados de arquivos de mídia.
- “from PyPDF2 import PdfReader”: Importa a classe PdfReader do módulo PyPDF2 para leitura de metadados de arquivos PDF.
pymediainfo para obter metadados de arquivos de mídia
Em seguida, vamos usar o pymediainfo para ler e imprimir os metadados de arquivos de mídia. Abaixo, vamos detalhar partes do código.
![print_media_metadata](https://simplificandoredes.com/wp-content/uploads/2024/07/print_media_metadata.webp)
- “MediaInfo.parse(file_path)“: Analisa o arquivo e obtém metadados.
- “track.to_data().items()”: Itera sobre pares chave-valor dos metadados.
Python: metadados EXIF de arquivos de imagem
Agora vamos descrever a função “print_exif_metadata(file_path)” que vai obter os metadados EXIF dos arquivos de imagem que analisarmos.
![code_exif_pt](https://simplificandoredes.com/wp-content/uploads/2024/07/code_exif_pt.webp)
Agora vamos descrever as partes importantes do código que analisa os metadados EXIF. Nesse caso, estamos incluindo a tentativa de obtenção de informações de geolocalização.
- “get_if_exist(data, key)“: Função auxiliar para verificar a existência de uma chave.
- convert_to_degrees(value)“: Função auxiliar para converter valores GPS em graus.
- “exifread.process_file(f)“: Processa o arquivo e obtém metadados EXIF.
Python metadados de PDF
Agora vamos usar o PdfReader para obter informações de metadados de arquivos PDF. Nesse caso, estamos colhendo informações como: título, assunto, palavras-chave, produtor, data de criação, data de modificação, autor e criador.
def print_pdf_metadata(file_path):
try:
reader = PdfReader(file_path)
info = reader.metadata
for key, value in info.items():
print(f"{key}: {value}")
if info.title:
print(f"=====Título: {info.title}")
if info.subject:
print(f"=====Assunto: {info.subject}")
if info.keywords:
print(f"=====Palavras-chave/Keywords: {info.keywords}")
if info.producer:
print(f"=====Produ.: {info.producer}")
if info.creation_date:
print(f"=====Data de criação: {info.creation_date}")
if info.modification_date:
print(f"=====Data de modificação: {info.modification_date}")
if info.author:
print(f"=====Autor: {info.author}")
if info.creator:
print(f"=====Criador: {info.creator}")
except Exception as e:
print(f"Error: {e}")
Agora vamos detalhar as principais funções do trecho de código acima.
- PdfFileReader(f): Cria um objeto leitor de PDF.
- reader.metadata: Obtém metadados do documento.
A parte principal do nosso script em Python
Agora vamos mostrar as principais funções que estão na parte “__main__” de nosso script em python.
![code_main](https://simplificandoredes.com/wp-content/uploads/2024/07/code_main.webp)
Vamos detalhar as funções que serão usadas para obter os metadados utilizando a extensão do arquivo passado como parâmetro.
- “if name == “main””: Verifica se o script está sendo executado diretamente.
- “if len(sys.argv) < 2”: Verifica se um argumento de arquivo foi passado.
- “file_path = sys.argv[1]”: Obtém o caminho do arquivo a partir dos argumentos da linha de comando.
Veja mais:
Mesclando arquivos PDFs: REGEX e PyPDF2 com Python
Livros pra dar ideias na área de segurança.
Conectando ao MySQL com Python
Python: minhas portas TCP e UDP abertas
Principais Bibliotecas Python para Data Science: Manipulação e Visualização
![](https://simplificandoredes.com/wp-content/uploads/2021/10/Untitled-design-1-1024x1024.jpg)
Juliana Mascarenhas
Data Scientist and Master in Computer Modeling by LNCC.
Computer Engineer
Mais links: