Por que é tão difícil fazer emojis aparecerem num PDF para imprimir
A maioria das pessoas tenta converter uma página HTML ou um documento do Word em PDF e descobre que os emojis saem como quadrados brancos, interrogações pretas ou simplesmente desaparecem. O problema não é o PDF em si, mas sim como o motor de geração trata caracteres Unicode fora do conjunto básico ASCII. Emojis ficam no plano 1 do Unicode (pontos de código acima de U+FFFF), e a grande maioria das fontes padrão de impressão — Arial, Times New Roman, Helvetica — não tem glifos desenhados para essas regiões. Quando o gerador de PDF não consegue mapear o ponto de código para um glifo disponível na fonte selecionada, ele usa um substituto, que geralmente é vazio. Eu passei duas semanas tentando resolver isso num fluxo de automação onde gerávamos certificados com emojis personalizados e precisávamos que aparecessem corretos tanto na tela quanto no papel impresso. O caminho que funcionou envolveu uma combinação de escolha de fonte, transformação de texto para vetores e controle explícito de embutimento. Vou explicar como fiz, quais erros encontrei e por que algumas abordagens falham de formas bem específicas.
O problema real: fonte versus conteúdo
Para obter emojis para imprimir pdf com fidelidade, você precisa entender que existem três camadas separadas. A primeira é a fonte que contém os glifos dos emojis. A segunda é o motor de renderização que converte o texto em formas geométricas dentro do PDF. A terceira é o visualizador ou impressora que vai interpretar essas formas. Se qualquer uma dessas três falhar, o emoji some ou sai errado. Fontes que funcionam de forma consistente para esse propósito incluem Noto Emoji, Apple Color Emoji, Google Emoji, Segoe UI Emoji e OpenMoji. Nenhuma delas vem pré-instalada na maioria dos sistemas Linux, e no Windows o Noto precisa ser baixado separadamente. No macOS, o sistema já embute suportação nativa para emojis em documentos gerados com ferramentas como o Preview ou o Safari, mas isso não se aplica a arquivos produzidos por bibliotecas como PdfKit ou IText.
Como eu resolvi no meu projeto
No certificado, eu precisava de emojis que representassem categorias específicas — estrelas, corações, troféus — e eles tinham que manter a cor original quando impressos em papel colorido. A solução que encontrei foi transformar o texto de emojis em SVG usando a biblioteca emoji-codepoints combinada com o weasyprint do Python. O weasyprint rende HTML/CSS para PDF e suporta embutimento de fontes com a diretiva @font-face. Eu configurei o CSS para importar diretamente o arquivo Noto Emoji localizado em /usr/share/fonts/truetype/noto/NotoEmoji-Regular.ttf e defini unicode-range limitado aos pontos de código que eu realmente usava. O detalhe importante é que eu não confiei no embutimento completo da fonte, que aumentava o PDF de 200 KB para 4,5 MB apenas pela tabela de glyphs de emoji. Em vez disso, eu extraía apenas os glifos necessários usando a ferramenta pyftsubset com a flag --unicodes=U+1F300-U+1F5FF,U+1F600-U+1F64F e embutia apenas esse subconjunto reduzido. O resultado ficou com tamanho aceitável e os emojis renderizavam perfeitamente no Adobe Reader, no Chrome e na impressora.
Abordagens práticas
Existem três caminhos viáveis dependendo do seu cenário. O primeiro é usar conversão HTML-to-PDF com fontes emoji embutidas via CSS. O segundo é trabalhar diretamente com bibliotecas de PDF como ReportLab ou FPDF2, adicionando a fonte emoji manualmente. O terceiro é transformar cada emoji em uma imagem vetorial antes de gerar o PDF. A abordagem HTML-to-PDF é a mais simples se você já trabalha com documentação web. Você cria um template em HTML, aplica o CSS com @font-face apontando para o Noto Emoji ou similar, e usa WeasyPrint, Puppeteer ou Playwright para gerar o PDF. O Puppeteer é particularmente interessante porque ele usa o Chromium por baixo, e o Chromium tem suporte nativo a emojis coloridos via o motor Blink. O problema é que o PDF gerado pelo Puppeteer em modo headless pode ter os emojis renderizados como texto simples sem a colorização nativa, dependendo da configuração.
Já a abordagem com ReportLab exige que você registre a fonte emoji explicitamente usando FontProperties e fontName. O reporte fica bem mais verboso, mas oferece controle total sobre posição, tamanho e cor de cada glifo. O custo é que você precisa lidar manualmente com a divisão de strings, o alinhamento e o embutimento de fontes, o que leva tempo adicional de desenvolvimento.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Erros comuns que fazem seu PDF falhar
Um erro frequente é confiar na fonte do sistema operacional que está rodando o script. Se você gera o PDF em um container Docker com Debian Slim, a fonte Noto Emoji provavelmente não existe, e o gerador vai usar uma fallback genérica que não tem os glifos. Outro erro é não testar a saída em múltiplos visualizadores. Um PDF que funciona perfeitamente no macOS Preview pode mostrar emojis como caixas vazias no Adobe Acrobat para Windows, porque o Acrobat ignora fontes que não estão corretamente registradas ou que têm metadados incompletos. Também é comum errar na escolha da paleta de cores. Emojis coloridos são, na verdade, imagens dentro do glifo da fonte. Quando você imprime em preto e branco, esses emojis podem perder completamente o significado visual porque a informação de cor é descartada pelo driver da impressora. Se o seu documento depende da cor do emoji para comunicação, considere converter para monocromático com outlines bem definidos ou usar emojis de linha única (shape-only) como alternativas seguras.
Alternativas quando o PDF com emoji não é viável
Se o seu caso de uso é impressão em larga escala e você precisa garantir compatibilidade absoluta, uma alternativa mais robusta é exportar cada emoji como um SVG independente e embutir esses SVGs como imagens vetoriais no PDF usando o módulo img2pdf ou diretamente via FPDF2. Esse método perde a capacidade de selecionar o texto no PDF final, mas garante que o glifo seja exibido exatamente como desenhado, em qualquer plataforma e qualquer visualizador. Outra alternativa que vale considerar é gerar o documento como PDF com texto normal e usar uma página CSS print-only que substitua os emojis por imagens PNG embutidas via background-image. Isso funciona bem para documentos de poucas páginas, mas esquenta o processo de manutenção porque você precisa manter o dicionário de mapeamento entre código de emoji e arquivo de imagem sincronizado.
Download e configuração rápida
Para começar do jeito mais direto possível, baixe o pacote Noto Emoji no site oficial do Google Fonts ou no repositório do projeto no GitHub. Extraia o arquivo NotoEmoji-Regular.ttf e coloque-o em uma pasta chamada fonts junto com seu template HTML. Se estiver usando WeasyPrint, o comando básico fica assim: weasyprint template.html output.pdf --base-url .
No CSS do seu HTML, adicione: @font-face { font-family: 'Noto Emoji'; src: url('fonts/NotoEmoji-Regular.ttf'); }
E aplique font-family: 'Noto Emoji', sans-serif; nos elementos que contêm emojis. Teste sempre a saída final abrindo em pelo menos dois visualizadores diferentes antes de mandar imprimir.
O que ainda dá errado mesmo depois de tudo certo
Às vezes o PDF abre corretamente no computador onde foi gerado, mas quando você transfere o arquivo para outra máquina e tenta imprimir, os emojis somem. Isso acontece porque alguns drivers de impressora filtram caracteres Unicode que consideram não seguros ou porque o serviço de impressão do sistema operacional faz uma conversão intermediária que remove a informação de cor. Se esse for o seu caso, a solução mais garantida é usar a abordagem de SVGs embutidos mencionada anteriormente, que independe do motor de renderização de texto do visualizador. Também existe o problema de impressoras térmicas e labeladoras. Essas máquinas frequentemente interpretam o PDF de forma diferente, tratam cores como monocromático e ignoram subconjuntos de fontes embutidas. Para esse cenário específico, a recomendação é gerar o documento diretamente em formato de imagem rasterizada a 300 DPI ou superior, usando bibliotecas como Pillow para compor a página com emojis como sprites, e depois converter para PDF usando img2pdf. O arquivo resultante é maior, mas imprime sem surpresas em hardware de etiqueta e recibo.