# Como Configurar o IronPDF for Java no Azure
Este guia cobre tudo o que é necessário para implantar [IronPDF for Java](https://ironpdf.com/java/) dentro de um contêiner Azure Functions e gerar PDFs sob demanda a partir de um endpoint HTTP sem servidor. Como o IronPDF fornece um mecanismo de renderização nativo Chromium, ele deve ser empacotado como uma imagem Docker - a implantação padrão Zip no Azure Functions não pode executar os binários dos quais o IronPDF depende em tempo de execução. Seguindo este guia, uma Azure Function funcional aceitará um URL como um parâmetro de consulta e retornará um PDF totalmente renderizado como um arquivo para download.
A abordagem usa o [fluxo de trabalho de contêiner personalizado recomendado pela Microsoft](https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-function-linux-custom-image) para Azure Functions baseados em Linux. Um projeto Maven fornece o código da função e o gerenciamento de dependências. O Docker constrói a imagem do contêiner, que é empurrada para um registro e referenciada pelo Azure Function App. Uma vez implantado, o tempo de início a frio é a principal consideração de desempenho - invocações subsequentes são rápidas e consistentes.
Antes de começar, certifique-se de que o [CLI do Azure](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli), Docker Desktop, Maven 3.8+ e JDK 11 ou JDK 17 estejam instalados localmente. Também é necessária uma assinatura ativa do Azure com permissão para criar Aplicativos de Função e contas de armazenamento.
*as-heading:2(Início Rápido: Implante IronPDF for Java no Azure Functions)*
O código abaixo mostra a função completa `RenderPdf` da Azure Function. Aceita um(a) parâmetro de consulta `url` e retorna um fluxo de bytes em PDF. Adicione isso a `Function.java` após completar a configuração das dependências do Maven nas seções que seguem.
```java
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf.java
import com.microsoft.azure.functions.*;
import com.ironsoftware.ironpdf.PdfDocument;
import java.util.Optional;
public class Function {
/**
* HTTP-triggered Azure Function: accepts a URL, renders it as a PDF,
* and returns the PDF bytes as a downloadable attachment.
*/
@FunctionName("RenderPdf")
public HttpResponseMessage renderPdf(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("RenderPdf function triggered.");
// Read the target URL from the query string
final String url = request.getQueryParameters().get("url");
if (url == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Provide a 'url' query parameter.")
.build();
}
try {
context.getLogger().info("Rendering URL as PDF: " + url);
// IronPDF renders the full page including JavaScript
PdfDocument pdf = PdfDocument.renderUrlAsPdf(url);
byte[] pdfBytes = pdf.getBinaryData();
return request.createResponseBuilder(HttpStatus.OK)
.body(pdfBytes)
.header("Content-Disposition", "attachment; filename=output.pdf")
.header("Content-Type", "application/pdf")
.build();
} catch (Exception ex) {
context.getLogger().severe("PDF rendering failed: " + ex.getMessage());
return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
.body("PDF rendering failed. Check function logs for details.")
.build();
}
}
}
```
!!!--LIBRARY_START_TRIAL_BLOCK--!!!
*as-heading:2(Índice)*
- [Quais são os Pré-requisitos?](#prerequisites)
- [Como Você Configura o Projeto de Azure Function?](#set-up-project)
- [Como Você Adiciona Dependências do IronPDF ao Seu Projeto Maven?](#add-ironpdf-dependencies)
- [Como Você Escreve a Função RenderPdf?](#write-renderpdf-function)
- [Como Você Configura o Dockerfile para o IronPDF?](#configure-dockerfile)
- [Como Você Constrói e Empurra a Imagem Docker?](#build-push-docker)
- [Como Você Implanta a Função no Azure?](#deploy-to-azure)
- [Como Você Aciona e Testa a Função?](#trigger-and-test)
- [Quais são os próximos passos?](#next-steps)
!!!--LIBRARY_NUGET_INSTALL_BLOCK--!!!
## Quais são os Pré-requisitos?
Antes de começar, confirme que todas as ferramentas necessárias estão instaladas e que uma assinatura Azure está ativa. Ignorar essas verificações geralmente resulta em falhas de construção durante o processo de implantação.
**Ferramentas locais necessárias**:
- [CLI do Azure](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) (versão 2.40 ou posterior)
- [Docker Desktop](https://www.docker.com/products/docker-desktop/) com contêineres Linux habilitados
- Maven 3.8 ou posterior
- JDK 11 ou JDK 17 (JDK 17 é a versão LTS recomendada)
- [Core Tools do Azure Functions](https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local) v4
**Recursos do Azure necessários**:
- Uma assinatura Azure ativa
- Permissões para criar Grupos de Recursos, Contas de Armazenamento e Planos de Aplicativos de Função
- Uma conta Docker Hub (ou Registro de Contêineres Azure) para hospedar a imagem construída
[[n:(IronPDF for Java requer o artefato `ironpdf-engine-linux-x64` ao rodar dentro de qualquer container Docker. A implantação padrão Zip no Azure Functions não pode executar os binários nativos do IronPDF - Docker é o único método de implantação suportado.)]]
Execute `az login` para autenticar o Azure CLI antes de prosseguir para a próxima seção.
## Como Você Configura o Projeto de Azure Function?
O guia da Microsoft para [criar uma função no Linux usando uma imagem personalizada](https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-function-linux-custom-image) cobre todo o processo de estruturação. Siga essas etapas com uma seleção importante: escolha **Java** quando solicitado para uma linguagem de programação.
Percorra o guia até que o projeto estruturado seja construído e a função de espaço reservado seja executada localmente usando o Core Tools do Azure Functions. Verifique isso com:
```bash
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/local-run.sh
mvn clean package
func start
```
Uma vez que o espaço reservado responda a uma solicitação HTTP local, a estrutura do projeto está correta e pronta para integração do IronPDF. Os arquivos principais são `pom.xml` (configuração Maven), `Function.java` (código da função), e `Dockerfile` (definição do container).
[[i:(O arquétipo Maven do Azure Functions gera um(a) `host.json` e `local.settings.json` junto com `pom.xml`. O arquivo `local.settings.json` armazena variáveis de ambiente para desenvolvimento local - ele é excluído do controle de versão por padrão e nunca deve ser commitado.)]]
## Como Você Adiciona Dependências do IronPDF ao Seu Projeto Maven?
IronPDF for Java é distribuído através do Maven Central. São necessários dois artefatos: a biblioteca core `ironpdf` que fornece a API Java, e `ironpdf-engine-linux-x64` que empacota o motor Chromium nativo compilado para Linux x86-64. O artefato do motor é o que torna a implantação com Docker obrigatória - ele envia binários que devem ser executados em tempo de execução.
Abra `pom.xml` e adicione o seguinte dentro do bloco `<dependencies>`. Substitua `LATEST_VERSION` pelo lançamento atual disponível em [Maven Central](https://central.sonatype.com/artifact/com.ironsoftware/ironpdf):
```xml
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/pom.xml
<dependencies>
<!-- IronPDF Java API -->
<dependency>
<groupId>com.ironsoftware</groupId>
<artifactId>ironpdf</artifactId>
<version>LATEST_VERSION</version>
</dependency>
<!--
Linux x64 engine — required for Docker/Azure Functions.
This artifact bundles the native Chromium renderer for Linux.
-->
<dependency>
<groupId>com.ironsoftware</groupId>
<artifactId>ironpdf-engine-linux-x64</artifactId>
<version>LATEST_VERSION</version>
</dependency>
</dependencies>
```
Ambos os artefatos devem usar o mesmo número de versão. Versões incompatíveis entre `ironpdf` e `ironpdf-engine-linux-x64` causam uma exceção em tempo de execução quando a função tenta renderizar um PDF pela primeira vez.
Após atualizar `pom.xml`, execute `mvn dependency:resolve` para verificar se o Maven pode baixar ambos os artefatos do Central antes de investir tempo na construção da imagem do Docker.
[[t:(Verifique as [notas de lançamento do IronPDF for Java](https://ironpdf.com/java/product-updates/changelog/) para a versão estável mais recente. Usar a versão mais recente garante compatibilidade com o mecanismo de renderização Chromium mais recente e evita bugs conhecidos.)]]
## Como Você Escreve a Função RenderPdf?
A função `RenderPdf` é uma Função do Azure acionada por HTTP que aceita um parâmetro de consulta `url`, renderiza a página alvo usando o motor baseado em Chromium do IronPDF, e retorna o PDF resultante como uma resposta binária com um cabeçalho `Content-Disposition: attachment`. Este cabeçalho informa ao navegador (ou cliente HTTP) que deve baixar o PDF em vez de exibi-lo em linha.
O código completo da função é mostrado no Início Rápido acima. Coloque-o em `src/main/java/com/example/Function.java`, substituindo ou estendendo o espaço reservado gerado pelo arquétipo Maven.
```java
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf-annotated.java
import com.microsoft.azure.functions.*;
import com.ironsoftware.ironpdf.PdfDocument;
import java.util.Optional;
public class Function {
@FunctionName("RenderPdf")
public HttpResponseMessage renderPdf(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
// Log each invocation for Azure Monitor / Application Insights
context.getLogger().info("RenderPdf triggered.");
final String url = request.getQueryParameters().get("url");
// Return 400 if no URL was supplied
if (url == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Provide a 'url' query parameter.")
.build();
}
try {
// renderUrlAsPdf launches Chromium, loads the page, and captures it as PDF
PdfDocument pdf = PdfDocument.renderUrlAsPdf(url);
// getBinaryData returns the raw PDF bytes ready for transmission
byte[] pdfBytes = pdf.getBinaryData();
return request.createResponseBuilder(HttpStatus.OK)
.body(pdfBytes)
.header("Content-Disposition", "attachment; filename=output.pdf")
.header("Content-Type", "application/pdf")
.build();
} catch (Exception ex) {
context.getLogger().severe("Rendering error: " + ex.getMessage());
return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
.body("PDF rendering failed.")
.build();
}
}
}
```
`PdfDocument.renderUrlAsPdf(url)` lança uma instância do Chromium sem cabeça dentro do container, carrega completamente a URL alvo (incluindo JavaScript), e captura a saída renderizada como um PDF. Isso produz uma saída que é visualmente idêntica ao que o usuário vê em um navegador, tornando-o adequado para capturar aplicativos web modernos, painéis e páginas de relatório.
[[n:(A configuração `authLevel = AuthorizationLevel.ANONYMOUS` no gatilho da função torna o endpoint publicamente acessível. Para implantações de produção, mude isso para `FUNCTION` ou `ADMIN` e passe a chave da função no cabeçalho da requisição.)]]
## Como Você Configura o Dockerfile para o IronPDF?
O mecanismo Chromium do IronPDF depende de um conjunto de bibliotecas Linux compartilhadas que não estão incluídas na imagem base do Azure Functions. A imagem base `mcr.microsoft.com/azure-functions/java:4-java17-build` é construída no Debian 11, então os pacotes devem ser instalados usando `apt`.
Os seguintes comandos `RUN` devem ser adicionados ao `Dockerfile` gerado pelo arquétipo Maven do Azure Functions. Coloque-os após a instrução `FROM` e antes das etapas `COPY` que adicionam o JAR da aplicação:
```dockerfile
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/Dockerfile
FROM mcr.microsoft.com/azure-functions/java:4-java17-build AS installer-env
# Install system dependencies required by IronPDF's Chromium renderer
RUN apt-get update && apt-get install -y \
libgdiplus \
libxkbcommon-x11-0 \
libc6 \
libc6-dev \
libgtk2.0-0 \
libnss3 \
libatk-bridge2.0-0 \
libx11-xcb1 \
libxcb-dri3-0 \
libdrm-common \
libgbm1 \
libasound2 \
libxrender1 \
libfontconfig1 \
libxshmfence1 \
&& apt-get install -y xvfb libva-dev libgdiplus \
&& rm -rf /var/lib/apt/lists/*
# Copy the built function JAR
COPY --from=installer-env /home/site/wwwroot /home/site/wwwroot
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
```
O pacote `libgdiplus` fornece compatibilidade com GDI+ para renderização gráfica. `libnss3` e `libatk-bridge2.0-0` são necessários pelas camadas de sandboxing e acessibilidade do Chromium. `xvfb` fornece um framebuffer virtual, que o Chromium requer mesmo em modo sem cabeça em algumas configurações Debian. A etapa `rm -rf /var/lib/apt/lists/*` no final do bloco `RUN` remove o cache do gerenciador de pacotes, mantendo o tamanho da imagem final o mais pequeno possível.
[[i:(Se a versão da imagem base do Azure Functions mudar ou for usada uma distro Linux diferente como base, os pacotes necessários podem diferir. Consulte o [Guia de Instalação do IronPDF Linux](/get-started/linux/) para uma matriz de dependência completa entre Debian, Ubuntu, CentOS e Alpine.)]]
## Como Você Constrói e Empurra a Imagem Docker?
Com o projeto Maven construído e o Dockerfile atualizado, a imagem contêiner pode ser montada e carregada em um registro Docker. O Azure Functions puxa esta imagem quando o Aplicativo de Função é criado ou atualizado.
**Passo 1 - Compile e empacote o projeto Maven**:
```bash
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/build.sh
# Compile the Java code and package it as a JAR
mvn clean package
```
O Maven compila o código da função, resolve todas as dependências (incluindo ambos os artefatos do IronPDF), e produz um JAR implantável no diretório `target/`. Corrija quaisquer erros de compilação antes de prosseguir.
**Passo 2 - Construa a imagem Docker**:
```bash
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-build.sh
# Replace <DOCKER_ID> with your Docker Hub username or ACR login server
docker build --tag <DOCKER_ID>/ironpdf-azure-functions:v1.0.0 .
```
A construção instala os pacotes Linux listados no Dockerfile, copia o JAR e coloca tudo em camadas em uma imagem final. Na primeira construção, pode levar vários minutos enquanto downloads de pacotes e cache de camadas são estabelecidos. Construções subsequentes usando a mesma imagem base são significativamente mais rápidas.
**Passo 3 - Empurre a imagem para o Docker Hub**:
```bash
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-push.sh
# Authenticate if not already logged in
docker login
# Push the image to the registry
docker push <DOCKER_ID>/ironpdf-azure-functions:v1.0.0
```
[[t:(Azure Container Registry (ACR) é uma alternativa privada ao Docker Hub. ACR se integra diretamente ao Azure Active Directory e é a escolha recomendada para cargas de trabalho de produção onde a privacidade da imagem é importante.)]]
## Como Você Implanta a Função no Azure?
Com a imagem no registro, o Aplicativo de Função do Azure pode ser criado (ou atualizado) para referenciá-la. O comando `az functionapp create` provisiona o Function App, o vincula a uma conta de armazenamento, e define a imagem do container em um único passo.
**Passo 1 - Crie ou atualize o Aplicativo de Função**:
```bash
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/az-deploy.sh
az functionapp create \
--name <APP_NAME> \
--storage-account <STORAGE_NAME> \
--resource-group AzureFunctionsContainers-rg \
--plan myPremiumPlan \
--deployment-container-image-name <DOCKER_ID>/ironpdf-azure-functions:v1.0.0
```
Substitua `<APP_NAME>` por um nome globalmente único para o Function App, `<STORAGE_NAME>` por um nome de conta de Armazenamento Azure existente, e `<DOCKER_ID>` pelo nome de usuário do Docker Hub ou servidor de login ACR usado na etapa anterior.
A flag `--plan myPremiumPlan` seleciona um plano de hospedagem Premium. O mecanismo Chromium do IronPDF consome memória significativa durante a renderização; O limite de memória de 1.5 GB do plano de Consumo geralmente é insuficiente. O plano Premium fornece pelo menos 3.5 GB e suporta instâncias pré-aquecidas que eliminam a latência de início a frio.
**Passo 2 - Verifique a implantação**:
```bash
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/az-verify.sh
# Check that the function app is running and the container has been pulled
az functionapp show \
--name <APP_NAME> \
--resource-group AzureFunctionsContainers-rg \
--query "state"
```
O comando retorna `"Running"` quando o contêiner foi iniciado com sucesso. Se retornar `"Starting"` ou um erro, verifique o Log Stream do portal do Azure no Function App para erros de inicialização ou pull do contêiner.
[[w:(O plano de Consumo (Serverless) não é recomendado para IronPDF no Azure Functions. A renderização de PDF com Chromium requer mais memória do que o plano de Consumo aloca. Use um plano Premium ou Dedicado (App Service) para evitar erros de out-of-memory.)]]
## Como Você Aciona e Testa a Função?
Uma vez que o Function App relata um estado `Running`, o endpoint `RenderPdf` está pronto para aceitar requisições. O URL do endpoint segue um padrão previsível baseado no nome do Function App e no nome da função definido na anotação `@FunctionName`.
**Teste usando um navegador ou curl**:
```bash
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/test-request.sh
# Replace <APP_NAME> with the Function App name
curl -o output.pdf \
"https://<APP_NAME>.azurewebsites.net/api/RenderPdf?url=https://www.example.com"
```
Uma resposta bem-sucedida salva um arquivo PDF chamado `output.pdf` no diretório atual. A flag `-o` no curl grava o corpo da resposta binária em um arquivo em vez de imprimi-lo no terminal.
Ao testar em um navegador, navegue para:
`https://<APP_NAME>.azurewebsites.net/api/RenderPdf?url=https://www.example.com`
O navegador irá solicitar o download de um PDF. Abra-o para verificar se a página foi renderizada corretamente.
[[n:(A primeira solicitação após um início a frio pode levar 20-60 segundos enquanto o Azure baixa a imagem do contêiner e o IronPDF inicializa o Chromium. Solicitações subsequentes dentro do mesmo tempo de vida do contêiner são muito mais rápidas. O recurso de instância pré-aquecida do plano Premium elimina inícios a frio mantendo pelo menos uma instância em execução continuamente.)]]
**Verificando logs para erros**: Navegue até o portal do Azure, abra o Aplicativo de Função e selecione **Stream de Log** em **Monitoramento**. As entradas de log das chamadas `context.getLogger()` aparecem aqui em quase tempo real, o que torna o diagnóstico de falhas de renderização direto.
## Quais são os próximos passos?
Este guia demonstrou como implantar o IronPDF for Java dentro de um contêiner Docker do Azure Functions, escrever uma função acionada por HTTP que renderiza URLs como PDFs, configurar o Dockerfile com as dependências Linux necessárias e testar o endpoint ao vivo. O mesmo padrão se estende para casos de uso mais avançados com mudanças mínimas.
**Estenda a função**:
- Renderizar strings HTML diretamente usando `PdfDocument.renderHtmlAsPdf(htmlString)` em vez de uma URL
- Aplique marcas d'água, mescle vários PDFs ou adicione assinaturas digitais usando a [API completa de PDF Java do IronPDF](https://ironpdf.com/java/object-reference/api/)
- Leia cabeçalhos de solicitação ou corpo de POST para passar conteúdo HTML personalizado ou opções de renderização
**Melhore a prontidão para produção**:
- Mude `authLevel` para `FUNCTION` e gire as chaves de função regularmente
- Use [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/general/overview) para armazenar quaisquer segredos referenciados nas configurações do aplicativo
- Configure [Application Insights](https://learn.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview) para observabilidade de ponta a ponta da latência de renderização e taxas de falha
- Configure um [webhook de atualização de imagem Docker](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-tutorial-deploy-update) para que o Azure faça o redeploy automático quando uma nova versão de imagem for enviada
**Explore mais guias do IronPDF for Java**:
- [IronPDF for Java: Guia de Instalação no Linux](/get-started/linux/)
- [Gerar PDFs a partir de HTML no Java](/java/tutorials/html-to-pdf/)
- [IronPDF for Java: Guia de Implantação com Docker](/java/get-started/use-ironpdfengine/)
- [Referência Completa da API IronPDF Java](https://ironpdf.com/java/object-reference/api/)
[Inicie uma avaliação gratuita do IronPDF](#trial-license) para acessar todos os recursos de renderização e manipulação sem marca d'água durante o período de avaliação. Quando estiver pronto para implantar em produção, [veja as opções de licenciamento do IronPDF](#licensing) para encontrar o plano que se adapta à escala do projeto.
Este guia cobre tudo o que é necessário para implantar IronPDF for Java dentro de um contêiner Azure Functions e gerar PDFs sob demanda a partir de um endpoint HTTP sem servidor. Como o IronPDF fornece um mecanismo de renderização nativo Chromium, ele deve ser empacotado como uma imagem Docker - a implantação padrão Zip no Azure Functions não pode executar os binários dos quais o IronPDF depende em tempo de execução. Seguindo este guia, uma Azure Function funcional aceitará um URL como um parâmetro de consulta e retornará um PDF totalmente renderizado como um arquivo para download.
A abordagem usa o fluxo de trabalho de contêiner personalizado recomendado pela Microsoft para Azure Functions baseados em Linux. Um projeto Maven fornece o código da função e o gerenciamento de dependências. O Docker constrói a imagem do contêiner, que é empurrada para um registro e referenciada pelo Azure Function App. Uma vez implantado, o tempo de início a frio é a principal consideração de desempenho - invocações subsequentes são rápidas e consistentes.
Antes de começar, certifique-se de que o CLI do Azure, Docker Desktop, Maven 3.8+ e JDK 11 ou JDK 17 estejam instalados localmente. Também é necessária uma assinatura ativa do Azure com permissão para criar Aplicativos de Função e contas de armazenamento.
Início Rápido: Implante IronPDF for Java no Azure Functions
O código abaixo mostra a função completa RenderPdf da Azure Function. Aceita um(a) parâmetro de consulta url e retorna um fluxo de bytes em PDF. Adicione isso a Function.java após completar a configuração das dependências do Maven nas seções que seguem.
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf.javaimport com.microsoft.azure.functions.*;import com.ironsoftware.ironpdf.PdfDocument;import java.util.Optional;public class Function { /** * HTTP-triggered Azure Function: accepts a URL, renders it as a PDF, * and returns the PDF bytes as a downloadable attachment. */ @FunctionName("RenderPdf") public HttpResponseMessage renderPdf( @HttpTrigger( name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, final ExecutionContext context) { context.getLogger().info("RenderPdf function triggered."); // Read the target URL from the query string final String url = request.getQueryParameters().get("url"); if (url == null) { return request.createResponseBuilder(HttpStatus.BAD_REQUEST) .body("Provide a 'url' query parameter.") .build(); } try { context.getLogger().info("Rendering URL as PDF: " + url); // IronPDF renders the full page including JavaScript PdfDocument pdf = PdfDocument.renderUrlAsPdf(url); byte[] pdfBytes = pdf.getBinaryData(); return request.createResponseBuilder(HttpStatus.OK) .body(pdfBytes) .header("Content-Disposition", "attachment; filename=output.pdf") .header("Content-Type", "application/pdf") .build(); } catch (Exception ex) { context.getLogger().severe("PDF rendering failed: " + ex.getMessage()); return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR) .body("PDF rendering failed. Check function logs for details.") .build(); } }}
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf.java
import com.microsoft.azure.functions.*;
import com.ironsoftware.ironpdf.PdfDocument;
import java.util.Optional;
public class Function {
/**
* HTTP-triggered Azure Function: accepts a URL, renders it as a PDF,
* and returns the PDF bytes as a downloadable attachment.
*/
@FunctionName("RenderPdf")
public HttpResponseMessage renderPdf(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("RenderPdf function triggered.");
// Read the target URL from the query string
final String url = request.getQueryParameters().get("url");
if (url == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Provide a 'url' query parameter.")
.build();
}
try {
context.getLogger().info("Rendering URL as PDF: " + url);
// IronPDF renders the full page including JavaScript
PdfDocument pdf = PdfDocument.renderUrlAsPdf(url);
byte[] pdfBytes = pdf.getBinaryData();
return request.createResponseBuilder(HttpStatus.OK)
.body(pdfBytes)
.header("Content-Disposition", "attachment; filename=output.pdf")
.header("Content-Type", "application/pdf")
.build();
} catch (Exception ex) {
context.getLogger().severe("PDF rendering failed: " + ex.getMessage());
return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
.body("PDF rendering failed. Check function logs for details.")
.build();
}
}
}
Java
Start using IronPDF in your project today with a free trial.
Antes de começar, confirme que todas as ferramentas necessárias estão instaladas e que uma assinatura Azure está ativa. Ignorar essas verificações geralmente resulta em falhas de construção durante o processo de implantação.
Permissões para criar Grupos de Recursos, Contas de Armazenamento e Planos de Aplicativos de Função
Uma conta Docker Hub (ou Registro de Contêineres Azure) para hospedar a imagem construída
Importante: IronPDF for Java requer o artefato ironpdf-engine-linux-x64 ao rodar dentro de qualquer container Docker. A implantação padrão Zip no Azure Functions não pode executar os binários nativos do IronPDF - Docker é o único método de implantação suportado.
Execute az login para autenticar o Azure CLI antes de prosseguir para a próxima seção.
Como Você Configura o Projeto de Azure Function?
O guia da Microsoft para criar uma função no Linux usando uma imagem personalizada cobre todo o processo de estruturação. Siga essas etapas com uma seleção importante: escolha Java quando solicitado para uma linguagem de programação.
Percorra o guia até que o projeto estruturado seja construído e a função de espaço reservado seja executada localmente usando o Core Tools do Azure Functions. Verifique isso com:
Uma vez que o espaço reservado responda a uma solicitação HTTP local, a estrutura do projeto está correta e pronta para integração do IronPDF. Os arquivos principais são pom.xml (configuração Maven), Function.java (código da função), e Dockerfile (definição do container).
Observe: O arquétipo Maven do Azure Functions gera um(a) host.json e local.settings.json junto com pom.xml. O arquivo local.settings.json armazena variáveis de ambiente para desenvolvimento local - ele é excluído do controle de versão por padrão e nunca deve ser commitado.
Como Você Adiciona Dependências do IronPDF ao Seu Projeto Maven?
IronPDF for Java é distribuído através do Maven Central. São necessários dois artefatos: a biblioteca core ironpdf que fornece a API Java, e ironpdf-engine-linux-x64 que empacota o motor Chromium nativo compilado para Linux x86-64. O artefato do motor é o que torna a implantação com Docker obrigatória - ele envia binários que devem ser executados em tempo de execução.
Abra pom.xml e adicione o seguinte dentro do bloco <dependencies>. Substitua LATEST_VERSION pelo lançamento atual disponível em Maven Central:
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/pom.xml<dependencies> <!-- IronPDF Java API --> <dependency> <groupId>com.ironsoftware</groupId> <artifactId>ironpdf</artifactId> <version>LATEST_VERSION</version> </dependency> <!-- Linux x64 engine — required for Docker/Azure Functions. This artifact bundles the native Chromium renderer for Linux. --> <dependency> <groupId>com.ironsoftware</groupId> <artifactId>ironpdf-engine-linux-x64</artifactId> <version>LATEST_VERSION</version> </dependency></dependencies>
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/pom.xml
<dependencies>
<!-- IronPDF Java API -->
<dependency>
<groupId>com.ironsoftware</groupId>
<artifactId>ironpdf</artifactId>
<version>LATEST_VERSION</version>
</dependency>
<!--
Linux x64 engine — required for Docker/Azure Functions.
This artifact bundles the native Chromium renderer for Linux.
-->
<dependency>
<groupId>com.ironsoftware</groupId>
<artifactId>ironpdf-engine-linux-x64</artifactId>
<version>LATEST_VERSION</version>
</dependency>
</dependencies>
XML
Ambos os artefatos devem usar o mesmo número de versão. Versões incompatíveis entre ironpdf e ironpdf-engine-linux-x64 causam uma exceção em tempo de execução quando a função tenta renderizar um PDF pela primeira vez.
Após atualizar pom.xml, execute mvn dependency:resolve para verificar se o Maven pode baixar ambos os artefatos do Central antes de investir tempo na construção da imagem do Docker.
Pontas: Verifique as notas de lançamento do IronPDF for Java para a versão estável mais recente. Usar a versão mais recente garante compatibilidade com o mecanismo de renderização Chromium mais recente e evita bugs conhecidos.
Como Você Escreve a Função RenderPdf?
A função RenderPdf é uma Função do Azure acionada por HTTP que aceita um parâmetro de consulta url, renderiza a página alvo usando o motor baseado em Chromium do IronPDF, e retorna o PDF resultante como uma resposta binária com um cabeçalho Content-Disposition: attachment. Este cabeçalho informa ao navegador (ou cliente HTTP) que deve baixar o PDF em vez de exibi-lo em linha.
O código completo da função é mostrado no Início Rápido acima. Coloque-o em src/main/java/com/example/Function.java, substituindo ou estendendo o espaço reservado gerado pelo arquétipo Maven.
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf-annotated.javaimport com.microsoft.azure.functions.*;import com.ironsoftware.ironpdf.PdfDocument;import java.util.Optional;public class Function { @FunctionName("RenderPdf") public HttpResponseMessage renderPdf( @HttpTrigger( name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, final ExecutionContext context) { // Log each invocation for Azure Monitor / Application Insights context.getLogger().info("RenderPdf triggered."); final String url = request.getQueryParameters().get("url"); // Return 400 if no URL was supplied if (url == null) { return request.createResponseBuilder(HttpStatus.BAD_REQUEST) .body("Provide a 'url' query parameter.") .build(); } try { // renderUrlAsPdf launches Chromium, loads the page, and captures it as PDF PdfDocument pdf = PdfDocument.renderUrlAsPdf(url); // getBinaryData returns the raw PDF bytes ready for transmission byte[] pdfBytes = pdf.getBinaryData(); return request.createResponseBuilder(HttpStatus.OK) .body(pdfBytes) .header("Content-Disposition", "attachment; filename=output.pdf") .header("Content-Type", "application/pdf") .build(); } catch (Exception ex) { context.getLogger().severe("Rendering error: " + ex.getMessage()); return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR) .body("PDF rendering failed.") .build(); } }}
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf-annotated.java
import com.microsoft.azure.functions.*;
import com.ironsoftware.ironpdf.PdfDocument;
import java.util.Optional;
public class Function {
@FunctionName("RenderPdf")
public HttpResponseMessage renderPdf(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
// Log each invocation for Azure Monitor / Application Insights
context.getLogger().info("RenderPdf triggered.");
final String url = request.getQueryParameters().get("url");
// Return 400 if no URL was supplied
if (url == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Provide a 'url' query parameter.")
.build();
}
try {
// renderUrlAsPdf launches Chromium, loads the page, and captures it as PDF
PdfDocument pdf = PdfDocument.renderUrlAsPdf(url);
// getBinaryData returns the raw PDF bytes ready for transmission
byte[] pdfBytes = pdf.getBinaryData();
return request.createResponseBuilder(HttpStatus.OK)
.body(pdfBytes)
.header("Content-Disposition", "attachment; filename=output.pdf")
.header("Content-Type", "application/pdf")
.build();
} catch (Exception ex) {
context.getLogger().severe("Rendering error: " + ex.getMessage());
return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
.body("PDF rendering failed.")
.build();
}
}
}
Java
PdfDocument.renderUrlAsPdf(url) lança uma instância do Chromium sem cabeça dentro do container, carrega completamente a URL alvo (incluindo JavaScript), e captura a saída renderizada como um PDF. Isso produz uma saída que é visualmente idêntica ao que o usuário vê em um navegador, tornando-o adequado para capturar aplicativos web modernos, painéis e páginas de relatório.
Importante: A configuração authLevel = AuthorizationLevel.ANONYMOUS no gatilho da função torna o endpoint publicamente acessível. Para implantações de produção, mude isso para FUNCTION ou ADMIN e passe a chave da função no cabeçalho da requisição.
Como Você Configura o Dockerfile para o IronPDF?
O mecanismo Chromium do IronPDF depende de um conjunto de bibliotecas Linux compartilhadas que não estão incluídas na imagem base do Azure Functions. A imagem base mcr.microsoft.com/azure-functions/java:4-java17-build é construída no Debian 11, então os pacotes devem ser instalados usando apt.
Os seguintes comandos RUN devem ser adicionados ao Dockerfile gerado pelo arquétipo Maven do Azure Functions. Coloque-os após a instrução FROM e antes das etapas COPY que adicionam o JAR da aplicação:
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/Dockerfile
FROM mcr.microsoft.com/azure-functions/java:4-java17-build AS installer-env
# Install system dependencies required by IronPDF's Chromium renderer
RUN apt-get update && apt-get install -y \
libgdiplus \
libxkbcommon-x11-0 \
libc6 \
libc6-dev \
libgtk2.0-0 \
libnss3 \
libatk-bridge2.0-0 \
libx11-xcb1 \
libxcb-dri3-0 \
libdrm-common \
libgbm1 \
libasound2 \
libxrender1 \
libfontconfig1 \
libxshmfence1 \
&& apt-get install -y xvfb libva-dev libgdiplus \
&& rm -rf /var/lib/apt/lists/*
# Copy the built function JAR
COPY --from=installer-env /home/site/wwwroot /home/site/wwwroot
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
Text
O pacote libgdiplus fornece compatibilidade com GDI+ para renderização gráfica. libnss3 e libatk-bridge2.0-0 são necessários pelas camadas de sandboxing e acessibilidade do Chromium. xvfb fornece um framebuffer virtual, que o Chromium requer mesmo em modo sem cabeça em algumas configurações Debian. A etapa rm -rf /var/lib/apt/lists/* no final do bloco RUN remove o cache do gerenciador de pacotes, mantendo o tamanho da imagem final o mais pequeno possível.
Observe: Se a versão da imagem base do Azure Functions mudar ou for usada uma distro Linux diferente como base, os pacotes necessários podem diferir. Consulte o Guia de Instalação do IronPDF Linux para uma matriz de dependência completa entre Debian, Ubuntu, CentOS e Alpine.
Como Você Constrói e Empurra a Imagem Docker?
Com o projeto Maven construído e o Dockerfile atualizado, a imagem contêiner pode ser montada e carregada em um registro Docker. O Azure Functions puxa esta imagem quando o Aplicativo de Função é criado ou atualizado.
Passo 1 - Compile e empacote o projeto Maven:
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/build.sh# Compile the Java code and package it as a JARmvn clean package
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/build.sh
# Compile the Java code and package it as a JAR
mvn clean package
SHELL
O Maven compila o código da função, resolve todas as dependências (incluindo ambos os artefatos do IronPDF), e produz um JAR implantável no diretório target/. Corrija quaisquer erros de compilação antes de prosseguir.
Passo 2 - Construa a imagem Docker:
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-build.sh# Replace <DOCKER_ID> with your Docker Hub username or ACR login serverdocker build --tag <DOCKER_ID>/ironpdf-azure-functions:v1.0.0 .
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-build.sh
# Replace <DOCKER_ID> with your Docker Hub username or ACR login server
docker build --tag <DOCKER_ID>/ironpdf-azure-functions:v1.0.0 .
SHELL
A construção instala os pacotes Linux listados no Dockerfile, copia o JAR e coloca tudo em camadas em uma imagem final. Na primeira construção, pode levar vários minutos enquanto downloads de pacotes e cache de camadas são estabelecidos. Construções subsequentes usando a mesma imagem base são significativamente mais rápidas.
Passo 3 - Empurre a imagem para o Docker Hub:
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-push.sh# Authenticate if not already logged indocker login# Push the image to the registrydocker push <DOCKER_ID>/ironpdf-azure-functions:v1.0.0
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-push.sh
# Authenticate if not already logged in
docker login
# Push the image to the registry
docker push <DOCKER_ID>/ironpdf-azure-functions:v1.0.0
SHELL
Pontas: Azure Container Registry (ACR) é uma alternativa privada ao Docker Hub. ACR se integra diretamente ao Azure Active Directory e é a escolha recomendada para cargas de trabalho de produção onde a privacidade da imagem é importante.
Como Você Implanta a Função no Azure?
Com a imagem no registro, o Aplicativo de Função do Azure pode ser criado (ou atualizado) para referenciá-la. O comando az functionapp create provisiona o Function App, o vincula a uma conta de armazenamento, e define a imagem do container em um único passo.
Passo 1 - Crie ou atualize o Aplicativo de Função:
Substitua <APP_NAME> por um nome globalmente único para o Function App, <STORAGE_NAME> por um nome de conta de Armazenamento Azure existente, e <DOCKER_ID> pelo nome de usuário do Docker Hub ou servidor de login ACR usado na etapa anterior.
A flag --plan myPremiumPlan seleciona um plano de hospedagem Premium. O mecanismo Chromium do IronPDF consome memória significativa durante a renderização; O limite de memória de 1.5 GB do plano de Consumo geralmente é insuficiente. O plano Premium fornece pelo menos 3.5 GB e suporta instâncias pré-aquecidas que eliminam a latência de início a frio.
Passo 2 - Verifique a implantação:
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/az-verify.sh# Check that the function app is running and the container has been pulledaz functionapp show \ --name <APP_NAME> \ --resource-group AzureFunctionsContainers-rg \ --query "state"
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/az-verify.sh
# Check that the function app is running and the container has been pulled
az functionapp show \
--name <APP_NAME> \
--resource-group AzureFunctionsContainers-rg \
--query "state"
SHELL
O comando retorna "Running" quando o contêiner foi iniciado com sucesso. Se retornar "Starting" ou um erro, verifique o Log Stream do portal do Azure no Function App para erros de inicialização ou pull do contêiner.
Aviso: O plano de Consumo (Serverless) não é recomendado para IronPDF no Azure Functions. A renderização de PDF com Chromium requer mais memória do que o plano de Consumo aloca. Use um plano Premium ou Dedicado (App Service) para evitar erros de out-of-memory.
Como Você Aciona e Testa a Função?
Uma vez que o Function App relata um estado Running, o endpoint RenderPdf está pronto para aceitar requisições. O URL do endpoint segue um padrão previsível baseado no nome do Function App e no nome da função definido na anotação @FunctionName.
Teste usando um navegador ou curl:
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/test-request.sh# Replace <APP_NAME> with the Function App namecurl -o output.pdf \ "https://<APP_NAME>.azurewebsites.net/api/RenderPdf?url=https://www.example.com"
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/test-request.sh
# Replace <APP_NAME> with the Function App name
curl -o output.pdf \
"https://<APP_NAME>.azurewebsites.net/api/RenderPdf?url=https://www.example.com"
SHELL
Uma resposta bem-sucedida salva um arquivo PDF chamado output.pdf no diretório atual. A flag -o no curl grava o corpo da resposta binária em um arquivo em vez de imprimi-lo no terminal.
O navegador irá solicitar o download de um PDF. Abra-o para verificar se a página foi renderizada corretamente.
Importante: A primeira solicitação após um início a frio pode levar 20-60 segundos enquanto o Azure baixa a imagem do contêiner e o IronPDF inicializa o Chromium. Solicitações subsequentes dentro do mesmo tempo de vida do contêiner são muito mais rápidas. O recurso de instância pré-aquecida do plano Premium elimina inícios a frio mantendo pelo menos uma instância em execução continuamente.
Verificando logs para erros: Navegue até o portal do Azure, abra o Aplicativo de Função e selecione Stream de Log em Monitoramento. As entradas de log das chamadas context.getLogger() aparecem aqui em quase tempo real, o que torna o diagnóstico de falhas de renderização direto.
Quais são os próximos passos?
Este guia demonstrou como implantar o IronPDF for Java dentro de um contêiner Docker do Azure Functions, escrever uma função acionada por HTTP que renderiza URLs como PDFs, configurar o Dockerfile com as dependências Linux necessárias e testar o endpoint ao vivo. O mesmo padrão se estende para casos de uso mais avançados com mudanças mínimas.
Estenda a função:
Renderizar strings HTML diretamente usando PdfDocument.renderHtmlAsPdf(htmlString) em vez de uma URL
Por que é necessário a implantação de Docker para o IronPDF no Azure Functions?
IronPDF vem com um mecanismo de renderização Chromium nativo que deve executar binários em tempo de execução. A implantação Zip do Azure Functions não pode executar binários nativos, portanto, uma imagem de contêiner Docker é o único caminho de implantação suportado.
Quais artefatos Maven são necessários para executar o IronPDF dentro de um contêiner Docker?
São necessários dois artefatos em pom.xml: com.ironsoftware:ironpdf para a API Java e com.ironsoftware:ironpdf-engine-linux-x64 para o mecanismo Chromium nativo. Ambos devem compartilhar o mesmo número de versão.
Quais pacotes Linux o Dockerfile deve instalar para o IronPDF?
O Dockerfile deve instalar libgdiplus, libxkbcommon-x11-0, libc6, libc6-dev, libgtk2.0-0, libnss3, libatk-bridge2.0-0, libx11-xcb1, libxcb-dri3-0, libdrm-common, libgbm1, libasound2, libxrender1, libfontconfig1, libxshmfence1, xvfb e libva-dev.
O que a função RenderPdf faz?
A função RenderPdf é uma função Azure acionada por HTTP que lê um parâmetro de consulta url, o passa para PdfDocument.renderUrlAsPdf, e retorna os bytes resultantes do PDF com um cabeçalho Content-Disposition: attachment para que o chamador receba um arquivo PDF para download.
Qual plano de hospedagem no Azure Functions deve ser usado para o IronPDF?
O plano Premium é recomendado. O mecanismo Chromium do IronPDF requer memória significativa - muitas vezes mais do que o limite de 1,5 GB no plano de Consumo. O plano Premium fornece pelo menos 3,5 GB e suporta instâncias pré-aquecidas para eliminar a latência de início a frio.
Por que a primeira solicitação para uma função recém-implantada é lenta?
A primeira solicitação após um início a frio pode levar de 20 a 60 segundos porque o Azure deve puxar a imagem do contêiner e o IronPDF deve inicializar seu mecanismo Chromium. As solicitações subsequentes dentro do mesmo tempo de vida do contêiner respondem muito mais rapidamente. O recurso de instâncias pré-aquecidas do plano Premium pode eliminar esse atraso.
Como você atualiza um Function App do Azure existente para usar uma nova imagem Docker?
Reconstrua e envie a nova imagem com uma tag atualizada, depois execute az functionapp create novamente com o novo valor --deployment-container-image-name, ou atualize as configurações do contêiner no portal Azure sob o centro de implantação do Function App.
O IronPDF pode renderizar strings HTML em uma função Azure, não apenas URLs?
Sim. Substitua PdfDocument.renderUrlAsPdf(url) por PdfDocument.renderHtmlAsPdf(htmlString) para renderizar diretamente uma string HTML. A estrutura da função e o manuseio da resposta permanecem os mesmos.
O que acontece se o parâmetro de consulta url estiver ausente da solicitação?
A função verifica se o parâmetro url é null e retorna uma resposta HTTP 400 Bad Request com uma mensagem descritiva antes de tentar qualquer renderização de PDF.
Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.