Skip to main content

receitapdf

Biblioteca Rust e CLI que recebem os dados já estruturados de uma prescrição e produzem os bytes do PDF de um modelo eletrônico publicado pela Anvisa. Este componente não solicita números ao SNCR, não decide conteúdo clínico e não assina documentos.

Modelos e arquivos oficiais

Foram implementados os oito modelos disponíveis na seção de receituários eletrônicos da Anvisa:

  • Notificação de Receita A, B e B2;
  • Notificação de Receita Especial para retinoides sistêmicos;
  • Notificação de Receita de Talidomida;
  • Notificações A e B veterinárias;
  • Receita de Controle Especial (RCE).

Os PDFs originais foram baixados da página oficial dos modelos eletrônicos e estão em assets/anvisa-v2/. São arquivos de uma página, com MediaBox de 595,5 × 842,25 pontos (aproximadamente 210 × 297 mm). A inspeção dos oito arquivos confirmou que não há AcroForms nem anotações/campos preenchíveis. Por isso, o gerador preserva cada PDF oficial como fundo vetorial e acrescenta uma camada de texto e QR. Não tenta editar um PDF existente por meio do printpdf: a composição é feita com printpdf para criar a camada e lopdf para incorporá-la ao modelo original. Para as Notificações, somente o marcador de QR da arte original é coberto pelo QR oficial.

O layout, as caixas e os rótulos impressos permanecem os do arquivo Anvisa correspondente; não há logotipo, cor ou identidade visual adicionada pelo componente. A camada de texto usa DejaVu Sans incorporada ao PDF para manter caracteres acentuados. O código-fonte do projeto está sob MIT (LICENSE); os modelos oficiais da Anvisa e a fonte DejaVu mantêm seus próprios termos e avisos. Consulte os termos na página de origem antes de redistribuir os modelos.

QR Code

Conforme a orientação oficial da Anvisa para o receituário eletrônico, as Notificações de Receita recebem um QR com esta URL, usando o número SNCR já recebido na entrada e validado no formato 0000.0-00.0000000:

https://sncr.anvisa.gov.br/receita/consultar?numero={numero}

Não é criado QR para a Receita de Controle Especial, pois a orientação consultada não publica conteúdo de consulta para esse documento. O campo de número da RCE é opcional e, quando fornecido, não é tratado como número SNCR.

API Rust

use receitapdf::{gerar_pdf, Receita};

fn gerar(receita: &Receita) -> Result<Vec<u8>, receitapdf::Erro> {
    gerar_pdf(receita)
}

gerar_pdf valida os dados requeridos pelo modelo, o formato do número das Notificações, a capacidade dos campos e a geração do QR, e retorna erro em vez de serializar campos que excedam o espaço configurado. url_qr expõe a URL usada pela Notificação e retorna None para RCE.

Extensão Python

O pacote Python exige CPython 3.13 ou superior. A extensão usa a ABI estável abi3 com mínimo 3.13, então um wheel CPython pode ser usado também em versões futuras compatíveis. É necessário ter Rust/Cargo disponível ao compilar a partir do código-fonte; o maturin é instalado automaticamente pelo backend PEP 517:

python3.13 -m pip install .

Uso a partir de um dicionário Python:

import json
from pathlib import Path

from receitapdf import gerar_pdf, url_qr

prescricao = json.loads(Path("prescricao.json").read_text(encoding="utf-8"))
pdf: bytes = gerar_pdf(prescricao)
Path("saida.pdf").write_bytes(pdf)

# Retorna None para a Receita de Controle Especial.
url: str | None = url_qr(prescricao)

gerar_pdf retorna bytes; entradas ausentes, inválidas ou que excedam o espaço disponível levantam ValueError. Falhas internas de renderização levantam RuntimeError. A dependência PyO3 é opcional para consumidores Rust e é ativada pelo backend de build Python. Para compilar wheel localmente, instale maturin e execute maturin build --release; os wheels usam a tag abi3 a partir do CPython 3.13.

Publicar no PyPI

