IRONSOFTWAREHOME
VÍDEOS

Como desenhar texto e bitmap em PDFs

Curtis Chau
Curtis Chau
Updated: 19 de julho de 2026

Apache PDFBox é uma biblioteca Java de código aberto muito respeitada para manipulação de PDFs. No entanto, para desenvolvedores .NET , as opções disponíveis são adaptações não oficiais feitas pela comunidade que apresentam desafios significativos — APIs no estilo Java, cobertura incompleta de recursos e suporte limitado da comunidade .NET . Este guia fornece um caminho de migração detalhado das versões do Apache PDFBox for .NET para o IronPDF, uma biblioteca PDF nativa do .NET criada especificamente para o ecossistema .NET .

Por que considerar a migração das portas .NET do Apache PDFBox?

Embora o Apache PDFBox seja excelente no ecossistema Java, suas versões não oficiais para .NET apresentam diversos desafios que afetam as equipes de desenvolvimento .NET .

Status não oficial do porto

Apache PDFBox é principalmente uma biblioteca Java (linha atual 3.0.7, legado 2.0.36, Licença Apache 2.0). Todas as opções .NET são ports conduzidos pela comunidade, e a maioria está abandonada: Pdfbox 1.1.1 (última publicada em 2013, construída contra PDFBox 1.8.2), Pdfbox-IKVM 1.8.9 (última publicada em março de 2017), e PdfBox_DotNet_Version 2.0.15 (última publicada em julho de 2019). A única opção ativamente mantida é MASES.NetPDF (linha 3.0.x, acompanhando o PDFBox 3.0.x), que é um invólucro JCOBridge que requer uma JVM em tempo de execução junto com o CLR. Esses ports muitas vezes ficam atrás dos lançamentos Java e podem perder recursos críticos, correções de bugs ou atualizações de segurança — um risco digno de consideração para projetos .NET de longa duração.

Design de API com foco em Java

As APIs adaptadas mantêm convenções do Java que parecem estranhas no código .NET . Os desenvolvedores encontram métodos camelCase em vez de PascalCase, objetos Java File em vez de strings padrão .NET, e chamadas explícitas close() em vez de padrões IDisposable. Essa sobrecarga cognitiva afeta a velocidade de desenvolvimento e a facilidade de manutenção do código.

Sem capacidade de renderização de HTML

O Apache PDFBox foi projetado para manipulação de PDFs, não para conversão de HTML para PDF. A criação de PDFs exige a construção manual de páginas com posicionamento preciso de coordenadas — um processo tedioso e propenso a erros que não é escalável para as necessidades modernas de geração de documentos.

Suporte limitado da comunidade .NET

O ecossistema .NET em torno das versões do Apache PDFBox é escasso. Encontrar ajuda, exemplos ou boas práticas para problemas específicos do .NET se mostra difícil em comparação com bibliotecas que possuem comunidades .NET ativas.

Dependências JVM

Os ports baseados em IKVM (Pdfbox-IKVM, Pdfbox) agrupam uma reimplementação .NET da JVM, enquanto MASES.NetPDF chama uma JVM real via JCOBridge. De qualquer forma, a implantação carrega bagagem de runtime Java que bibliotecas .NET idiomáticas evitam.

Apache PDFBox vs. IronPDF: Principais diferenças

Compreender as diferenças fundamentais entre essas bibliotecas ajuda a planejar uma estratégia de migração eficaz.

AspectoPortas .NET do Apache PDFBoxIronPDF
Design nativoPortabilidade não oficial para .NET centrada em JavaBiblioteca nativa do .NET
Estilo APIConvenções Java (camelCase, close())C# idiomático (PascalCase, using)
Renderização HTMLNão suportado (construção manual de páginas)HTML/CSS/JS totalmente baseado no Chromium
Criação de PDFPosicionamento manual de coordenadasLayout baseado em CSS
ComunidadeRecursos .NET esparsos e focados em JavaComunidade ativa de .NET
ApoiarExclusivo para a comunidadeSuporte comercial disponível
Limpeza de recursosChamadas explícitas close()IDisposable com declarações using

