HTML + CSS
O pdfHTML suporta boa parte do CSS 2.1 e do CSS 3: tipografia, cores, bordas, margens, fundos, posicionamento e muito mais.
HTML entra. PDF sai.
Uma API HTTP simples que transforma o seu HTML em PDF com o motor iText pdfHTML. Você paga só pelas conversões bem-sucedidas, seus documentos nunca são armazenados e todo o código é aberto.
$ curl -X POST https://api.pdfservices.sistema.site/v1/html2pdf/html \
-H "X-Api-Key: pdfs_••••••••••••" \
-H "Content-Type: text/html; charset=utf-8" \
--data-binary @nota.html -o nota.pdf -D -
HTTP/1.1 200 OK
Content-Type: application/pdf
X-Transaction-Id: 9f3c2a7e5b1d4c08a6e2f0b7d91c3a54
X-Charged-Amount: 0.001
X-Balance: 49.999
Sem SDK obrigatório e sem fila: uma requisição HTTP com o seu HTML devolve o PDF pronto na resposta.
Cadastre-se com o CNPJ da empresa e confirme o e-mail pelo link que enviamos. O acesso ao painel é liberado após a confirmação.
No painel, crie uma chave: ela aparece uma única vez e é guardada por nós só como hash. Para converter, a conta precisa de saldo em créditos.
Faça um POST com o HTML e receba o PDF como resposta. Cada conversão bem-sucedida debita o preço vigente do seu saldo.
Dois formatos de envio, a mesma resposta: o PDF em application/pdf. Base: https://api.pdfservices.sistema.site
/v1/html2pdf/htmlCorpo: o próprio HTML, com Content-Type: text/html; charset=utf-8/v1/html2pdf/jsonCorpo: {"html": "..."}, com Content-Type: application/jsonEnvie sua chave no header X-Api-Key: pdfs_.... Use a chave só no seu servidor, nunca no navegador.
X-Transaction-Id identifica a conversão no seu relatório de consumo.X-Charged-Amount é o valor cobrado, em R$.X-Balance é o saldo restante depois da cobrança.{ "error", "message" })| HTTP | Código | Quando |
|---|---|---|
| 401 | invalid_api_key | Chave ausente, inválida ou revogada. |
| 402 | insufficient_balance | Saldo insuficiente para a conversão. |
| 413 | payload_too_large | Requisição acima de 1 MB. |
| 422 | conversion_failed | O HTML não pôde ser convertido. Não é cobrado. |
# HTML direto no corpo da requisição
curl -X POST https://api.pdfservices.sistema.site/v1/html2pdf/html \
-H "X-Api-Key: $PDFSERVICES_API_KEY" \
-H "Content-Type: text/html; charset=utf-8" \
--data-binary @documento.html \
-o documento.pdf
# Ou em JSON
curl -X POST https://api.pdfservices.sistema.site/v1/html2pdf/json \
-H "X-Api-Key: $PDFSERVICES_API_KEY" \
-H "Content-Type: application/json" \
-d '{"html": "<h1>Olá, PDF!</h1>"}' \
-o documento.pdf
using System.Text;
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("X-Api-Key", Environment.GetEnvironmentVariable("PDFSERVICES_API_KEY"));
var html = "<h1>Olá, PDF!</h1><p>Gerado com PDF Services.</p>";
using var content = new StringContent(html, Encoding.UTF8, "text/html");
using var response = await http.PostAsync(
"https://api.pdfservices.sistema.site/v1/html2pdf/html", content);
if (!response.IsSuccessStatusCode)
throw new Exception(await response.Content.ReadAsStringAsync());
await File.WriteAllBytesAsync("documento.pdf", await response.Content.ReadAsByteArrayAsync());
var saldo = response.Headers.GetValues("X-Balance").First();
Console.WriteLine($"PDF gerado. Saldo: R$ {saldo}");
import { writeFile } from 'node:fs/promises';
const response = await fetch('https://api.pdfservices.sistema.site/v1/html2pdf/json', {
method: 'POST',
headers: {
'X-Api-Key': process.env.PDFSERVICES_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({ html: '<h1>Olá, PDF!</h1>' })
});
if (!response.ok) {
const { error, message } = await response.json();
throw new Error(`${error}: ${message}`);
}
await writeFile('documento.pdf', Buffer.from(await response.arrayBuffer()));
console.log('Saldo:', response.headers.get('X-Balance'));
import os
import requests
response = requests.post(
"https://api.pdfservices.sistema.site/v1/html2pdf/json",
headers={"X-Api-Key": os.environ["PDFSERVICES_API_KEY"]},
json={"html": "<h1>Olá, PDF!</h1>"},
timeout=60,
)
if response.status_code != 200:
erro = response.json()
raise RuntimeError(f"{erro['error']}: {erro['message']}")
with open("documento.pdf", "wb") as arquivo:
arquivo.write(response.content)
print("Saldo:", response.headers["X-Balance"])
<?php
$html = '<h1>Olá, PDF!</h1>';
$ch = curl_init('https://api.pdfservices.sistema.site/v1/html2pdf/html');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $html,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-Api-Key: ' . getenv('PDFSERVICES_API_KEY'),
'Content-Type: text/html; charset=utf-8',
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
$erro = json_decode($body, true);
throw new RuntimeException($erro['error'] . ': ' . $erro['message']);
}
file_put_contents('documento.pdf', $body);
Passo a passo com código completo, comparando as bibliotecas locais mais usadas com a chamada à API.
HttpClient, ASP.NET Core e as alternativas iText, PuppeteerSharp e Playwright.
Ler o guia → JavaScript · Node.jsfetch nativo, Express e as alternativas Puppeteer e Playwright.
Ler o guia → Pythonrequests, FastAPI e Django, e as alternativas WeasyPrint e Playwright.
Ler o guia →Sem mensalidade, sem plano mínimo, sem fidelidade. Créditos pré-pagos em reais, debitados a cada conversão bem-sucedida.
R$ 0,001por conversão bem-sucedida
R$ 1,00 rende 1.000 PDFs.
Novas contas não recebem créditos gratuitos.
Como adicionar créditos: por enquanto, fale com a CODECYCLE para carregar o saldo da sua conta. A compra online de créditos chega em breve.
O HTML enviado e o PDF gerado são processados apenas em memória, durante a requisição, e nunca são armazenados nem registrados em logs. Entregue a resposta, eles deixam de existir no serviço.
Consequência prática: como não guardamos o conteúdo, não conseguimos recuperar um documento já convertido. Mantenha suas próprias cópias.
Ler a Política de PrivacidadeEscreva o documento com as tecnologias que você já conhece e controle a paginação com CSS.
O pdfHTML suporta boa parte do CSS 2.1 e do CSS 3: tipografia, cores, bordas, margens, fundos, posicionamento e muito mais.
Defina tamanho, margens e orientação da página com @page e controle quebras com page-break-before, -after e -inside.
Tabelas longas quebram entre páginas, ideais para relatórios, extratos, notas e faturas.
As fontes padrão do mecanismo estão prontas para uso e cobrem acentos e símbolos comuns. Fontes próprias podem ser embutidas via @font-face com data: URI. Fontes referenciadas por URL (como Google Fonts) não são baixadas.
Embutidas no HTML como data: URI ou por URL https pública, nos formatos JPG e PNG.
JavaScript não é executado e endereços internos ou privados são bloqueados no download de imagens.
Dica para resultados previsíveis
Coloque o CSS numa tag <style> no próprio documento, embuta imagens pequenas como data: URI e monte o HTML final no seu servidor, com o template engine que você já usa, antes de enviar.
O código que processa os seus documentos está publicado no GitHub. Você não precisa confiar só na nossa palavra: pode ler, auditar e verificar como o PDF Services funciona.
Veja como o HTML é tratado, o que é registrado e como a cobrança funciona. O código-fonte do serviço é público.
A conversão usa a biblioteca iText (pdfHTML), também licenciada sob a AGPL.
Os PDFs gerados trazem no metadado “Producer” o texto CodeCycle AGPL PDF Services (https://pdfservices.sistema.site), seguido da identificação da versão AGPL do iText.
Código-fonte completo do serviço: API de conversão, painel do cliente e este site.
$ pdfinfo documento.pdf
Producer: CodeCycle AGPL PDF Services (https://pdfservices.sistema.site)
# ...seguido da identificação da versão AGPL do iText
Pages: 1
Não é aconselhamento jurídico. A AGPL tem implicações próprias; recomendamos que sua empresa as avalie com a assessoria jurídica. A seção 10 dos Termos de Uso trata da relação entre a licença e o serviço hospedado.
R$ 0,001 por conversão bem-sucedida, debitado de créditos pré-pagos em reais. Não há mensalidade, plano mínimo nem créditos gratuitos para novas contas. Conversões que falham, como um HTML que não pode ser convertido, não são cobradas.
Nesta fase, os créditos são adicionados pela CODECYCLE: fale conosco informando a sua conta. A compra online de créditos estará disponível em breve. Saldo e consumo ficam visíveis no painel. O saldo serve só para pagar conversões e não é resgatável em dinheiro.
Cada requisição pode ter até 1 MB, incluindo o HTML e as imagens embutidas como data: URI. Acima disso, a API responde 413 payload_too_large. Imagens referenciadas por URL são baixadas pelo serviço e têm limites próprios de tamanho e de tempo.
De duas formas: embutidas no HTML como data: URI, ou referenciadas por URL https pública, nos formatos JPG ou PNG. Endereços internos ou privados são bloqueados, e imagens que não atendam a essas condições podem não aparecer no PDF.
Folhas de estilo, fontes e scripts referenciados por URL não são baixados. Coloque o CSS numa tag <style> ou em atributos style. Fontes por URL (como Google Fonts) são ignoradas e o texto usa as fontes padrão do mecanismo, que já cobrem acentos e símbolos comuns. Para usar uma fonte própria, embuta-a com @font-face e src: url(data:font/ttf;base64,...). O arquivo da fonte conta no limite de 1 MB da requisição.
Não. O conteúdo gerado por JavaScript (gráficos, tabelas montadas no navegador) não aparece no PDF. Monte o HTML final no seu servidor antes de enviar; para gráficos, envie-os como imagem PNG.
Não. Os dois são processados só em memória e nunca são armazenados nem registrados em logs. Guardamos apenas metadados da transação (data/hora, capacidade, chave usada, valor, saldo, tamanhos em bytes e duração) e registros de acesso (IP e data/hora) por 6 meses, como exige o Marco Civil da Internet. Por isso, não conseguimos recuperar um documento já convertido. Detalhes na Política de Privacidade.
O código do PDF Services e a biblioteca iText são licenciados sob a GNU AGPL v3. A licença rege o código-fonte do software (uso, modificação e redistribuição), e a contratação do serviço hospedado é regida pelos Termos de Uso. Os PDFs gerados trazem essa identificação no metadado “Producer”. Não prestamos aconselhamento jurídico: recomendamos que sua empresa avalie as implicações da AGPL com a assessoria jurídica.
Pelo painel, a qualquer momento, confirmando a senha. A exclusão é irreversível: nome, e-mail e hash da senha são apagados e todas as chaves de API são revogadas. O saldo remanescente é perdido. Razão social, CNPJ e histórico de transações são mantidos de forma anonimizada pelo prazo exigido por lei, conforme o art. 16 da LGPD.
Fale com a CODECYCLE pelo e-mail produtos@codecycle.com.br. Encontrou um bug ou quer sugerir uma melhoria no código? Abra uma issue no repositório no GitHub.
Crie a conta da sua empresa, gere uma chave de API e converta HTML em PDF com uma única requisição.