O workflow publish-pypi.yml cria o sdist e o wheel Linux x86_64, executa os testes e publica via Trusted Publishing. Para habilitar a publicação, cadastre um publisher pendente nas configurações do PyPI com estes valores:

  • Projeto PyPI: receitapdf
  • Owner do GitHub: ramon
  • Repositório: receitapdf
  • Workflow: .github/workflows/publish-pypi.yml
  • Environment do GitHub: pypi

Depois desse cadastro, a publicação pode ser iniciada manualmente em master ou ao publicar uma release do GitHub com tag vX.Y.Z igual à versão em pyproject.toml. O job usa OIDC; não é necessário guardar token do PyPI como secret.

Nos modelos comuns, a posologia começa abaixo do rótulo, pode ocupar várias linhas e respeita margens internas da caixa. Nos boxes de emitente e paciente, cada valor é posicionado com uma distância uniforme abaixo do rótulo correspondente. Os campos da Talidomida seguem as posições e a estrutura próprias desse formulário.

CLI

Rust está declarado no mise.toml. Com mise instalado:

mise install
mise exec rust -- cargo run --release -- examples/notificacao-a.json saida.pdf

Também é possível ler o JSON pela entrada padrão:

cat examples/notificacao-a.json | mise exec rust -- cargo run --release -- - saida.pdf

O executável recebe <entrada.json> <saida.pdf>; use - como entrada para stdin. Os nomes JSON do enum modelo são notificacao_a, notificacao_b, notificacao_b2, retinoides, talidomida, notificacao_a_veterinaria, notificacao_b_veterinaria e receita_controle_especial. Veja notificacao-a.json para um exemplo totalmente fictício.

Conferência visual e testes

As entradas fictícias de cada tipo estão em examples/visual-review/; as imagens PNG em examples/visual-review/png/ foram geradas a partir dos PDFs finais em resolução de 144 dpi. O contato visual mostra as oito páginas. Os PDFs originais correspondentes usados para comparar estão em assets/anvisa-v2/.

Os testes cobrem a geração de cada modelo, a URL e os bytes QR usados pela renderização, a exigência/formato do número SNCR, os dados obrigatórios e a rejeição de texto que não cabe. Execute:

mise exec rust -- cargo test --offline

Integrações externas

O número SNCR deve ser fornecido pela integração chamadora para Notificações. A assinatura eletrônica exigida pelo fluxo da plataforma (incluindo certificado e validações aplicáveis) também é externa: os campos de identificação da plataforma e registro da assinatura continuam presentes no modelo oficial, mas este módulo não cria uma assinatura criptográfica nem registra a dispensação/uso no SNCR.

Metadata

Release files for receitapdf 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for receitapdf 0.1.1
File Size Uploaded Provenance Actions
receitapdf-0.1.1.tar.gz 2.5 MB With provenance Details for receitapdf-0.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for receitapdf 0.1.1
File Interpreter ABI Platform Actions
receitapdf-0.1.1-cp313-abi3-manylinux_2_28_x86_64.whl CPython 3.13 abi3 Linux glibc 2.28+ x86-64 Details for receitapdf-0.1.1-cp313-abi3-manylinux_2_28_x86_64.whl

Total release size: 5.0 MB

Release files / receitapdf-0.1.1.tar.gz

Download URL receitapdf-0.1.1.tar.gz
Size 2.5 MB
Tags Source
SHA-256 checksum
How to use checksums
02476c525896fceeea235fd84f49ee669ae5e9f2d55afd21a18423209a4ff2cf
BLAKE2b-256 checksum
How to use checksums
624a77704d1fc33fc986f49022d1d159a52de8d0163b61d1a3ce06bea727b484
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.

Transparency log

Release files / receitapdf-0.1.1-cp313-abi3-manylinux_2_28_x86_64.whl

Download URL receitapdf-0.1.1-cp313-abi3-manylinux_2_28_x86_64.whl
Size 2.5 MB
Tags CPython 3.13 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
21bd9b79b38a139b4fd0658c571d9561f1fa3269114bd49affa1d3a8114ac421
BLAKE2b-256 checksum
How to use checksums
1ab217139b314241b0becad9f8f87573d5b197f3dcde6a0ea0ff18cba9dade95
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.

Transparency log

Security for receitapdf 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for receitapdf-0.1.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page