Preparação pré-migratória

Pré-requisitos

Certifique-se de que seu ambiente atenda a estes requisitos:

  • .NET Framework 4.6.2 ou superior ou .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019 ou superior ou JetBrains Rider
  • Acesso ao Gerenciador de Pacotes NuGet
  • Chave de licença do IronPDF(teste gratuito disponível em IronPDF )

Auditoria de uso do Apache PDFBox

Execute estes comandos no diretório da sua solução para identificar todas as referências ao Apache PDFBox:

grep -r "org.apache.pdfbox\|Org.Apache.Pdfbox\|PDDocument\|PDFTextStripper" --include="*.cs" .
grep -rE "Pdfbox|Pdfbox-IKVM|PdfBox_DotNet_Version|MASES\.NetPDF" --include="*.csproj" .
SHELL

Mudanças significativas a serem previstas

CategoriaPorta Apache PDFBox .NETIronPDFAção contra a migração
Modelo de ObjetoPDDocument, PDPagePdfDocument, ChromePdfRendererHierarquia de classes diferente
Criação de PDFPágina manual/fluxos de conteúdoRenderização HTMLReescrever a lógica de criação
Método EstilocamelCase() (estilo Java)PascalCase() (estilo .NET)Atualizar nomes de métodos
Limpeza de recursosdocument.close()Declarações usingAlterar o padrão de descarte
Acesso a arquivosObjetos Java FileStrings/fluxos padrão do .NETUse tipos .NET
Extração de textoClasse PDFTextStripperpdf.ExtractAllText()API mais simples

Processo de migração passo a passo

Passo 1: Atualizar pacotes NuGet

Remova os pacotes da porta .NET do Apache PDFBox e instale o IronPDF:

# Remove whichever PDFBox .NET port your project uses
dotnet remove package Pdfbox            # built against PDFBox 1.8.2 (2013)
dotnet remove package Pdfbox-IKVM       # IKVM wrapper, last update 2017
dotnet remove package PdfBox_DotNet_Version  # last update 2019
dotnet remove package MASES.NetPDF      # JCOBridge wrapper, requires JVM

# Install IronPDF
dotnet add package IronPdf
SHELL

Etapa 2: Configurar a chave de licença

Adicione a chave de licença do IronPDF na inicialização do aplicativo:

// Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Etapa 3: Atualizar referências de namespace

Execute uma operação global de localizar e substituir em toda a sua solução:

Todos os ports PDFBox .NET espelham a hierarquia de pacotes Java. Os ports baseados em IKVM mantêm a forma em minúsculas do Java (org.apache.pdfbox.*); MASES.NetPDF coloca em maiúsculas para C# (Org.Apache.Pdfbox.*).

EncontrarSubstitua por
using org.apache.pdfbox.pdmodel; (ports IKVM)using IronPdf;
using org.apache.pdfbox.text; (ports IKVM)using IronPdf;
using org.apache.pdfbox.multipdf; (ports IKVM)using IronPdf;
using Org.Apache.Pdfbox.Pdmodel; (MASES.NetPDF)using IronPdf;
using Org.Apache.Pdfbox.Text; (MASES.NetPDF)using IronPdf;

Referência completa para migração de API

Operações de Documentos

Método Apache PDFBoxMétodo IronPDF
PDDocument.load(path)PdfDocument.FromFile(path)
PDDocument.load(stream)PdfDocument.FromStream(stream)
new PDDocument()new ChromePdfRenderer()
document.save(path)pdf.SaveAs(path)
document.close()Declaração using ou Dispose()
document.getNumberOfPages()pdf.PageCount
document.getPage(index)pdf.Pages[index]
document.removePage(index)pdf.RemovePages(index)

Extração de texto

