Printdown

Converter PDF, Word e slides em Markdown para IA e RAG

Por ·

Assistentes como ChatGPT, Claude e Gemini conseguem trabalhar com documentos longos, mas a resposta nunca vai ser melhor do que o texto que eles recebem. Copie o texto de um visualizador de PDF e você terá uma quebra de linha no fim de cada linha, palavras cortadas por hifens, números de página no meio das frases e tabelas achatadas em uma sequência de células. Converter o arquivo para Markdown antes dá a você um texto limpo, que mantém a estrutura do documento e que pode ser revisado e enxugado antes de ir para qualquer lugar. Veja o que esperar de cada tipo de arquivo, como limpar o resultado e como usá-lo em prompts e em RAG.

Por que Markdown é um bom formato de entrada

  • A estrutura é preservada. Títulos, listas e tabelas são marcados com poucos caracteres comuns (##, -, |), então a hierarquia do documento continua ali, como texto.
  • Pouco excesso. O HTML envolve cada elemento em tags e atributos; o Markdown marca a mesma estrutura com um ou dois caracteres, então quase tudo o que você envia é conteúdo.
  • Títulos servem de referência. Você pode pedir ao modelo que olhe para “a seção Exceções”, que cite o título que usou ou cortar o arquivo nos títulos para a recuperação.

O que esperar de cada tipo de arquivo

Abra Qualquer arquivo para Markdown e solte um arquivo. O resultado aparece em uma caixa de texto editável com os botões Copiar, Baixar .md e Abrir no editor → PDF.

PDF

O conversor de PDF reconstrói parágrafos, títulos e tabelas a partir do layout da página e deduz os títulos pelo tamanho da fonte. Cabeçalhos e números de página que se repetem em todas as páginas costumam ser removidos, mas a primeira cópia de um cabeçalho pode ficar no início do arquivo. Palavras hifenizadas na quebra de linha saem separadas, como con- tratos. Layouts com várias colunas ou muito diagramados exigem mais limpeza, e as imagens não são extraídas.

Word

O conversor de Word mantém títulos, negrito, itálico, listas, tabelas, links e notas de rodapé, e também lê arquivos .doc antigos. Os títulos só são reconhecidos se o documento usar estilos de título: uma linha de texto grande em negrito continua sendo um parágrafo em negrito. O estilo Título e o Título 1 do Word viram ambos #, e os cabeçalhos e rodapés definidos no Word ficam de fora. (Se o documento vai para o GitHub e não para um chat, veja Transformar um documento do Word em README do GitHub.)

PowerPoint, com as anotações do orador

O conversor de PowerPoint processa os slides em ordem. Os títulos dos slides viram cabeçalhos ##, os marcadores viram listas, as tabelas viram tabelas Markdown e as anotações do orador entram como uma citação depois do slide correspondente:

## Por que mudar os preços

- Contas pequenas cancelam em 90 dias

- Planos por usuário confundem os compradores

  - A concorrência inclui o onboarding

> Mencione as três vendas perdidas. No máximo dois minutos.

Um slide sem o espaço reservado para título fica sem cabeçalho, e o texto dele acaba sob o título do slide anterior. Gráficos e SmartArt não são convertidos.

Excel, CSV e EPUB

O conversor de Excel transforma cada aba em uma tabela, com um cabeçalho ## Nome da aba quando há mais de uma. As células trazem o último valor calculado, não a fórmula, com o formato de número da célula (5% e não 0.05). Arquivos CSV usam a primeira linha como cabeçalho, seja qual for o separador. Um EPUB vira um único arquivo em ordem de leitura, com os títulos dos capítulos; livros com DRM não podem ser lidos.

Tabelas longas são fáceis de interpretar errado, tanto por pessoas quanto por modelos: cole só as linhas de que precisa e confira os números principais no original.

Checklist de limpeza antes de colar

Leia o texto convertido uma vez, do começo ao fim, e corrija isto:

  • Cabeçalhos e textos padrão: um cabeçalho repetido no topo, uma capa, avisos de confidencialidade, um sumário. O sumário são títulos sem conteúdo: ruído no prompt e trechos inúteis em uma base de conhecimento.
  • Números de página soltos ou linhas como “Página 3 de 12” dentro de um parágrafo.
  • Palavras quebradas. Clique em Abrir no editor → PDF, clique no painel de Markdown e pressione Ctrl+F (Cmd+F no Mac). Marque regexp, busque (\p{Ll})- (\p{Ll}) e substitua por $1$2. Revise as ocorrências uma a uma: guarda-chuva quebrado justamente no hífen, ou “pré- e pós-operatório”, devem mantê-lo.
  • Falsos títulos: linhas em negrito que na verdade são títulos de seção. Coloque ## na frente delas.
  • Tabelas quebradas: compare as tabelas do PDF com o original. Se alguma não tiver conserto, copie-a para uma planilha, salve como CSV e converta esse arquivo.
  • Imagens: deixe Incluir imagens desativado ao trabalhar com IA, para que cada imagem seja substituída pelo texto alternativo. Com a opção ativada, o .md baixado incorpora as imagens em base64: longas sequências de caracteres que ocupam o contexto e não dizem nada a um modelo de texto. Se um gráfico for importante, descreva-o em uma frase.
  • Tudo de que o modelo não precisa, como anexos, textos jurídicos ou dados pessoais.

Um resultado típico de PDF, do jeito que sai do conversor:

Revisão Trimestral de Negócios · Confidencial

# Revisão do terceiro trimestre

## Receita

As vendas cresceram, exceto no Nordeste, onde dois con- tratos foram adiados.

E depois da limpeza:

# Revisão do terceiro trimestre

## Receita

As vendas cresceram, exceto no Nordeste, onde dois contratos foram adiados.

Prompts que aproveitam a estrutura

Coloque primeiro o documento, entre delimitadores claros, e depois suas instruções e sua pergunta. Pedir o título da seção torna cada resposta fácil de conferir:

Responda usando apenas o documento abaixo. Se a resposta não estiver
nele, diga isso. Depois de cada resposta, informe o título da seção
que você usou.

<documento>
# Política de reembolso
## Quem pode pedir reembolso
…
</documento>

Pergunta: Um cliente corporativo pode pedir reembolso depois de 45 dias?

Outros padrões que aproveitam o Markdown:

  • Seção por seção: “Resuma cada seção ## em dois tópicos e mantenha os títulos.”
  • Anotações do orador: “As linhas que começam com > são anotações do orador. Transforme cada slide e suas anotações em um parágrafo de um relatório escrito.”
  • Comparações: cole dois documentos, cada um sob o seu próprio título #, e peça uma tabela com as diferenças.
  • Arquivos longos: se um documento não couber em uma mensagem, envie uma seção ## por vez em vez de cortá-lo em qualquer ponto.

Dividindo o Markdown em trechos para RAG

Ferramentas de geração aumentada por recuperação (RAG) guardam cada documento em muitos trechos pequenos (chunks) e entregam ao modelo só os que combinam com a pergunta. Um trecho que começa no meio de um assunto e termina no meio do seguinte combina mal; os títulos são pontos de corte naturais.

  • Corte nos títulos ##; se uma seção for muito longa, corte de novo nos ### ou entre parágrafos.
  • Nunca corte dentro de uma tabela, lista ou bloco de código. Se precisar dividir uma tabela longa, repita a linha de cabeçalho.
  • Guarde com cada trecho o caminho de títulos (Política de reembolso > Exceções) para que ele faça sentido sozinho.
  • Mantenha o nome do arquivo e a data como metadados, para que as respostas possam apontar para a fonte.
  • Em apresentações, um trecho por slide costuma funcionar.

Muitos frameworks de RAG e ferramentas de base de conhecimento têm um divisor próprio para Markdown ou por títulos; as mesmas regras valem para eles. Se o seu não tiver, este script em Python (só usa a biblioteca padrão) imprime uma linha JSON por seção:

import json, re, sys

def split_by_headings(md, max_level=2):
    """Corta o Markdown nos títulos até max_level (2 = # e ##)."""
    chunks, path, buf, in_code = [], [], [], False

    def flush():
        text = "\n".join(buf).strip()
        if text and not re.fullmatch(r"#{1,6}\s+.+", text):  # ignora seções vazias
            chunks.append({"section": " > ".join(t for _, t in path), "text": text})

    for line in md.splitlines():
        if line.lstrip().startswith(("```", "~~~")):
            in_code = not in_code
        m = None if in_code else re.match(r"(#{1,6})\s+(.+)", line)
        if m and len(m.group(1)) <= max_level:
            flush()
            level = len(m.group(1))
            path = [(l, t) for l, t in path if l < level] + [(level, m.group(2).strip())]
            buf = [line]
        else:
            buf.append(line)
    flush()
    return chunks

name = sys.argv[1]
with open(name, encoding="utf-8") as f:
    for chunk in split_by_headings(f.read()):
        print(json.dumps({"source": name, **chunk}, ensure_ascii=False))

Salve como split_md.py e rode python split_md.py relatorio.md > trechos.jsonl. Como o estilo Título e o Título 1 do Word viram ambos #, troque antes os # excedentes por ## se quiser o título do documento em todos os caminhos.

Privacidade: o que fica no seu dispositivo

A conversão roda dentro da aba do navegador com WebAssembly; o arquivo nunca é enviado. Isso muda no momento em que você cola o texto: a partir daí ele vai para o serviço de IA que você usa, sob os termos dele. Converter antes permite ver cada palavra que você vai compartilhar e apagar nomes, números de conta ou seções inteiras antes de enviar.

Limites e solução de problemas

  • PDFs digitalizados precisam de OCR, que o conversor não faz. Uma mensagem indica as páginas afetadas; adicione uma camada de texto com um aplicativo de OCR e depois converta.
  • Arquivos protegidos por senha precisam ser desbloqueados no aplicativo original; e-books com DRM não podem ser convertidos.
  • Arquivos com mais de 50 MB são recusados. Divida o documento ou exporte uma versão mais leve.
  • Um arquivo por vez: não há conversão em lote. Converta cada documento e cole todos em um único arquivo, cada um sob o seu próprio título #.
  • “O arquivo é complexo demais para ser convertido com segurança no navegador” significa que um limite de segurança foi atingido; tente com partes menores.
  • Ordem de leitura embaralhada em um PDF costuma vir de colunas ou caixas de texto flutuantes. Se você tiver o Word ou o PowerPoint original, converta esse arquivo: a estrutura dele é lida diretamente, em vez de deduzida pela posição na página.

Mais guias