Python: como obter metadados de imagens e PDFs

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.

  1. 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.
  2. Descobrir os autores de um documento e sua data de criação original. Isso pode ser útil em investigações forenses.
  3. 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.

Agora vamos começar a instalar as bibliotecas com os comando abaixo.

pip install exifread
pip install pymediainfo
pip install PyPDF2

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

Em seguida, vai aparecer um tela perguntando por uma confirmação. Confirme e depois cole o código que você copiou acima.

Agora vamos salvar o arquivo com o código.

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

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.

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.

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.

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.

  1. import os“: Importa o módulo para interagir com o sistema operacional, permitindo manipulação de arquivos e diretórios.
  2. 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.
  3. “import time”: Importa o módulo para manipulação de tempo, especialmente útil para converter timestamps.
  4. import exifread“: Importa a biblioteca para leitura de metadados EXIF de arquivos de imagem.
  5. “from pymediainfo import MediaInfo”: Importa a classe MediaInfo do módulo pymediainfo para leitura de metadados de arquivos de mídia.
  6. “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.

  • 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.

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.

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.

Criando CRUD MySQL com Python

Conectando ao MySQL com Python

Python: minhas portas TCP e UDP abertas

Principais Bibliotecas Python para Data Science: Manipulação e Visualização

Juliana Mascarenhas

Data Scientist and Master in Computer Modeling by LNCC.
Computer Engineer

Mais links:

https://www.python.org

https://www.online-python.com