Método Apache PDFBoxMétodo IronPDF
new PDFTextStripper()Não é necessário
stripper.getText(document)pdf.ExtractAllText()
stripper.setStartPage(n)pdf.Pages[n].Text
stripper.setSortByPosition(true)Automático

Operações de Fusão e Divisão

Método Apache PDFBoxMétodo IronPDF
new PDFMergerUtility()Não é necessário
merger.addSource(file)Carregar com FromFile()
merger.mergeDocuments()PdfDocument.Merge(pdfs)
new Splitter()Não é necessário
splitter.split(document)pdf.CopyPages(indices)

Segurança e Criptografia

Método Apache PDFBoxMétodo IronPDF
StandardProtectionPolicypdf.SecuritySettings
policy.setUserPassword()pdf.SecuritySettings.UserPassword
policy.setOwnerPassword()pdf.SecuritySettings.OwnerPassword
policy.setPermissions()pdf.SecuritySettings.AllowUserXxx

Exemplos de migração de código

Extração de texto

A operação mais comum do Apache PDFBox demonstra a simplificação da API proporcionada IronPDF.

Implementação da porta .NET do Apache PDFBox:

// Apache PDFBox is a Java library — there is no official .NET port.
// Example uses Pdfbox-IKVM (last published 2017) on NuGet; namespaces
// mirror the Java packages exactly because IKVM exposes the Java API.
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.text;
using java.io;
using System;

class Program
{
    static void Main()
    {
        PDDocument document = PDDocument.load(new File("document.pdf"));
        try
        {
            PDFTextStripper stripper = new PDFTextStripper();
            string text = stripper.getText(document);
            Console.WriteLine(text);
        }
        finally
        {
            document.close();
        }
    }
}

Implementação do IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("document.pdf");
        string text = pdf.ExtractAllText();
        Console.WriteLine(text);
        
        // Or extract text from specific pages
        string pageText = pdf.ExtractTextFromPage(0);
        Console.WriteLine(pageText);
    }
}

IronPDF elimina a classe PDFTextStripper inteiramente, substituindo a extração em múltiplas etapas por uma única chamada de método.

Conversão de HTML para PDF

O Apache PDFBox não oferece suporte nativo à conversão de HTML para PDF — isso representa uma lacuna fundamental de funcionalidade.

Implementação do IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML to PDF</p>");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}

O mecanismo de renderização do IronPDF, baseado no Chromium, oferece suporte completo a HTML, CSS e JavaScript . Para cenários avançados, consulte a documentação de conversão de HTML para PDF .

Unir vários PDFs

Implementação da porta .NET do Apache PDFBox:

// Apache PDFBox via a .NET port (e.g. Pdfbox-IKVM on nuget.org).
// The Java class org.apache.pdfbox.multipdf.PDFMergerUtility is exposed
// directly through IKVM, so method names stay Java-style (camelCase).
using org.apache.pdfbox.multipdf;
using org.apache.pdfbox.io;
using System;

class Program
{
    static void Main()
    {
        PDFMergerUtility merger = new PDFMergerUtility();
        merger.addSource("document1.pdf");
        merger.addSource("document2.pdf");
        merger.setDestinationFileName("merged.pdf");
        // MemoryUsageSetting governs heap vs temp-file buffering
        merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
        Console.WriteLine("PDFs merged");
    }
}

Implementação do IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");
        var pdf3 = PdfDocument.FromFile("document3.pdf");
        
        var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
        merged.SaveAs("merged.pdf");
        Console.WriteLine("PDFs merged successfully");
    }
}

O método estático Merge do IronPDF aceita múltiplos documentos diretamente, eliminando o padrão de classe utilitária.

Criando PDFs do zero

A diferença mais notável surge na criação de PDFs. O Apache PDFBox requer posicionamento manual de coordenadas.

Implementação da porta .NET do Apache PDFBox:

using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.font;
using org.apache.pdfbox.pdmodel.edit;

