Localizar PDF de Infográfico (preservando a arte)
Produz uma versão traduzida de um PDF de design que parece idêntico ao original, exceto que cada pedaço de texto corrente é trocado pelo idioma de destino. Funciona rasterizando a página, apagando o texto de origem e compondo a tradução de volta nas mesmas coordenadas — a arte (fotos, gráficos, gradientes, ícones, logotipos) nunca é regenerada.
Por que este pipeline (leia primeiro)
PDFs exportados de design geralmente armazenam o texto visível como contornos vetoriais (texto-para-curvas) ou
glifos Type3 — NÃO é texto editável, e não há uma maneira limpa de "substituir o texto".
Mas esses PDFs quase sempre também carregam uma camada de texto oculta e pesquisável cujas caixas de palavra estão
alinhadas aos pixels do texto visível. Essa camada fornece posições/tamanhos exatos de graça.
Portanto: não tente editar o texto e não use um modelo de imagem generativo para "repintar" o
fundo — isso altera a arte e não pode ser fiel aos pixels. Em vez disso, cubra e sobreponha:
apague cada trecho de glifo de origem e redesenhe a tradução no lugar. O fundo permanece fiel aos bytes.
Consulte references/pipeline.md para a lógica mais profunda e os modos de falha.
Fluxo de trabalho (execute os scripts em ordem da pasta scripts/ da skill)
Escolha um diretório de trabalho (padrão loc_work). Todos os scripts aceitam SOURCE.pdf [OUTDIR] [PAGE].
-
Analisar —
01_analyze.py SOURCE.pdf OUTDIRConfirma como o texto está armazenado, lista imagens incorporadas, renderiza a página. Observe a renderização e anote qualquer texto que esteja incorporado em uma imagem de gráfico/logotipo/foto (ele NÃO estará na camada de texto e deve ser tratado comomanual_labels). -
Extrair —
02_extract.py SOURCE.pdf OUTDIR(envLOC_KEEP='brandA|brandB'para manter mais strings no idioma de origem). Produzunits.json(uma entrada por linha de texto física, com bbox/cor/tamanho) etranslator_source.txt(um payload legível, com IDs) +half_*.png. -
Traduzir — despache um agente tradutor. Dê a ele
translator_source.txtehalf_0/1.png. Ele deve escreverOUTDIR/translation.json = {"<id>":"译文", ...}cobrindo cada id (repita os ids KEEP-AS-IS inalterados). Use o prompt emreferences/agent-prompts.md. -
Substituições (apenas se necessário) — escreva
OUTDIR/overrides.jsonpara os bits por documento que o motor automático não consegue ver: texto incorporado em imagens (manual_labels), texto dentro de controles finos com traçado, como pílulas/emblemas (solid_fill_labels), zonas de rótulo centralizadas (centered_id_ranges), edrop_ids. Esquema + como medir coordenadas:references/overrides.md. A maioria dos panfletos simples não precisa de substituições; os com muitos gráficos precisam de algumas. -
Compor —
03_compose.py SOURCE.pdf OUTDIR→final_zh.png. Este é o motor determinístico (reconstrução de fundo + redesenho de tamanho unificado). Ele não precisa de ajustes por documento. -
PDF + recortes —
04_pdf.py SOURCE.pdf OUTDIR OUT.pdf→ o PDF maiszh_L/zh_R.pngpara QA. -
Revisar e iterar — despache um agente revisor para comparar
zh_L/zh_R.pngcomhalf_0/1.png(prompt emreferences/agent-prompts.md). Corrija os achados editandooverrides.json/translation.jsone executando 03→04 novamente. Repita até ficar limpo. Problemas típicos e suas correções estão listados emreferences/pipeline.md.
O loop de 3 papéis (tradutor → compositor → revisor) espelha uma equipe de localização humana; rodar o revisor 1–2 vezes captura a cauda longa (texto de origem residual, blocos com tamanho incorreto).
O que o motor trata automaticamente (sem configuração)
- Painéis com texto claro EM fundo escuro E texto escuro em fundo claro (escolhe a cor de fundo correta).
- Painéis lisos, gradientes suaves e fundos de foto (escolhe preenchimento vs. inpaint por região).
- Entradas "fantasmas" da camada de texto que não têm glifos visíveis (puladas automaticamente — nunca desenhadas).
- Listas com marcadores onde o marcador foi engolido na caixa da primeira linha (realinhamento automático).
- Tamanho da fonte: tamanho original, unificado por bloco para que parágrafos/citações quebradas não fiquem desalinhados.
Padrões e requisitos
- Python:
pymupdf (fitz),numpy,opencv-python (cv2),Pillow. - Fonte CJK padrão
Hiragino Sans GB.ttc(macOS; W3 regular índice 0 / W6 negrito índice 2). Substitua viaoverrides.json"font"para outros idiomas/fontes. - Escala de renderização padrão 6.0 (≈432 dpi). Reduza para 4 para velocidade durante iterações; aumente para impressão.
- Mantenha no idioma de origem por padrão: URLs, e-mails, marcas comerciais/produtos, texto incorporado em logotipos, números/unidades simples e nomes próprios. O tradutor decide; a regex KEEP pré-marca os óbvios.
Arquivos de referência
references/pipeline.md— lógica, a árvore de decisão da estratégia de remoção e um catálogo de defeitos visuais comuns com suas correções exatas (rastros, resíduos, pílulas quebradas, colapso de tamanho).references/agent-prompts.md— prompts prontos para copiar e colar para o agente tradutor e revisor.references/overrides.md— esquema dooverrides.jsone como medir coordenadas de gráficos/pílulas.