Mandar o miolo para a gráfica e esperar que ela encontre o problema é o jeito mais caro de fazer preflight. A gráfica pode aceitar o arquivo e imprimir errado, porque o que ela confere é o que o programa dela consegue ver.
Na nossa casa, a regra é outra: o arquivo só sai quando a gente mede. Este é o checklist que usamos, em oito grupos. Cada grupo diz o que confere, o comando que mede e o limite que reprova.
A frase que organiza o checklist vem do nosso procedimento de pré-impressão: medir, nunca deduzir. Sem medição, "está pronto" não vale. E "não medi" não é o mesmo que "não achei".
Os oito grupos
1. Geometria
O que confere: cada página tem o tamanho do corte mais a sangria nos quatro lados; o TrimBox está no corte; o BleedBox está na borda do papel.
pdfinfo -box miolo.pdf
Em um 6 x 9 com sangria de 3 mm, o esperado é MediaBox 0 0 449,01 665,01, BleedBox igual ao papel e TrimBox 8,50 8,50 440,51 656,51. A explicação de cada número está em sangria, corte e zona de segurança.
2. Caderno e ficha
O que confere: o total de páginas é múltiplo de 4, e a ficha catalográfica declara o número real de páginas.
pdfinfo miolo.pdf | awk '/^Pages/{print $2 % 4}'
A saída precisa ser 0. Para a ficha, leia a página dela com pdftotext -f 2 -l 2 miolo.pdf - e compare o "N p." com o total. Campo que não existe (ISBN, editora, CDD) entra como "a definir", nunca inventado.
3. Páginas
O que confere: capítulo em página ímpar, nenhuma página sem texto, e as regras do seu modelo (por exemplo, Parte em página par).
total=$(pdfinfo miolo.pdf | awk '/^Pages/{print $2}')
for p in $(seq 1 "$total"); do
n=$(pdftotext -f "$p" -l "$p" miolo.pdf - | wc -w)
[ "$n" -eq 0 ] && echo "página $p sem texto"
done
O poppler imprime no word list em página sem texto. É normal. A medição da paridade dos capítulos está no artigo capítulo em página ímpar sem página em branco.
4. Cor e PDF/X
O que confere: nenhum RGB, perfil declarado (OutputIntent), fontes embutidas, texto de corpo em K puro, nenhum preto de quatro cores, sem link nem anotação.
pdffonts miolo.pdf # coluna "emb": yes em todas
gs -q -o - -sDEVICE=inkcov miolo.pdf # C, M e Y devem ser 0 em página de texto
O restante (OutputIntent, chaves de identificação e anotações) usa a biblioteca pikepdf, como no artigo sobre CMYK, K puro e PDF/X-1a com Ghostscript.
5. Tinta total (TAC)
O que confere: a soma das quatro tintas no ponto mais carregado do miolo.
gs -dBATCH -dNOPAUSE -dSAFER -q -sDEVICE=tiff32nc -r40 \
-sOutputFile=p%04d.tif miolo.pdf
Depois, leia cada TIFF com Pillow e numpy, some os canais e divida por 255 vezes 100. O teto do nosso miolo é 300%, provisório, porque o papel ainda não foi definido. A regra de bolso: papel sem revestimento segura 240 a 260% e couché, 300 a 330%. Acima disso a tinta não seca, repinta na folha seguinte e borra no vinco. O limite real é da gráfica.
6. Sangria de verdade
O que confere: onde há arte que deve sangrar, a cor chega à borda do papel; onde não há, a borda é branca. O comando de leitura do canto está no artigo de sangria.
7. Zona de segurança
O que confere: nenhum texto a menos de 5 mm do corte.
import re, subprocess, sys
pdf, sangria_mm, minimo_mm = sys.argv[1], 3, 5
PT = 72 / 25.4
x = subprocess.run(["pdftotext", "-bbox", pdf, "-"],
stdout=subprocess.PIPE, text=True).stdout
S = sangria_mm * PT
pior = (1e9, None)
for n, pg in enumerate(re.split(r"<page ", x)[1:], 1):
w, h = [float(v) for v in re.match(
r'width="([\d.]+)" height="([\d.]+)"', pg).groups()]
for m in re.finditer(r'<word xMin="([\d.]+)" yMin="([\d.]+)" '
r'xMax="([\d.]+)" yMax="([\d.]+)">', pg):
x0, y0, x1, y1 = [float(v) for v in m.groups()]
d = min(x0 - S, (w - S) - x1, y0 - S, (h - S) - y1) / PT
if d < pior[0]: pior = (d, n)
print(f"texto mais próximo do corte: {pior[0]:.1f} mm "
f"(página {pior[1]}), mínimo {minimo_mm} mm")
sys.exit(1 if pior[0] < minimo_mm else 0)
Lembrete: a caixa que o pdftotext -bbox devolve é a da fonte, e não a da tinta. Ela é conservadora. Se ela passa, a tinta passa. Se reprova, olhe a página antes de mudar o desenho.
8. Texto
O que confere: o texto do autor chegou inteiro ao PDF final e nada foi acrescentado. O script e a lógica estão em conferir o PDF final do livro.
Um checklist que nunca reprovou nada não vale
Esta é a parte que a maioria dos checklists não tem. Um gate que nunca foi visto reprovando pode estar quebrado sem ninguém saber. A prova é o teste de mutação: estragar o arquivo de propósito, de seis jeitos, e conferir que o gate reprova, e no grupo certo.
Montamos esse teste para este cluster, com um miolo de 16 páginas em 6 x 9 e um script que roda os grupos 1, 2, 4, 5 e 7. O arquivo bom foi aprovado. Os seis estragados foram reprovados, cada um no grupo esperado:
| Defeito introduzido | Grupo que reprovou |
| Sem TrimBox em todas as páginas | Geometria |
| PDF cru do compilador, em RGB, sem fechamento | Geometria, PDF/X e cor |
| Uma página a menos (15 páginas) | Caderno |
| Texto em preto de quatro cores | Cor e tinta (400% contra o teto de 300%) |
| Um link clicável | Link e anotação |
| Texto fora da zona de segurança | Zona de segurança |
No nosso gate de produção, o teste de mutação tem seis arquivos também, e os seis foram reprovados, incluindo um capítulo em página par e um painel com 400% de tinta. Regra: se você escrever um gate novo, estrague um arquivo para ele antes de confiar nele.
Registre o que foi medido
O resultado do checklist não deve ficar na cabeça de quem rodou. O pacote que entregamos à gráfica leva o miolo, a capa e um arquivo de especificação com as medidas lidas do próprio PDF e com o SHA-256 de cada arquivo:
sha256sum miolo.pdf
pdfinfo -box miolo.pdf
Guardar o SHA-256 resolve uma dúvida clássica: "o arquivo que a gráfica imprimiu é o mesmo que nós aprovamos?". Se o código bate, é. Se alguém trocar o arquivo depois da conferência, o código muda. E o campo que a gráfica ainda não respondeu, como o papel ou o perfil de cor, entra como "a definir", e nunca como um valor deduzido.
O erro que custa caro
Confiar que a conferência da gráfica substitui a sua. Ela é uma segunda leitura, com o programa dela, e não a primeira. E o outro erro, que é o oposto: montar um checklist que aprova tudo, porque ninguém o testou contra um arquivo defeituoso.
Quando NÃO usar
Para um arquivo apenas digital, os grupos 1, 4, 5, 6 e 7 não se aplicam. Eles são do miolo de impressão. Os grupos 2, 3 e 8 valem para qualquer PDF paginado.
Alternativa sem o nosso ambiente
Todos os comandos usam poppler, Ghostscript, pikepdf, numpy e Pillow, que são gratuitos. O preflight do Acrobat e o pdfToolbox fazem uma conferência comercial parecida. Nenhum deles substitui medir os números do seu livro. Não há nada que exija a nossa conta ou o nosso servidor.
O que o Claude faz hoje, e como fazer sem ele
Hoje o Claude roda o gate completo e o teste de mutação a cada versão do miolo e relata o que reprovou. Sem ele, você roda os comandos do checklist na ordem e registra o resultado de cada grupo.
Onde entra na operação
O checklist é o último filtro antes de o miolo entrar no pacote da gráfica, que reúne miolo, capa e uma especificação com as medidas lidas do próprio PDF. O desenho completo da esteira está no guia Como produzimos o miolo de um livro profissional sem InDesign.
Baixe, para guardar: checklist de preflight do miolo, com comando e limite por item (PDF).
Versões usadas neste artigo: veja a matriz de versões.



