---
nome: PDF bonito
descricao: gerar PDF bem diagramado (HTML → PDF pelo Chrome) e ler, juntar e separar PDF com pypdf
quando: pdf, pdfs, em pdf, gerar pdf, exportar pdf, orçamento, proposta comercial, apostila, e-book, ebook, certificado, juntar pdf, extrair texto
autor: PrimoCode
---
**Gerar: escreva HTML e imprima com o Chrome.** HTML e CSS diagramam melhor que
qualquer biblioteca de PDF, e o Chrome já está na máquina (é o navegador que o
PrimoCode controla).

1. Um `documento.html` com o CSS de impressão:
```css
@page { size: A4; margin: 18mm 16mm; }
html { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
h2 { break-after: avoid; }
tr, .cartao, figure { break-inside: avoid; }
.capitulo { break-before: page; }
```
   Sem o `print-color-adjust`, o Chrome tira as cores de fundo. Fonte do Google
   Fonts funciona; imagem com caminho relativo ao HTML.
2. Imprima pelo terminal (no Mac, o Chrome fica em
   `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`):
```
"<chrome>" --headless=new --no-pdf-header-footer --virtual-time-budget=8000 \
  --print-to-pdf="$PWD/saida.pdf" "file://$PWD/documento.html"
```
   O `--virtual-time-budget` dá tempo para a fonte e a imagem carregarem.

Documento que se repete com dados (100 certificados, um orçamento por cliente):
um script que preenche o mesmo HTML e imprime um PDF por item. PDF feito só com
código, sem HTML: `reportlab`.

**Ler e mexer num PDF que já existe** — `python3 -m venv .venv &&
.venv/bin/pip install pypdf`:
- texto: `PdfReader('a.pdf').pages[0].extract_text()`;
- juntar: `PdfWriter()`, `append('a.pdf')`, `append('b.pdf')`, `write('junto.pdf')`;
- separar ou girar: `writer.add_page(reader.pages[i])`, `page.rotate(90)`.
Se o texto vem vazio, o PDF é uma FOTO de papel escaneado: precisa de OCR
(`tesseract`). Diga isso em vez de devolver nada.

Nunca escreva por cima do PDF original: salve com outro nome.

**Confira antes de entregar**
- Número de páginas: `len(PdfReader('saida.pdf').pages)` — bate com o esperado?
- Abra com `browser_open` e OLHE página por página: texto cortado na quebra,
  título sozinho no pé da página, tabela saindo da margem, fundo que sumiu.
- Procure texto de exemplo esquecido ("Lorem", "[NOME]").
- Orçamento e proposta: confira a soma dos valores à mão.
