# ADR-053 — PDF pesquisável: gerado do dado bruto; externo sem OCR

| Campo | Valor |
|---|---|
| **Status** | Aceito (2026-10-23) |
| **Data** | 2026-10-23 |
| **Plano de origem** | `wiki/implementation-phases/P29-conformidade-pntp.md`, `P15-publicacoes-arquivo.md` |
| **Relacionadas** | ADR-001, ADR-002, ADR-017, ADR-024, ADR-026, ADR-027, ADR-028, ADR-030, ADR-035 |

## Contexto

Diário Oficial, atos e relatórios precisam ser **pesquisáveis**. PDF gerado como imagem ou PDF
escaneado externo não têm camada de texto; indexar o binário não resolve. Fazer OCR de todo PDF
externo adiciona dependência pesada, custo, tempo de fila e risco de privacidade — e promete uma
capacidade que o produto não controla.

O sistema já guarda o dado bruto (AST/matérias/tabelas) no banco e serve arquivos pelo Media
(ADR-026/030). A decisão é definir qual PDF é pesquisável e como a busca o indexa, sem transformar
o produto em OCR universal.

## Decisão

1. **PDF gerado é pesquisável por construção:** Diário Oficial, atos e relatórios gerados pelo
   sistema são produzidos a partir do **dado bruto no banco** (AST/matérias), com camada de texto
   real. O mesmo texto estruturado alimenta a busca; o PDF é um artefato de apresentação.
2. **A busca não indexa binário:** indexa o texto estruturado que originou o PDF (ou
   título/resumo quando a edição é externa). Nada de extrair texto de PDF no request.
3. **PDF externo não passa por OCR:** anexo enviado pelo operador é armazenado no Media e recebe o
   atestado `pdf_pesquisavel` (`true|false|unknown`). O CMS avisa quando não há camada de texto e
   não promete pontuação/ busca integral.
4. **Sem OCR no produto padrão:** OCR é decisão separada (dependência, custo, fila, privacidade)
   e exige ADR própria. Conversores DOCX/HTML → AST continuam no P9, mas não OCR.
5. **Determinismo e imutabilidade:** a edição publicada é imutável; correção gera nova edição/errata.
   O PDF gerado tem nome/checksum determinísticos e é servido same-origin via Media.
6. **Sem PDF como dado aberto principal:** dados abertos continuam em CSV/JSON/XML (ADR-049); PDF
   é apresentação e não substitui o dado legível por máquina.

## Justificativa — alternativas descartadas

| Alternativa | Por que não |
|---|---|
| OCR em todo PDF externo | Dependência pesada, custo por página, fila e risco de PII; não é o padrão. |
| Indexar bytes do PDF | Não produz texto confiável; busca não encontra conteúdo. |
| Gerar PDF a partir do HTML renderizado e não do dado | Perde estrutura e determinismo; pode incluir lixo de layout. |
| PDF como única saída de dados abertos | Viola ADR-018/049; PDF não é dado legível por máquina. |
| Prometer busca de anexo externo sem atestado | Expectativa falsa; operador não sabe se o documento é pesquisável. |

## Consequências

**Positivas**
- Diário/atos gerados são pesquisáveis sem OCR e com texto consistente.
- O operador sabe se o anexo externo é pesquisável; o CMS avisa.
- Sem dependência de OCR no núcleo e sem PII enviada a terceiro.

**Custos / riscos**
- A geração precisa de template determinístico e teste de texto no PDF.
- PDF externo continua não pesquisável; a substituição por versão pesquisável é manual.
- Se o cliente exigir OCR, será um projeto separado com DPIA e limite de uso.

## Exemplo mínimo

```text
diario_edicoes.conteudo (AST) ──► PDF com camada de texto ──► media.stream
        └──────────────────────► search_text / search_tsv
```

```php
// anexo externo: atestado, não extração
$media->pdf_pesquisavel = PdfTextLayer::detect($file); // true|false|unknown
```

## Verificação

- PDF gerado do Diário contém texto selecionável e a busca encontra uma expressão do conteúdo.
- PDF externo sem camada de texto não é indexado como se fosse pesquisável; CMS mostra o aviso.
- Nenhuma chamada de OCR no fluxo de upload/publicação.
- `pdf_pesquisavel=unknown` não vira promessa de busca; `false` bloqueia a expectativa.
- PDF gerado é determinístico para o mesmo dado e mantém `ETag`/checksum.