public void CreatePdf(string outputPath)
{
    PDDocument document = new PDDocument();
    try
    {
        PDPage page = new PDPage();
        document.addPage(page);

        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        PDFont font = PDType1Font.HELVETICA_BOLD;

        contentStream.beginText();
        contentStream.setFont(font, 24);
        contentStream.moveTextPositionByAmount(72, 700);
        contentStream.drawString("Hello World");
        contentStream.endText();

        contentStream.beginText();
        contentStream.setFont(PDType1Font.HELVETICA, 12);
        contentStream.moveTextPositionByAmount(72, 650);
        contentStream.drawString("This is a paragraph of text.");
        contentStream.endText();

        contentStream.close();
        document.save(outputPath);
    }
    finally
    {
        document.close();
    }
}

Implementação do IronPDF:

using IronPdf;

public void CreatePdf(string outputPath)
{
    var renderer = new ChromePdfRenderer();

    string html = @"
        <html>
        <head>
            <style>
                body { font-family: Helvetica, Arial, sans-serif; margin: 1in; }
                h1 { font-size: 24pt; font-weight: bold; }
                p { font-size: 12pt; }
            </style>
        </head>
        <body>
            <h1>Hello World</h1>
            <p>This is a paragraph of text.</p>
        </body>
        </html>";

    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(outputPath);
}

A criação baseada em HTML/CSS elimina cálculos de coordenadas, gerenciamento de fontes e manipulação do fluxo de conteúdo.

Adicionando proteção por senha

Implementação da porta .NET do Apache PDFBox:

using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.encryption;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    PDDocument document = PDDocument.load(new File(inputPath));
    try
    {
        AccessPermission ap = new AccessPermission();
        ap.setCanPrint(true);
        ap.setCanExtractContent(false);

        StandardProtectionPolicy spp = new StandardProtectionPolicy(password, password, ap);
        spp.setEncryptionKeyLength(128);

        document.protect(spp);
        document.save(outputPath);
    }
    finally
    {
        document.close();
    }
}

Implementação do IronPDF:

using IronPdf;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.SecuritySettings.UserPassword = password;
    pdf.SecuritySettings.OwnerPassword = password;
    pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
    pdf.SecuritySettings.AllowUserCopyPasteContent = false;

    pdf.SaveAs(outputPath);
}

O IronPDF usa propriedades fortemente tipadas em vez de objetos de permissão e política separados.

Adicionando marcas d'água

Implementação da porta .NET do Apache PDFBox:

using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.pdmodel.edit;
using org.apache.pdfbox.pdmodel.font;

public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
    PDDocument document = PDDocument.load(new File(inputPath));
    try
    {
        PDFont font = PDType1Font.HELVETICA_BOLD;

        for (int i = 0; i < document.getNumberOfPages(); i++)
        {
            PDPage page = document.getPage(i);
            PDPageContentStream cs = new PDPageContentStream(
                document, page, PDPageContentStream.AppendMode.APPEND, true, true);

            cs.beginText();
            cs.setFont(font, 72);
            cs.setNonStrokingColor(200, 200, 200);
            cs.setTextMatrix(Matrix.getRotateInstance(Math.toRadians(45), 200, 400));
            cs.showText(watermarkText);
            cs.endText();
            cs.close();
        }

        document.save(outputPath);
    }
    finally
    {
        document.close();
    }
}

Implementação do IronPDF:

using IronPdf;

public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.ApplyWatermark(
        $"<h1 style='color:lightgray;font-size:72px;'>{watermarkText}</h1>",
        rotation: 45,
        opacity: 50);

    pdf.SaveAs(outputPath);
}

A marca d'água baseada em HTML do IronPDF elimina a iteração de páginas e os cálculos matriciais.

Conversão de URL para PDF

O Apache PDFBox não suporta a conversão de URL para PDF. O IronPDF oferece suporte nativo:

using IronPdf;

public void ConvertUrlToPdf(string url, string outputPath)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderUrlAsPdf(url);
    pdf.SaveAs(outputPath);
}

Para obter informações completas sobre as opções de conversão de URL, consulte a documentação de URL para PDF .

