# DANFE — Geração de PDF
Gera o DANFE em PDF a partir do XML autorizado (`nfeProc`). O modelo (55 ou 65) é detectado automaticamente do campo `<mod>` no XML.
```rust
use dfe::DanfeBuilder;
// NF-e A4 — salvar como arquivo
let caminho = DanfeBuilder::new()
.xml("./nota_autorizada.xml") // caminho .xml ou string XML diretamente
.paper_size("a4") // padrão quando omitido
.as_file("./danfe.pdf")
.build()
.await?;
println!("PDF salvo em: {}", caminho);
// NF-e A4 — com logotipo do emitente, retornar base64
let b64 = DanfeBuilder::new()
.xml("<nfeProc>...</nfeProc>")
.paper_size("a4")
.logo("./logo.png") // .png/.jpg, base64 puro ou data URI
.as_base64()
.build()
.await?;
// NF-e 80mm
let b64 = DanfeBuilder::new()
.xml("<nfeProc>...</nfeProc>")
.paper_size("80mm")
.as_base64()
.build()
.await?;
// NFC-e 80mm — QR Code lateral
let b64 = DanfeBuilder::new()
.xml("<nfeProc>...</nfeProc>")
.paper_size("80mm")
.qr_side() // QR Code à esquerda (~33mm); chave e protocolo à direita
.as_base64()
.build()
.await?;
```
## Métodos do DanfeBuilder
| `.xml(src)` | ✅ | Caminho `.xml` ou string do `nfeProc` |
| `.paper_size(str)` | — | `"a4"` (padrão), `"80mm"` ou `"54mm"` |
| `.as_file(path)` | ✅¹ | Salva o PDF em disco; retorna o caminho |
| `.as_base64()` | ✅¹ | Retorna o PDF como string base64 |
| `.logo(src)` | — | Logotipo do emitente — apenas A4 |
| `.qr_side()` | — | Layout QR lateral — apenas NFC-e 80mm |
¹ Use `.as_file()` **ou** `.as_base64()` — nunca os dois.
## Formatos implementados
| `"a4"` | ✅ (suporta `.logo()`) | ❌ |
| `"80mm"` | ✅ | ✅ (suporta `.qr_side()`) |
| `"54mm"` | ❌ | ❌ |