Cabeçalhos e rodapés

O Apache PDFBox exige posicionamento manual em cada página, sem suporte integrado para cabeçalho/rodapé. O IronPDF oferece configuração declarativa:

using IronPdf;

public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Document Title",
        FontSize = 12
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        FontSize = 10
    };

    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(outputPath);
}

Para layouts avançados, consulte a documentação de cabeçalhos e rodapés .

Integração com ASP.NET Core

O IronPDF integra-se naturalmente com aplicações web .NET modernas:

[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderHtmlAsPdf(request.Html);

    return File(pdf.BinaryData, "application/pdf", "report.pdf");
}

Suporte assíncrono

As versões do Apache PDFBox não suportam operações assíncronas. O IronPDF oferece recursos completos de async/await:

using IronPdf;

public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}

Configuração de Injeção de Dependência

public interface IPdfService
{
    Task<byte[]> GeneratePdfAsync(string html);
    string ExtractText(string pdfPath);
}

public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    }

    public async Task<byte[]> GeneratePdfAsync(string html)
    {
        using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }

    public string ExtractText(string pdfPath)
    {
        using var pdf = PdfDocument.FromFile(pdfPath);
        return pdf.ExtractAllText();
    }
}

Otimização de desempenho

Comparação de uso de memória

CenárioPorta Apache PDFBox .NETIronPDF
Extração de texto~80 MB~50 MB
Criação de PDF~100 MB~60 MB
Lote (100 PDFs)Alto (limpeza manual)~100 MB

Dicas de otimização

Use declarações using:

// Automático cleanup with IDisposable pattern
using var pdf = PdfDocument.FromFile(path);

Reutilizar o renderizador para operações em lote:

var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs($"output_{i}.pdf");
}

Utilizando Async em Aplicações Web:

using var pdf = await renderer.RenderHtmlAsPdfAsync(html);

Solução de problemas comuns de migração

Problema: Nomes de métodos no estilo Java não encontrados

Substitua métodos Java camelCase por equivalentes .NET PascalCase:

// PDFBox: stripper.getText(document)
// IronPDF: pdf.ExtractAllText()

// PDFBox: document.getNumberOfPages()
// IronPDF: pdf.PageCount

Problema: Método close() Não Encontrado

IronPDF usa o padrão IDisposable:

// PDFBox
document.close();

// IronPDF
using var pdf = PdfDocument.FromFile(path);
// Automático disposal at end of scope

Problema: Nenhum Equivalente PDFTextStripper

A extração de texto é simplificada para um único método:

// IronPDF: Just call ExtractAllText()
string text = pdf.ExtractAllText();

// Per-page extraction:
string pageText = pdf.Pages[0].Text;

Problema: PDFMergerUtility Não Encontrado

Use o método estático Merge:

//IronPDF uses static Merge
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
C#

Lista de verificação pós-migração

Após concluir a migração do código, verifique o seguinte:

  • Executar todos os testes de unidade e integração existentes
  • Compare visualmente as saídas em PDF com as versões anteriores.
  • Testar a precisão da extração de texto
  • Verifique se o licenciamento funciona corretamente (IronPdf.License.IsLicensed)
  • Comparação de desempenho com a implementação anterior.
  • Atualizar dependências do pipeline CI/CD
  • Documente novos padrões para sua equipe de desenvolvimento.

Recursos adicionais


A migração das versões .NET do Apache PDFBox para o IronPDF transforma sua base de código PDF de padrões no estilo Java para C# idiomático. A mudança do posicionamento manual de coordenadas para a renderização em HTML/CSS, combinada com o suporte nativo a operações assíncronas e a integração moderna com o .NET , proporciona um código mais limpo e de fácil manutenção, com suporte profissional para suas aplicações em produção.

Observe: Apache PDFBox é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, patrocinado ou tem endosso da Apache Software Foundation. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.
Curtis Chau
Redator Técnico

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.

...
Leia mais

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.