Ir para o conteúdo do rodapé
COMPARAçãO DE PRODUTOS

IronPDF vs PDFTron (Apryse): Comparação completa de bibliotecas PDF em C# para 2025

Procurando a biblioteca PDF ideal para o seu projeto .NET ? Esta comparação abrangente entre IronPDF e PDFTron (agora Apryse) analisa recursos, preços, desempenho e experiência do desenvolvedor para ajudá-lo a tomar uma decisão informada. Seja para desenvolver aplicações web, software para desktop ou serviços em nuvem, escolher o conjunto de ferramentas PDF certo pode impactar significativamente a velocidade de desenvolvimento e o sucesso do projeto.

Resumo da comparação rápida

**Categoria** **Característica/Aspecto** **IronPDF** **PDFTron (Apryse)** **Principal vantagem**
**Arquitetura Central** Filosofia de Design Simplicidade em primeiro lugar, motor Chrome V8 Motor personalizado focado em empresas IronPDF: Desenvolvimento mais rápido
Complexidade da API Métodos simples como RenderHtmlAsPdf() IronPDF: 70% menos código
Curva de Aprendizagem 1 a 2 dias normalmente 1 a 2 semanas normalmente IronPDF: Adoção mais rápida
**Suporte da plataforma** Multiplataforma Suporte nativo, pacote único São necessários vários pacotes/módulos IronPDF: Implantação mais simples
Versões .NET .NET 10, 9, 8, 7, 6, 5, Core 3.1+, Framework 4.6.2+ Suporte semelhante com configuração adicional. Ambos: Suporte a frameworks modernos
**HTML para PDF** Motor de renderização Motor V8 totalmente cromado Motor personalizado (via módulo HTML2PDF) IronPDF: fidelidade de navegador superior a 98%
Suporte a JavaScript Suporte completo com atrasos de renderização Suporte limitado IronPDF: Conteúdo dinâmico pronto
**Suporte do MS Office** DOCX para PDF DocxToPdfRenderer integrado PDFTron: Melhor fidelidade ao Office
Suporte CAD Não disponível Conversão de DWG, DXF e DGN para PDF PDFTron: Fluxos de trabalho CAD
**Desempenho** Velocidade de renderização HTML Tempo típico de 0,8 a 1,2 segundos (motor Chrome) 0,3-0,5s típico (HTML simples) PDFTron: Mais rápido para HTML básico
Uso de memória 150-200 MB (processo do Chrome) 80-120 MB típicos PDFTron: Menor consumo de memória
**Licensing & Pricing** Nível inicial Lite: $799 (1 dev, 1 project) Orçamento personalizado (estimado entre US$ 5.000 e US$ 10.000 ou mais) IronPDF: Preços transparentes
Empresa Professional: $2,399 (10 devs) Orçamento personalizado (estimado em US$ 30.000 ou mais) IronPDF: Economia de até 90% nos custos
**Apoiar** Suporte incluído Sim, suporte técnico 24 horas por dia, 5 dias por semana. Varia conforme o nível da licença. IronPDF: Suporte incluído
**Ideal para** Casos de uso Aplicativos web modernos, relatórios HTML, desenvolvimento rápido Fluxos de trabalho com grande volume de documentos, conversão de CAD/Office Dependente do contexto

O que são IronPDF e PDFTron (Apryse)?

Visão geral do IronPDF

IronPDF é uma biblioteca .NET completa para PDF que simplifica a criação, edição e manipulação de PDFs para desenvolvedores. Baseado no mecanismo de renderização do Chrome, ele se destaca na conversão de HTML, CSS e JavaScript em documentos PDF com qualidade de imagem perfeita. O design de API intuitivo da biblioteca permite que os desenvolvedores integrem a funcionalidade de PDF com o mínimo de código, tornando-a ideal para aplicativos web, sistemas de relatórios e automação de documentos.

Visão geral do PDFTron (Apryse)

O PDFTron, renomeado como Apryse em fevereiro de 2023, é um SDK de PDF voltado para empresas que oferece amplas funcionalidades de processamento de documentos. Originalmente desenvolvido para fluxos de trabalho complexos de documentos, oferece suporte robusto a vários formatos de arquivo, incluindo Microsoft Office, desenhos CAD e tipos de documentos especializados. A PDFTron Systems Inc., líder global em tecnologia de processamento de documentos, anunciou sua mudança de nome para Apryse; reunindo 13 empresas, incluindo iText, Windward, Eversign e outras.

Como faço para criar um projeto ASP.NET para geração de PDFs?

Configurar um projeto ASP.NET para geração de PDFs requer uma configuração adequada, independentemente da biblioteca escolhida. Siga estes passos para criar uma base para a integração com o IronPDF ou o PDFTron:

  1. Abra o Visual Studio 2022 ou posterior.
  2. Clique em "Criar um novo projeto"
  3. Selecione "Aplicativo Web ASP.NET Core " (recomenda-se .NET 6.0 ou posterior).
  4. Escolha o nome e a localização do seu projeto.
  5. Selecione "Aplicação Web (Model-View-Controller)" ou "API Web" de acordo com suas necessidades.
  6. Certifique-se de selecionar ".NET 8.0" ou posterior para obter a compatibilidade ideal.

Caixa de diálogo de novo projeto do Visual Studio mostrando a seleção de Aplicativo Web ASP.NET Core A caixa de diálogo Novo Projeto do Visual Studio exibe modelos de projeto ASP.NET para integração com biblioteca PDF.

Para aplicações Web Forms:

  • Selecione "Aplicação Web ASP.NET (.NET Framework)"
  • Selecione "Formulários Web" nas opções do modelo.
  • Clique em "Criar" para gerar a estrutura do projeto.

Seleção de modelo de Formulários Web no assistente de criação de projetos do Visual Studio Selecionando um modelo de Formulários Web para aplicações ASP.NET tradicionais com recursos de PDF.

Como instalo o IronPDF no meu projeto C#?

O IronPDF oferece vários métodos de instalação para se adequar a diferentes fluxos de trabalho de desenvolvimento. No Visual Studio, clique com o botão direito do mouse no seu projeto no Solution Explorer e selecione "Gerenciar Pacotes NuGet...". A partir daí, basta pesquisar por IronPDF e instalar a versão mais recente.

Método 1: Usando o Gerenciador de Pacotes do Visual Studio

A abordagem mais simples utiliza o gerenciador de pacotes NuGet integrado do Visual Studio:

  1. Clique com o botão direito do mouse no seu projeto no Explorador de Soluções.
  2. Selecione "Gerenciar pacotes NuGet "
  3. Clique em "Procurar" e pesquise por "IronPDF".
  4. Clique em "Instalar" no pacote IronPDF.

Menu de contexto do Solution Explorer mostrando a opção Gerenciar Pacotes NuGet Acessando o Gerenciador de Pacotes NuGet através do Solution Explorer do Visual Studio para a instalação do IronPDF

Menu Projeto no Visual Studio mostrando opções de gerenciamento de pacotes Acesso alternativo ao Gerenciador de Pacotes NuGet através do menu Projeto do Visual Studio

 Interface do Gerenciador de Pacotes NuGet mostrando a instalação do IronPDF Instalando o IronPDF através do Gerenciador de Pacotes NuGet com informações de versão e dependências.

Método 2: Usando o Console do Gerenciador de Pacotes

Para desenvolvedores que preferem ferramentas de linha de comando:

# Open Package Manager Console in Visual Studio
# Tools > NuGet Package Manager > Package Manager Console
Install-Package IronPdf

# For specific version installation
Install-Package IronPdf -Version 2025.7.0
# Open Package Manager Console in Visual Studio
# Tools > NuGet Package Manager > Package Manager Console
Install-Package IronPdf

# For specific version installation
Install-Package IronPdf -Version 2025.7.0
SHELL

Método 3: Instalação por Download Direto

Para ambientes sem acesso ao NuGet :

  1. Faça o download no site oficial do IronPDF .
  2. Extraia o arquivo ZIP para o diretório do seu projeto.
  3. No Visual Studio, clique com o botão direito do mouse em "Referências" → "Adicionar Referência"
  4. Navegue até e selecione IronPdf.dll

Método 4: Usando a CLI do .NET

Para entusiastas da linha de comando e pipelines de CI/CD:

# Navigate to your project directory
cd MyProject

# Install IronPDF
dotnet add package IronPdf

# Restore packages
dotnet restore
# Navigate to your project directory
cd MyProject

# Install IronPDF
dotnet add package IronPdf

# Restore packages
dotnet restore
SHELL

Como faço para instalar o SDK do PDFTron (Apryse)?

A instalação do PDFTron envolve mais etapas devido à sua arquitetura modular e foco empresarial. O processo varia dependendo da plataforma de destino e dos recursos necessários.

Pré-requisitos

  • Visual Studio 2019 ou posterior
  • Carga de trabalho de desenvolvimento .NET para desktop
  • Ferramentas de desenvolvimento .NET Framework 4.5.1+
  • Download do SDK PDFTron

Etapas de integração manual

  1. Extraia o SDK

    # Example extraction path
    PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/
    # Example extraction path
    PDFNET_BASE = C:/PDFTron/PDFNetDotNet4/
    SHELL
  2. Inicialize com a chave de licença.

    // Initialize PDFTron with your license key
    pdftron.PDFNet.Initialize("your-license-key-here");
    
    // Note: Demo keys expire after evaluation period
    // Contact Apryse sales for production licenses
    // Initialize PDFTron with your license key
    pdftron.PDFNet.Initialize("your-license-key-here");
    
    // Note: Demo keys expire after evaluation period
    // Contact Apryse sales for production licenses
    ' Initialize PDFTron with your license key
    pdftron.PDFNet.Initialize("your-license-key-here")
    
    ' Note: Demo keys expire after evaluation period
    ' Contact Apryse sales for production licenses
    $vbLabelText   $csharpLabel
  3. Copiar Bibliotecas Necessárias

    • Copie a pasta Lib de PDFNET_BASE para o diretório do seu projeto.
    • Adicionar referências a PDFNetLoader.dll e a PDFNet.dll específico da plataforma.
  4. Configurar a cópia da propriedade local

PDFTron A propriedade Copy Local está definida como False no Visual Studio Defina a propriedade "Copiar local" do PDFNet.dll como "Falso" para a implantação correta do PDFTron.

  1. Atualize o arquivo App.config.

    <configuration>
       <runtime>
           <loadFromRemoteSources enabled="true" />
       </runtime>
    </configuration>
    <configuration>
       <runtime>
           <loadFromRemoteSources enabled="true" />
       </runtime>
    </configuration>
    XML
  2. Configurar eventos pós-compilação

    xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y
    xcopy $(ProjectDir)Lib\PDFNet $(TargetDir)PDFNet /S /I /Y
    SHELL

Instalação do NuGet (Simplificada)

Para uma abordagem mais simplificada:

  1. Abra o Gerenciador de Pacotes NuGet
  2. Procure por "PDFTron .NET.x64" ou pelo pacote específico da plataforma.
  3. Instale o pacote apropriado para sua arquitetura.

Interface de instalação do pacote NuGet PDFTron Instalando o PDFTron através do Gerenciador de Pacotes NuGet com pacotes específicos da plataforma.

O PDFTron oferece uma variedade maior, com mais de 30 tipos de anotações, em comparação com os mais de 10 tipos do ComPDFKit. No entanto, esse extenso conjunto de recursos exige uma seleção cuidadosa dos módulos durante a instalação.

Como faço para converter uma URL em PDF usando essas bibliotecas?

Ambas as bibliotecas oferecem conversão de URL para PDF, mas com abordagens e recursos diferentes. Vamos examinar os detalhes de implementação e as características de desempenho de cada um.

URL para PDF com IronPDF

O mecanismo de renderização Chrome do IronPDF oferece suporte excepcional aos padrões web modernos:

using IronPdf;

// Initialize the Chrome renderer with advanced options
var renderer = new ChromePdfRenderer();

// Configure rendering for optimal results
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS execution

// Handle authentication if needed
renderer.LoginCredentials = new ChromeHttpLoginCredentials() {
    Username = "user@domain.com",
    Password = "secure_password"
};

// Render URL to PDF with full browser capabilities
var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");

// Add metadata for document management
pdf.MetaData.Author = "Development Team";
pdf.MetaData.Title = "Website Export - " + DateTime.Now.ToString("yyyy-MM-dd");

// Save with compression
pdf.CompressImages(90);
pdf.SaveAs("website-export.pdf");
using IronPdf;

// Initialize the Chrome renderer with advanced options
var renderer = new ChromePdfRenderer();

// Configure rendering for optimal results
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 1000; // Wait for JS execution

// Handle authentication if needed
renderer.LoginCredentials = new ChromeHttpLoginCredentials() {
    Username = "user@domain.com",
    Password = "secure_password"
};

// Render URL to PDF with full browser capabilities
var pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");

// Add metadata for document management
pdf.MetaData.Author = "Development Team";
pdf.MetaData.Title = "Website Export - " + DateTime.Now.ToString("yyyy-MM-dd");

// Save with compression
pdf.CompressImages(90);
pdf.SaveAs("website-export.pdf");
Imports IronPdf

' Initialize the Chrome renderer with advanced options
Private renderer = New ChromePdfRenderer()

' Configure rendering for optimal results
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.RenderDelay = 1000 ' Wait for JS execution

' Handle authentication if needed
renderer.LoginCredentials = New ChromeHttpLoginCredentials() With {
	.Username = "user@domain.com",
	.Password = "secure_password"
}

' Render URL to PDF with full browser capabilities
Dim pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/")

' Add metadata for document management
pdf.MetaData.Author = "Development Team"
pdf.MetaData.Title = "Website Export - " & DateTime.Now.ToString("yyyy-MM-dd")

' Save with compression
pdf.CompressImages(90)
pdf.SaveAs("website-export.pdf")
$vbLabelText   $csharpLabel

O renderizador Chrome no IronPDF lida com cenários complexos, incluindo:

  • Aplicativos de página única (SPAs) com uso intensivo de JavaScript
  • Designs responsivos com media queries
  • Fontes da Web e folhas de estilo externas
  • Carregamento de conteúdo AJAX
  • Animações e transições CSS

A versão principal do IronPDF agora suporta tudo isso: NuGet.org/packages/ IronPDF . Melhorias recentes no desempenho aumentaram significativamente a velocidade de renderização, especialmente para aplicações web complexas.

URL para PDF com PDFTron (Apryse)

O PDFTron requer o módulo HTML2PDF para conversão de conteúdo web:

using pdftron;
using pdftron.PDF;
using pdftron.SDF;

class UrlToPdfConverter 
{
    public static void ConvertUrlToPdf(string url, string outputPath)
    {
        // Initialize PDFTron with license
        PDFNet.Initialize("your-license-key");

        // Create a new PDF document
        using (PDFDoc doc = new PDFDoc())
        {
            // Initialize HTML2PDF converter
            HTML2PDF converter = new HTML2PDF();

            // Configure conversion settings
            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);

            // Set page dimensions
            converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
            converter.SetMargins(0.5, 0.5, 0.5, 0.5);

            // Insert URL content
            converter.InsertFromURL(url);

            // Perform conversion
            if (converter.Convert(doc))
            {
                // Save the resulting PDF
                doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
                Console.WriteLine($"Successfully converted {url} to {outputPath}");
            }
            else
            {
                Console.WriteLine("Conversion failed");
            }
        }
    }
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;

class UrlToPdfConverter 
{
    public static void ConvertUrlToPdf(string url, string outputPath)
    {
        // Initialize PDFTron with license
        PDFNet.Initialize("your-license-key");

        // Create a new PDF document
        using (PDFDoc doc = new PDFDoc())
        {
            // Initialize HTML2PDF converter
            HTML2PDF converter = new HTML2PDF();

            // Configure conversion settings
            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);

            // Set page dimensions
            converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
            converter.SetMargins(0.5, 0.5, 0.5, 0.5);

            // Insert URL content
            converter.InsertFromURL(url);

            // Perform conversion
            if (converter.Convert(doc))
            {
                // Save the resulting PDF
                doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
                Console.WriteLine($"Successfully converted {url} to {outputPath}");
            }
            else
            {
                Console.WriteLine("Conversion failed");
            }
        }
    }
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF

Friend Class UrlToPdfConverter
	Public Shared Sub ConvertUrlToPdf(ByVal url As String, ByVal outputPath As String)
		' Initialize PDFTron with license
		PDFNet.Initialize("your-license-key")

		' Create a new PDF document
		Using doc As New PDFDoc()
			' Initialize HTML2PDF converter
			Dim converter As New HTML2PDF()

			' Configure conversion settings
			Dim settings As New HTML2PDF.WebPageSettings()
			settings.SetPrintBackground(True)
			settings.SetLoadImages(True)

			' Set page dimensions
			converter.SetPaperSize(PrinterMode.PaperSize.e_letter)
			converter.SetMargins(0.5, 0.5, 0.5, 0.5)

			' Insert URL content
			converter.InsertFromURL(url)

			' Perform conversion
			If converter.Convert(doc) Then
				' Save the resulting PDF
				doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
				Console.WriteLine($"Successfully converted {url} to {outputPath}")
			Else
				Console.WriteLine("Conversion failed")
			End If
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

Considerações importantes para o PDFTron HTML2PDF:

  • O preço do SDK da PDFTron é cotado com base na abrangência da tecnologia (APIs, recursos) e no escopo de distribuição (usuários externos ou internos).
  • Suporte limitado a JavaScript em comparação com os mecanismos de navegador.
  • Pode exigir configuração adicional para layouts complexos.
  • Mais adequado para documentos HTML mais simples

Como faço para criar PDFs a partir de strings HTML?

Criar PDFs a partir de strings HTML é essencial para gerar relatórios, faturas e documentos dinâmicos. Ambas as bibliotecas lidam com isso de maneiras diferentes.

Converter string HTML em PDF com IronPDF

O IronPDF se destaca na renderização de HTML complexo com suporte completo a CSS3 e JavaScript :

using IronPdf;
using System.Text;

public class HtmlStringToPdfConverter
{
    public static PdfDocument GenerateInvoice(InvoiceData data)
    {
        // Build dynamic HTML with modern CSS
        var html = new StringBuilder();
        html.Append(@"
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset='UTF-8'>
            <style>
                @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');

                body {
                    font-family: 'Roboto', sans-serif;
                    margin: 0;
                    padding: 20px;
                    color: #333;
                }

                .invoice-header {
                    display: flex;
                    justify-content: space-between;
                    border-bottom: 2px solid #007bff;
                    padding-bottom: 20px;
                    margin-bottom: 30px;
                }

                .company-logo {
                    width: 150px;
                    height: auto;
                }

                .invoice-details {
                    text-align: right;
                }

                .invoice-number {
                    font-size: 24px;
                    font-weight: 700;
                    color: #007bff;
                }

                table {
                    width: 100%;
                    border-collapse: collapse;
                    margin-top: 20px;
                }

                th {
                    background-color: #f8f9fa;
                    padding: 12px;
                    text-align: left;
                    border-bottom: 2px solid #dee2e6;
                }

                td {
                    padding: 12px;
                    border-bottom: 1px solid #dee2e6;
                }

                .total-row {
                    font-weight: 700;
                    font-size: 18px;
                    background-color: #e9ecef;
                }

                @media print {
                    body { margin: 0; }
                    .no-print { display: none; }
                }
            </style>
        </head>
        <body>
        ");

        // Add invoice header
        html.Append($@"
            <div class='invoice-header'>
                <div>
                    <img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
                    <h2>{data.CompanyName}</h2>
                    <p>{data.CompanyAddress}</p>
                </div>
                <div class='invoice-details'>
                    <div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
                    <p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
                    <p>Due: {data.DueDate:yyyy-MM-dd}</p>
                </div>
            </div>
        ");

        // Add line items table
        html.Append(@"
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
        ");

        foreach (var item in data.LineItems)
        {
            html.Append($@"
                <tr>
                    <td>{item.Description}</td>
                    <td>{item.Quantity}</td>
                    <td>${item.UnitPrice:F2}</td>
                    <td>${item.Total:F2}</td>
                </tr>
            ");
        }

        html.Append($@"
                </tbody>
                <tfoot>
                    <tr class='total-row'>
                        <td colspan='3'>Total</td>
                        <td>${data.Total:F2}</td>
                    </tr>
                </tfoot>
            </table>
        </body>
        </html>
        ");

        // Configure renderer for optimal output
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

        // Generate PDF with proper base path for assets
        var pdf = renderer.RenderHtmlAsPdf(html.ToString());

        // Add security if needed
        pdf.SecuritySettings.UserPassword = data.CustomerEmail;
        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;

        return pdf;
    }
}
using IronPdf;
using System.Text;

public class HtmlStringToPdfConverter
{
    public static PdfDocument GenerateInvoice(InvoiceData data)
    {
        // Build dynamic HTML with modern CSS
        var html = new StringBuilder();
        html.Append(@"
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset='UTF-8'>
            <style>
                @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');

                body {
                    font-family: 'Roboto', sans-serif;
                    margin: 0;
                    padding: 20px;
                    color: #333;
                }

                .invoice-header {
                    display: flex;
                    justify-content: space-between;
                    border-bottom: 2px solid #007bff;
                    padding-bottom: 20px;
                    margin-bottom: 30px;
                }

                .company-logo {
                    width: 150px;
                    height: auto;
                }

                .invoice-details {
                    text-align: right;
                }

                .invoice-number {
                    font-size: 24px;
                    font-weight: 700;
                    color: #007bff;
                }

                table {
                    width: 100%;
                    border-collapse: collapse;
                    margin-top: 20px;
                }

                th {
                    background-color: #f8f9fa;
                    padding: 12px;
                    text-align: left;
                    border-bottom: 2px solid #dee2e6;
                }

                td {
                    padding: 12px;
                    border-bottom: 1px solid #dee2e6;
                }

                .total-row {
                    font-weight: 700;
                    font-size: 18px;
                    background-color: #e9ecef;
                }

                @media print {
                    body { margin: 0; }
                    .no-print { display: none; }
                }
            </style>
        </head>
        <body>
        ");

        // Add invoice header
        html.Append($@"
            <div class='invoice-header'>
                <div>
                    <img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
                    <h2>{data.CompanyName}</h2>
                    <p>{data.CompanyAddress}</p>
                </div>
                <div class='invoice-details'>
                    <div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
                    <p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
                    <p>Due: {data.DueDate:yyyy-MM-dd}</p>
                </div>
            </div>
        ");

        // Add line items table
        html.Append(@"
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
        ");

        foreach (var item in data.LineItems)
        {
            html.Append($@"
                <tr>
                    <td>{item.Description}</td>
                    <td>{item.Quantity}</td>
                    <td>${item.UnitPrice:F2}</td>
                    <td>${item.Total:F2}</td>
                </tr>
            ");
        }

        html.Append($@"
                </tbody>
                <tfoot>
                    <tr class='total-row'>
                        <td colspan='3'>Total</td>
                        <td>${data.Total:F2}</td>
                    </tr>
                </tfoot>
            </table>
        </body>
        </html>
        ");

        // Configure renderer for optimal output
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

        // Generate PDF with proper base path for assets
        var pdf = renderer.RenderHtmlAsPdf(html.ToString());

        // Add security if needed
        pdf.SecuritySettings.UserPassword = data.CustomerEmail;
        pdf.SecuritySettings.AllowUserPrinting = true;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;

        return pdf;
    }
}
Imports IronPdf
Imports System.Text

Public Class HtmlStringToPdfConverter
	Public Shared Function GenerateInvoice(ByVal data As InvoiceData) As PdfDocument
		' Build dynamic HTML with modern CSS
		Dim html = New StringBuilder()
		html.Append("
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset='UTF-8'>
            <style>
                @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap');

                body {
                    font-family: 'Roboto', sans-serif;
                    margin: 0;
                    padding: 20px;
                    color: #333;
                }

                .invoice-header {
                    display: flex;
                    justify-content: space-between;
                    border-bottom: 2px solid #007bff;
                    padding-bottom: 20px;
                    margin-bottom: 30px;
                }

                .company-logo {
                    width: 150px;
                    height: auto;
                }

                .invoice-details {
                    text-align: right;
                }

                .invoice-number {
                    font-size: 24px;
                    font-weight: 700;
                    color: #007bff;
                }

                table {
                    width: 100%;
                    border-collapse: collapse;
                    margin-top: 20px;
                }

                th {
                    background-color: #f8f9fa;
                    padding: 12px;
                    text-align: left;
                    border-bottom: 2px solid #dee2e6;
                }

                td {
                    padding: 12px;
                    border-bottom: 1px solid #dee2e6;
                }

                .total-row {
                    font-weight: 700;
                    font-size: 18px;
                    background-color: #e9ecef;
                }

                @media print {
                    body { margin: 0; }
                    .no-print { display: none; }
                }
            </style>
        </head>
        <body>
        ")

		' Add invoice header
		html.Append($"
            <div class='invoice-header'>
                <div>
                    <img src='data:image/png;base64,{data.CompanyLogoBase64}' class='company-logo' alt='Company Logo'>
                    <h2>{data.CompanyName}</h2>
                    <p>{data.CompanyAddress}</p>
                </div>
                <div class='invoice-details'>
                    <div class='invoice-number'>Invoice #{data.InvoiceNumber}</div>
                    <p>Date: {data.InvoiceDate:yyyy-MM-dd}</p>
                    <p>Due: {data.DueDate:yyyy-MM-dd}</p>
                </div>
            </div>
        ")

		' Add line items table
		html.Append("
            <table>
                <thead>
                    <tr>
                        <th>Description</th>
                        <th>Quantity</th>
                        <th>Unit Price</th>
                        <th>Total</th>
                    </tr>
                </thead>
                <tbody>
        ")

		For Each item In data.LineItems
			html.Append($"
                <tr>
                    <td>{item.Description}</td>
                    <td>{item.Quantity}</td>
                    <td>${item.UnitPrice:F2}</td>
                    <td>${item.Total:F2}</td>
                </tr>
            ")
		Next item

		html.Append($"
                </tbody>
                <tfoot>
                    <tr class='total-row'>
                        <td colspan='3'>Total</td>
                        <td>${data.Total:F2}</td>
                    </tr>
                </tfoot>
            </table>
        </body>
        </html>
        ")

		' Configure renderer for optimal output
		Dim renderer = New ChromePdfRenderer()
		renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
		renderer.RenderingOptions.EnableJavaScript = True
		renderer.RenderingOptions.CreatePdfFormsFromHtml = True

		' Generate PDF with proper base path for assets
		Dim pdf = renderer.RenderHtmlAsPdf(html.ToString())

		' Add security if needed
		pdf.SecuritySettings.UserPassword = data.CustomerEmail
		pdf.SecuritySettings.AllowUserPrinting = True
		pdf.SecuritySettings.AllowUserCopyPasteContent = False

		Return pdf
	End Function
End Class
$vbLabelText   $csharpLabel

Principais vantagens da renderização HTML do IronPDF:

  • Suporte completo a CSS3, incluindo layouts flexbox e grid.
  • Integração com o Google Fonts e fontes da web
  • As bibliotecas de gráficos JavaScript (Chart.js, D3.js) são renderizadas perfeitamente.
  • Suporte a design responsivo com controle de viewport
  • Incorporação de imagens em Base64 para documentos autocontidos

String HTML para PDF com PDFTron (Apryse)

A abordagem do PDFTron para conversão de strings HTML:

using pdftron;
using pdftron.PDF;
using pdftron.SDF;

public class PdfTronHtmlConverter
{
    public static void ConvertHtmlString(string htmlContent, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            // Create HTML2PDF converter instance
            HTML2PDF converter = new HTML2PDF();

            // Configure page settings
            converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
            converter.SetLandscape(false);
            converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches);

            // Enable images and backgrounds
            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);
            settings.SetJavaScriptDelay(1000); // Limited JS support

            // Insert HTML content
            converter.InsertFromHtmlString(htmlContent);

            // Convert to PDF
            if (converter.Convert(doc))
            {
                // Post-processing options
                doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
            }
        }
    }
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;

public class PdfTronHtmlConverter
{
    public static void ConvertHtmlString(string htmlContent, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            // Create HTML2PDF converter instance
            HTML2PDF converter = new HTML2PDF();

            // Configure page settings
            converter.SetPaperSize(PrinterMode.PaperSize.e_letter);
            converter.SetLandscape(false);
            converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches);

            // Enable images and backgrounds
            HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings();
            settings.SetPrintBackground(true);
            settings.SetLoadImages(true);
            settings.SetJavaScriptDelay(1000); // Limited JS support

            // Insert HTML content
            converter.InsertFromHtmlString(htmlContent);

            // Convert to PDF
            if (converter.Convert(doc))
            {
                // Post-processing options
                doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
            }
        }
    }
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF

Public Class PdfTronHtmlConverter
	Public Shared Sub ConvertHtmlString(ByVal htmlContent As String, ByVal outputPath As String)
		PDFNet.Initialize("your-license-key")

		Using doc As New PDFDoc()
			' Create HTML2PDF converter instance
			Dim converter As New HTML2PDF()

			' Configure page settings
			converter.SetPaperSize(PrinterMode.PaperSize.e_letter)
			converter.SetLandscape(False)
			converter.SetMargins(1.0, 1.0, 1.0, 1.0, HTML2PDF.e_inches)

			' Enable images and backgrounds
			Dim settings As New HTML2PDF.WebPageSettings()
			settings.SetPrintBackground(True)
			settings.SetLoadImages(True)
			settings.SetJavaScriptDelay(1000) ' Limited JS support

			' Insert HTML content
			converter.InsertFromHtmlString(htmlContent)

			' Convert to PDF
			If converter.Convert(doc) Then
				' Post-processing options
				doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
			End If
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

Limitações do PDFTron HTML a serem consideradas:

  • Suporte básico a CSS (sem layouts avançados)
  • Execução limitada de JavaScript
  • A incorporação de fontes requer configuração adicional.
  • Mais adequado para layouts de documentos simples

Como posso converter páginas ASPX para PDF?

Converter páginas ASPX para PDF é um requisito comum para aplicações ASP.NET . O IronPDF oferece suporte nativo, enquanto o PDFTron requer soluções alternativas.

ASPX para PDF com IronPDF

O IronPDF oferece conversão perfeita para ASPX com uma única linha de código:

using IronPdf;

public partial class InvoicePage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Render the current ASPX page as PDF on page load
        if (Request.QueryString["pdf"] == "true")
        {
            // Configure PDF output options
            AspxToPdf.RenderThisPageAsPdf(
                AspxToPdf.FileBehavior.InBrowser,
                "Invoice_" + DateTime.Now.ToString("yyyyMMdd") + ".pdf");
        }
    }

    protected void ExportToPdfButton_Click(object sender, EventArgs e)
    {
        // Advanced configuration for ASPX to PDF
        IronPdf.AspxToPdf.RenderThisPageAsPdf(
            IronPdf.AspxToPdf.FileBehavior.Attachment,
            "Invoice.pdf",
            new ChromePdfRenderOptions()
            {
                PaperSize = PdfPaperSize.A4,
                MarginTop = 20,
                MarginBottom = 20,
                CssMediaType = PdfCssMediaType.Print,
                EnableJavaScript = true,
                CreatePdfFormsFromHtml = true,
                FitToPaper = true
            });
    }
}
using IronPdf;

public partial class InvoicePage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Render the current ASPX page as PDF on page load
        if (Request.QueryString["pdf"] == "true")
        {
            // Configure PDF output options
            AspxToPdf.RenderThisPageAsPdf(
                AspxToPdf.FileBehavior.InBrowser,
                "Invoice_" + DateTime.Now.ToString("yyyyMMdd") + ".pdf");
        }
    }

    protected void ExportToPdfButton_Click(object sender, EventArgs e)
    {
        // Advanced configuration for ASPX to PDF
        IronPdf.AspxToPdf.RenderThisPageAsPdf(
            IronPdf.AspxToPdf.FileBehavior.Attachment,
            "Invoice.pdf",
            new ChromePdfRenderOptions()
            {
                PaperSize = PdfPaperSize.A4,
                MarginTop = 20,
                MarginBottom = 20,
                CssMediaType = PdfCssMediaType.Print,
                EnableJavaScript = true,
                CreatePdfFormsFromHtml = true,
                FitToPaper = true
            });
    }
}
Imports IronPdf

Partial Public Class InvoicePage
	Inherits System.Web.UI.Page

	Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
		' Render the current ASPX page as PDF on page load
		If Request.QueryString("pdf") = "true" Then
			' Configure PDF output options
			AspxToPdf.RenderThisPageAsPdf(AspxToPdf.FileBehavior.InBrowser, "Invoice_" & DateTime.Now.ToString("yyyyMMdd") & ".pdf")
		End If
	End Sub

	Protected Sub ExportToPdfButton_Click(ByVal sender As Object, ByVal e As EventArgs)
		' Advanced configuration for ASPX to PDF
		IronPdf.AspxToPdf.RenderThisPageAsPdf(IronPdf.AspxToPdf.FileBehavior.Attachment, "Invoice.pdf", New ChromePdfRenderOptions() With {
			.PaperSize = PdfPaperSize.A4,
			.MarginTop = 20,
			.MarginBottom = 20,
			.CssMediaType = PdfCssMediaType.Print,
			.EnableJavaScript = True,
			.CreatePdfFormsFromHtml = True,
			.FitToPaper = True
		})
	End Sub
End Class
$vbLabelText   $csharpLabel

Para maior controle sobre o processo de renderização:

// In Global.asax.cs or Startup.cs
public static void ConfigureAspxToPdf()
{
    // Set global defaults for all ASPX to PDF conversions
    AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4;
    AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = true;
    AspxToPdf.GlobalSettings.EnableJavaScript = true;
    AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen;

    // Custom headers and footers
    AspxToPdf.GlobalSettings.HtmlHeader = new HtmlHeaderFooter()
    {
        HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
        Height = 25
    };
}
// In Global.asax.cs or Startup.cs
public static void ConfigureAspxToPdf()
{
    // Set global defaults for all ASPX to PDF conversions
    AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4;
    AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = true;
    AspxToPdf.GlobalSettings.EnableJavaScript = true;
    AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen;

    // Custom headers and footers
    AspxToPdf.GlobalSettings.HtmlHeader = new HtmlHeaderFooter()
    {
        HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
        Height = 25
    };
}
' In Global.asax.cs or Startup.cs
Public Shared Sub ConfigureAspxToPdf()
	' Set global defaults for all ASPX to PDF conversions
	AspxToPdf.GlobalSettings.PaperSize = PdfPaperSize.A4
	AspxToPdf.GlobalSettings.PrintHtmlBackgrounds = True
	AspxToPdf.GlobalSettings.EnableJavaScript = True
	AspxToPdf.GlobalSettings.CssMediaType = PdfCssMediaType.Screen

	' Custom headers and footers
	AspxToPdf.GlobalSettings.HtmlHeader = New HtmlHeaderFooter() With {
		.HtmlFragment = "<div style='text-align: center; font-size: 12px;'>{page} of {total-pages}</div>",
		.Height = 25
	}
End Sub
$vbLabelText   $csharpLabel

O recurso de conversão de ASPX para PDF do IronPDF preserva:

  • ViewState e valores de formulário
  • Dados de estado da sessão
  • Estilização e layouts CSS
  • Conteúdo renderizado em JavaScript
  • Layouts de página mestre

Alternativa ASPX com PDFTron

O PDFTron não oferece suporte direto a ASPX, exigindo abordagens indiretas:

// Capture ASPX output as HTML, then convert
public void ConvertAspxWithPdfTron()
{
    // Render ASPX to string first
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);

    // Render the page to HTML
    this.RenderControl(hw);
    string htmlContent = sw.ToString();

    // Then use PDFTron's HTML2PDF
    PDFNet.Initialize("your-license-key");

    using (PDFDoc doc = new PDFDoc())
    {
        HTML2PDF converter = new HTML2PDF();
        converter.InsertFromHtmlString(htmlContent);
        converter.Convert(doc);

        // Send to browser
        byte[] pdfBytes = doc.Save(SDFDoc.SaveOptions.e_linearized);
        Response.ContentType = "application/pdf";
        Response.BinaryWrite(pdfBytes);
        Response.End();
    }
}
// Capture ASPX output as HTML, then convert
public void ConvertAspxWithPdfTron()
{
    // Render ASPX to string first
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);

    // Render the page to HTML
    this.RenderControl(hw);
    string htmlContent = sw.ToString();

    // Then use PDFTron's HTML2PDF
    PDFNet.Initialize("your-license-key");

    using (PDFDoc doc = new PDFDoc())
    {
        HTML2PDF converter = new HTML2PDF();
        converter.InsertFromHtmlString(htmlContent);
        converter.Convert(doc);

        // Send to browser
        byte[] pdfBytes = doc.Save(SDFDoc.SaveOptions.e_linearized);
        Response.ContentType = "application/pdf";
        Response.BinaryWrite(pdfBytes);
        Response.End();
    }
}
' Capture ASPX output as HTML, then convert
Public Sub ConvertAspxWithPdfTron()
	' Render ASPX to string first
	Dim sw As New StringWriter()
	Dim hw As New HtmlTextWriter(sw)

	' Render the page to HTML
	Me.RenderControl(hw)
	Dim htmlContent As String = sw.ToString()

	' Then use PDFTron's HTML2PDF
	PDFNet.Initialize("your-license-key")

	Using doc As New PDFDoc()
		Dim converter As New HTML2PDF()
		converter.InsertFromHtmlString(htmlContent)
		converter.Convert(doc)

		' Send to browser
		Dim pdfBytes() As Byte = doc.Save(SDFDoc.SaveOptions.e_linearized)
		Response.ContentType = "application/pdf"
		Response.BinaryWrite(pdfBytes)
		Response.End()
	End Using
End Sub
$vbLabelText   $csharpLabel

Como faço para converter imagens em PDF?

A conversão de imagens para PDF é essencial para o arquivamento de documentos e a criação de portfólios. Ambas as bibliotecas oferecem essa funcionalidade com abordagens diferentes.

Converter imagem para PDF com IronPDF

O IronPDF fornece uma classe dedicada ImageToPdfConverter para processamento em lote eficiente:

using IronPdf;
using System.IO;
using System.Linq;

public class ImagePdfGenerator
{
    public static void CreatePhotoAlbum(string imageFolder, string outputPath)
    {
        // Get all supported image files
        var supportedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" };
        var imageFiles = Directory.GetFiles(imageFolder)
            .Where(f => supportedExtensions.Contains(Path.GetExtension(f).ToLower()))
            .OrderBy(f => f);

        // Convert images to PDF with options
        var pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage);

        // Add metadata
        pdf.MetaData.Title = "Photo Album";
        pdf.MetaData.Author = "Photography Department";
        pdf.MetaData.CreationDate = DateTime.Now;

        // Apply compression for smaller file size
        pdf.CompressImages(80); // 80% quality

        // Save the PDF
        pdf.SaveAs(outputPath);
    }

    public static void CreateThumbnailCatalog(List<ProductImage> images)
    {
        var renderer = new ChromePdfRenderer();

        // Build HTML with image grid
        var html = @"
        <html>
        <head>
            <style>
                .image-grid {
                    display: grid;
                    grid-template-columns: repeat(3, 1fr);
                    gap: 20px;
                    padding: 20px;
                }
                .image-item {
                    text-align: center;
                }
                .image-item img {
                    max-width: 100%;
                    height: 200px;
                    object-fit: cover;
                    border: 1px solid #ddd;
                }
                .image-caption {
                    margin-top: 10px;
                    font-size: 12px;
                }
            </style>
        </head>
        <body>
            <h1>Product Catalog</h1>
            <div class='image-grid'>";

        foreach (var image in images)
        {
            html += $@"
                <div class='image-item'>
                    <img src='data:image/jpeg;base64,{image.Base64Data}' />
                    <div class='image-caption'>{image.ProductName}</div>
                </div>";
        }

        html += "</div></body></html>";

        // Render with optimal settings for images
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("product-catalog.pdf");
    }
}
using IronPdf;
using System.IO;
using System.Linq;

public class ImagePdfGenerator
{
    public static void CreatePhotoAlbum(string imageFolder, string outputPath)
    {
        // Get all supported image files
        var supportedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" };
        var imageFiles = Directory.GetFiles(imageFolder)
            .Where(f => supportedExtensions.Contains(Path.GetExtension(f).ToLower()))
            .OrderBy(f => f);

        // Convert images to PDF with options
        var pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage);

        // Add metadata
        pdf.MetaData.Title = "Photo Album";
        pdf.MetaData.Author = "Photography Department";
        pdf.MetaData.CreationDate = DateTime.Now;

        // Apply compression for smaller file size
        pdf.CompressImages(80); // 80% quality

        // Save the PDF
        pdf.SaveAs(outputPath);
    }

    public static void CreateThumbnailCatalog(List<ProductImage> images)
    {
        var renderer = new ChromePdfRenderer();

        // Build HTML with image grid
        var html = @"
        <html>
        <head>
            <style>
                .image-grid {
                    display: grid;
                    grid-template-columns: repeat(3, 1fr);
                    gap: 20px;
                    padding: 20px;
                }
                .image-item {
                    text-align: center;
                }
                .image-item img {
                    max-width: 100%;
                    height: 200px;
                    object-fit: cover;
                    border: 1px solid #ddd;
                }
                .image-caption {
                    margin-top: 10px;
                    font-size: 12px;
                }
            </style>
        </head>
        <body>
            <h1>Product Catalog</h1>
            <div class='image-grid'>";

        foreach (var image in images)
        {
            html += $@"
                <div class='image-item'>
                    <img src='data:image/jpeg;base64,{image.Base64Data}' />
                    <div class='image-caption'>{image.ProductName}</div>
                </div>";
        }

        html += "</div></body></html>";

        // Render with optimal settings for images
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("product-catalog.pdf");
    }
}
Imports IronPdf
Imports System.IO
Imports System.Linq

Public Class ImagePdfGenerator
	Public Shared Sub CreatePhotoAlbum(ByVal imageFolder As String, ByVal outputPath As String)
		' Get all supported image files
		Dim supportedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg" }
		Dim imageFiles = Directory.GetFiles(imageFolder).Where(Function(f) supportedExtensions.Contains(Path.GetExtension(f).ToLower())).OrderBy(Function(f) f)

		' Convert images to PDF with options
		Dim pdf = ImageToPdfConverter.ImageToPdf(imageFiles, ImageBehavior.FitToPage)

		' Add metadata
		pdf.MetaData.Title = "Photo Album"
		pdf.MetaData.Author = "Photography Department"
		pdf.MetaData.CreationDate = DateTime.Now

		' Apply compression for smaller file size
		pdf.CompressImages(80) ' 80% quality

		' Save the PDF
		pdf.SaveAs(outputPath)
	End Sub

	Public Shared Sub CreateThumbnailCatalog(ByVal images As List(Of ProductImage))
		Dim renderer = New ChromePdfRenderer()

		' Build HTML with image grid
		Dim html = "
        <html>
        <head>
            <style>
                .image-grid {
                    display: grid;
                    grid-template-columns: repeat(3, 1fr);
                    gap: 20px;
                    padding: 20px;
                }
                .image-item {
                    text-align: center;
                }
                .image-item img {
                    max-width: 100%;
                    height: 200px;
                    object-fit: cover;
                    border: 1px solid #ddd;
                }
                .image-caption {
                    margin-top: 10px;
                    font-size: 12px;
                }
            </style>
        </head>
        <body>
            <h1>Product Catalog</h1>
            <div class='image-grid'>"

		For Each image In images
			html &= $"
                <div class='image-item'>
                    <img src='data:image/jpeg;base64,{image.Base64Data}' />
                    <div class='image-caption'>{image.ProductName}</div>
                </div>"
		Next image

		html &= "</div></body></html>"

		' Render with optimal settings for images
		renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
		Dim pdf = renderer.RenderHtmlAsPdf(html)
		pdf.SaveAs("product-catalog.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

Recursos avançados de manipulação de imagens:

  • Conversão de SVG para PDF com preservação da qualidade vetorial
  • Processamento em lote com otimização de memória
  • Opções de tamanho e posicionamento personalizadas
  • Preservação de dados EXIF

Imagem para PDF com PDFTron (Apryse)

O PDFTron utiliza sua API de conversão para o processamento de imagens:

using pdftron;
using pdftron.PDF;
using pdftron.SDF;

public class PdfTronImageConverter
{
    public static void ConvertImageToPdf(string imagePath, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            // Use Convert API for image to PDF
            pdftron.PDF.Convert.ToPdf(doc, imagePath);

            // Additional image processing
            PageIterator itr = doc.GetPageIterator();
            while (itr.HasNext())
            {
                Page page = itr.Current();

                // Adjust page size to image
                Rect crop_box = page.GetCropBox();
                page.SetMediaBox(crop_box);

                itr.Next();
            }

            // Save optimized PDF
            doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
        }
    }

    public static void CreateMultiPageImagePdf(string[] imagePaths, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            ElementBuilder builder = new ElementBuilder();
            ElementWriter writer = new ElementWriter();

            foreach (string imagePath in imagePaths)
            {
                // Create a new page for each image
                Page page = doc.PageCreate();
                writer.Begin(page);

                // Add image to page
                Image img = Image.Create(doc, imagePath);
                Element element = builder.CreateImage(img, 0, 0, 612, 792);
                writer.WritePlacedElement(element);

                writer.End();
                doc.PagePushBack(page);
            }

            doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
        }
    }
}
using pdftron;
using pdftron.PDF;
using pdftron.SDF;

public class PdfTronImageConverter
{
    public static void ConvertImageToPdf(string imagePath, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            // Use Convert API for image to PDF
            pdftron.PDF.Convert.ToPdf(doc, imagePath);

            // Additional image processing
            PageIterator itr = doc.GetPageIterator();
            while (itr.HasNext())
            {
                Page page = itr.Current();

                // Adjust page size to image
                Rect crop_box = page.GetCropBox();
                page.SetMediaBox(crop_box);

                itr.Next();
            }

            // Save optimized PDF
            doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
        }
    }

    public static void CreateMultiPageImagePdf(string[] imagePaths, string outputPath)
    {
        PDFNet.Initialize("your-license-key");

        using (PDFDoc doc = new PDFDoc())
        {
            ElementBuilder builder = new ElementBuilder();
            ElementWriter writer = new ElementWriter();

            foreach (string imagePath in imagePaths)
            {
                // Create a new page for each image
                Page page = doc.PageCreate();
                writer.Begin(page);

                // Add image to page
                Image img = Image.Create(doc, imagePath);
                Element element = builder.CreateImage(img, 0, 0, 612, 792);
                writer.WritePlacedElement(element);

                writer.End();
                doc.PagePushBack(page);
            }

            doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized);
        }
    }
}
Imports pdftron
Imports pdftron.PDF
Imports pdftron.SDF

Public Class PdfTronImageConverter
	Public Shared Sub ConvertImageToPdf(ByVal imagePath As String, ByVal outputPath As String)
		PDFNet.Initialize("your-license-key")

		Using doc As New PDFDoc()
			' Use Convert API for image to PDF
			pdftron.PDF.Convert.ToPdf(doc, imagePath)

			' Additional image processing
			Dim itr As PageIterator = doc.GetPageIterator()
			Do While itr.HasNext()
				Dim page As Page = itr.Current()

				' Adjust page size to image
				Dim crop_box As Rect = page.GetCropBox()
				page.SetMediaBox(crop_box)

				itr.Next()
			Loop

			' Save optimized PDF
			doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
		End Using
	End Sub

	Public Shared Sub CreateMultiPageImagePdf(ByVal imagePaths() As String, ByVal outputPath As String)
		PDFNet.Initialize("your-license-key")

		Using doc As New PDFDoc()
			Dim builder As New ElementBuilder()
			Dim writer As New ElementWriter()

			For Each imagePath As String In imagePaths
				' Create a new page for each image
				Dim page As Page = doc.PageCreate()
				writer.Begin(page)

				' Add image to page
				Dim img As Image = Image.Create(doc, imagePath)
				Dim element As Element = builder.CreateImage(img, 0, 0, 612, 792)
				writer.WritePlacedElement(element)

				writer.End()
				doc.PagePushBack(page)
			Next imagePath

			doc.Save(outputPath, SDFDoc.SaveOptions.e_linearized)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

Quais são as opções de licenciamento e os respectivos custos?

Compreender o licenciamento é crucial para o orçamento e o cumprimento das normas. As duas bibliotecas têm modelos de preços muito diferentes.

Licenciamento IronPDF

O IronPDF possui 3 edições de preços, de $799 a $2,399. Uma versão de avaliação gratuita do IronPDF também está disponível. A IronPDF oferece preços transparentes e publicados (a partir de 2025):

Níveis de licença:

  • Licença Lite: $799

    • 1 desenvolvedor
    • 1 localização
    • 1 projeto
    • Ideal para desenvolvedores individuais ou projetos de pequeno porte
  • Licença Plus: $1,199

    • 3 desenvolvedores
    • 3 locais
    • 3 projetos
    • Ideal para equipes pequenas
  • Licença Profissional: $2,399

    • 10 desenvolvedores
    • 10 locais
    • 10 projetos
    • Ideal para equipes em crescimento
  • Licença ilimitada: Preços personalizados
    • Desenvolvedores ilimitados
    • Locais ilimitados
    • Projetos ilimitados

Opções adicionais:

  • Redistribuição isenta de royalties: +$2,399 (uso único)
  • Licenciamento SaaS/OEM disponível
  • Pacote Iron Suite : Leve 10 produtos pelo preço de 2

Todas as licenças de equipe são intransferíveis e o compartilhamento de licenças fora de uma organização ou relação agência/cliente é proibido.

Licenciamento do PDFTron (Apryse)

O licenciamento do PDFTron é baseado em orçamentos, sem preços publicados. Com base no feedback dos usuários e em relatórios do setor:

Faixas de preço estimadas:

  • Pequenas empresas: US$ 5.000 a US$ 15.000 anualmente
  • Empresas: US$ 30.000 a mais de US$ 100.000 anualmente
  • Módulos adicionais requerem licenças separadas.

A transparência de preços é uma grande desvantagem da PDFTRON. Tudo é um complemento, exigindo termos e contratos de licenciamento específicos. Relato dos usuários:

Após investir US$ 6.500 na PDFTRON, o produto simplesmente não funcionou como anunciado, nos deixando de mãos vazias e com um grande problema para resolver em nosso produto.

  • Necessidade de negociações complexas de licenciamento
  • O preço por módulo aumenta o custo total.
  • Políticas de reembolso limitadas

Principais diferenças:

IronPDF: Licenças perpétuas, pagamento único

  • PDFTron: Geralmente baseado em assinatura ou taxas anuais.
  • IronPDF: Todos os recursos incluídos na licença básica
  • PDFTron: Funcionalidades principais com complementos pagos

Como se comparam as opções de suporte?

O suporte do desenvolvedor pode ser determinante para o sucesso ou o fracasso dos cronogramas do projeto. Eis como cada fornecedor aborda o atendimento ao cliente.

Suporte IronPDF

O IronPDF inclui suporte profissional em todas as licenças:

A biblioteca IronPDF funciona no Azure WebApps, Functions e WebJobs. Funciona tanto em versões para Linux quanto para Windows, embora eu recomende as versões Functions e WebApps para Windows, pois são significativamente mais testadas e fáceis de instalar.

Suporte PDFTron (Apryse)

O suporte do PDFTron varia conforme o nível de licença:

  • O custo do PDFTron é alto. A importância para o nosso negócio justifica o custo, mas foi definitivamente um obstáculo para nós ao comparar este produto com outras soluções web em PDF.
  • Suporte baseado em fórum para licenças básicas
  • Planos de suporte pagos disponíveis
  • Ocasionalmente, o suporte pode ser insuficiente e os desenvolvedores ficam à própria sorte.
  • Os tempos de resposta variam conforme o nível de suporte.

Quais são as características de desempenho?

O desempenho impacta a experiência do usuário e os custos do servidor. Vamos analisar dados de desempenho do mundo real.

Desempenho do IronPDF

Melhorias recentes aprimoraram significativamente o desempenho do IronPDF:

// Optimized batch processing example
public async Task BatchConvertWithPerformanceMonitoring()
{
    var renderer = new ChromePdfRenderer();

    // Configure for performance
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
    renderer.RenderingOptions.RenderDelay = 0; // No delay for static content
    renderer.RenderingOptions.Timeout = 30; // 30 second timeout

    // Enable parallel processing
    var tasks = new List<Task<PdfDocument>>();
    var urls = GetUrlsToConvert();

    // Process in parallel with throttling
    using (var semaphore = new SemaphoreSlim(4)) // Max 4 concurrent
    {
        foreach (var url in urls)
        {
            await semaphore.WaitAsync();

            tasks.Add(Task.Run(async () =>
            {
                try
                {
                    return await renderer.RenderUrlAsPdfAsync(url);
                }
                finally
                {
                    semaphore.Release();
                }
            }));
        }

        var results = await Task.WhenAll(tasks);

        // Merge results if needed
        var merged = PdfDocument.Merge(results);
        merged.SaveAs("batch-output.pdf");
    }
}
// Optimized batch processing example
public async Task BatchConvertWithPerformanceMonitoring()
{
    var renderer = new ChromePdfRenderer();

    // Configure for performance
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
    renderer.RenderingOptions.RenderDelay = 0; // No delay for static content
    renderer.RenderingOptions.Timeout = 30; // 30 second timeout

    // Enable parallel processing
    var tasks = new List<Task<PdfDocument>>();
    var urls = GetUrlsToConvert();

    // Process in parallel with throttling
    using (var semaphore = new SemaphoreSlim(4)) // Max 4 concurrent
    {
        foreach (var url in urls)
        {
            await semaphore.WaitAsync();

            tasks.Add(Task.Run(async () =>
            {
                try
                {
                    return await renderer.RenderUrlAsPdfAsync(url);
                }
                finally
                {
                    semaphore.Release();
                }
            }));
        }

        var results = await Task.WhenAll(tasks);

        // Merge results if needed
        var merged = PdfDocument.Merge(results);
        merged.SaveAs("batch-output.pdf");
    }
}
' Optimized batch processing example
Public Async Function BatchConvertWithPerformanceMonitoring() As Task
	Dim renderer = New ChromePdfRenderer()

	' Configure for performance
	renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen
	renderer.RenderingOptions.RenderDelay = 0 ' No delay for static content
	renderer.RenderingOptions.Timeout = 30 ' 30 second timeout

	' Enable parallel processing
	Dim tasks = New List(Of Task(Of PdfDocument))()
	Dim urls = GetUrlsToConvert()

	' Process in parallel with throttling
	Using semaphore = New SemaphoreSlim(4) ' Max 4 concurrent
		For Each url In urls
			Await semaphore.WaitAsync()

			tasks.Add(Task.Run(Async Function()
				Try
					Return Await renderer.RenderUrlAsPdfAsync(url)
				Finally
					semaphore.Release()
				End Try
			End Function))
		Next url

		Dim results = Await Task.WhenAll(tasks)

		' Merge results if needed
		Dim merged = PdfDocument.Merge(results)
		merged.SaveAs("batch-output.pdf")
	End Using
End Function
$vbLabelText   $csharpLabel

Métricas de desempenho de ambientes de produção:

  • HTML simples: 200-400ms
  • HTML complexo com CSS/JS: 800-1200ms
  • O IronPDF possui variantes assíncronas de métodos de renderização, como documentado aqui IronPDF . Usar Parallel.ForEach foi a estratégia de melhor desempenho para renderização em lote de HTML para PDF no meu caso de uso.

Desempenho do PDFTron (Apryse)

O PDFTron geralmente oferece desempenho bruto mais rápido para conversões simples:

  • HTML básico: 100-300ms
  • Documentos de escritório: 500-1000ms
  • Menor consumo de memória
  • Melhor opção para documentos simples em grande volume.

No entanto, os usuários relatam problemas com cenários complexos:

  • De vez em quando surgem erros. Às vezes, erros bastante graves que provavelmente deveriam ter sido detectados nos testes de controle de qualidade. Pode demorar um pouco para que eles sejam consertados.

Suporte para frameworks CSS modernos e Bootstrap

Com a crescente adoção de frameworks CSS modernos, como Bootstrap, Tailwind e Foundation, por aplicações empresariais, a capacidade de converter esses frameworks para PDF com precisão torna-se um critério de seleção essencial para bibliotecas de PDF.

IronPDF: Suporte completo ao framework baseado em Chromium

O mecanismo de renderização Chrome V8 do IronPDF oferece suporte abrangente a todas as estruturas CSS modernas e padrões da web:

Bootstrap 5: Suporte completo a Flexbox e CSS Grid com todas as funcionalidades responsivas.

  • Bootstrap 4: Compatibilidade total com componentes de cartão, sistemas de navegação e layouts de formulário.
  • Tailwind CSS: Todas as classes utilitárias, modificadores responsivos e padrões de compilação JIT
  • Foundation: Suporte completo para sistema de grid e biblioteca de componentes CSS3 moderno: Flexbox, CSS Grid, variáveis ​​CSS, animações, transformações e transições.
  • Frameworks JavaScript : React, Vue, Angular - renderização de componentes com suporte completo à interatividade

Validação em produção: A página inicial do Bootstrap e os modelos oficiais convertem com mais de 98% de fidelidade nos navegadores.

Exemplo de código: Painel de controle empresarial com tabelas de dados

using IronPdf;

var renderer = new ChromePdfRenderer();

string bootstrapDashboard = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
    <div class='container-fluid py-4'>
        <div class='d-flex justify-content-between align-items-center mb-4'>
            <h1>Sales Dashboard - Q1 2025</h1>
            <span class='badge bg-success fs-5'>+15.3% YoY</span>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Total Revenue</h6>
                        <h2 class='text-primary'>$1.2M</h2>
                        <small class='text-success'>↑ 12%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>New Customers</h6>
                        <h2 class='text-info'>1,847</h2>
                        <small class='text-success'>↑ 8%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Avg Order Value</h6>
                        <h2 class='text-warning'>$649</h2>
                        <small class='text-danger'>↓ 3%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Conversion Rate</h6>
                        <h2 class='text-success'>3.2%</h2>
                        <small class='text-success'>↑ 0.4%</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Top Products by Revenue</h5>
            </div>
            <div class='card-body p-0'>
                <table class='table table-striped table-hover mb-0'>
                    <thead class='table-light'>
                        <tr>
                            <th>Product</th>
                            <th>Category</th>
                            <th>Units Sold</th>
                            <th class='text-end'>Revenue</th>
                            <th class='text-end'>Growth</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td><strong>Professional License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>1,234</td>
                            <td class='text-end'>$369,000</td>
                            <td class='text-end'><span class='badge bg-success'>+18%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Plus License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>2,891</td>
                            <td class='text-end'>$289,000</td>
                            <td class='text-end'><span class='badge bg-success'>+15%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Support Package</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>892</td>
                            <td class='text-end'>$178,000</td>
                            <td class='text-end'><span class='badge bg-success'>+22%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Training Program</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>456</td>
                            <td class='text-end'>$91,000</td>
                            <td class='text-end'><span class='badge bg-warning'>+5%</span></td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard);
pdf.SaveAs("sales-dashboard.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string bootstrapDashboard = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
    <div class='container-fluid py-4'>
        <div class='d-flex justify-content-between align-items-center mb-4'>
            <h1>Sales Dashboard - Q1 2025</h1>
            <span class='badge bg-success fs-5'>+15.3% YoY</span>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Total Revenue</h6>
                        <h2 class='text-primary'>$1.2M</h2>
                        <small class='text-success'>↑ 12%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>New Customers</h6>
                        <h2 class='text-info'>1,847</h2>
                        <small class='text-success'>↑ 8%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Avg Order Value</h6>
                        <h2 class='text-warning'>$649</h2>
                        <small class='text-danger'>↓ 3%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Conversion Rate</h6>
                        <h2 class='text-success'>3.2%</h2>
                        <small class='text-success'>↑ 0.4%</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Top Products by Revenue</h5>
            </div>
            <div class='card-body p-0'>
                <table class='table table-striped table-hover mb-0'>
                    <thead class='table-light'>
                        <tr>
                            <th>Product</th>
                            <th>Category</th>
                            <th>Units Sold</th>
                            <th class='text-end'>Revenue</th>
                            <th class='text-end'>Growth</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td><strong>Professional License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>1,234</td>
                            <td class='text-end'>$369,000</td>
                            <td class='text-end'><span class='badge bg-success'>+18%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Plus License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>2,891</td>
                            <td class='text-end'>$289,000</td>
                            <td class='text-end'><span class='badge bg-success'>+15%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Support Package</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>892</td>
                            <td class='text-end'>$178,000</td>
                            <td class='text-end'><span class='badge bg-success'>+22%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Training Program</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>456</td>
                            <td class='text-end'>$91,000</td>
                            <td class='text-end'><span class='badge bg-warning'>+5%</span></td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard);
pdf.SaveAs("sales-dashboard.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim bootstrapDashboard As String = "
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
    <div class='container-fluid py-4'>
        <div class='d-flex justify-content-between align-items-center mb-4'>
            <h1>Sales Dashboard - Q1 2025</h1>
            <span class='badge bg-success fs-5'>+15.3% YoY</span>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Total Revenue</h6>
                        <h2 class='text-primary'>$1.2M</h2>
                        <small class='text-success'>↑ 12%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>New Customers</h6>
                        <h2 class='text-info'>1,847</h2>
                        <small class='text-success'>↑ 8%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Avg Order Value</h6>
                        <h2 class='text-warning'>$649</h2>
                        <small class='text-danger'>↓ 3%</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card text-center'>
                    <div class='card-body'>
                        <h6 class='text-muted'>Conversion Rate</h6>
                        <h2 class='text-success'>3.2%</h2>
                        <small class='text-success'>↑ 0.4%</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Top Products by Revenue</h5>
            </div>
            <div class='card-body p-0'>
                <table class='table table-striped table-hover mb-0'>
                    <thead class='table-light'>
                        <tr>
                            <th>Product</th>
                            <th>Category</th>
                            <th>Units Sold</th>
                            <th class='text-end'>Revenue</th>
                            <th class='text-end'>Growth</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td><strong>Professional License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>1,234</td>
                            <td class='text-end'>$369,000</td>
                            <td class='text-end'><span class='badge bg-success'>+18%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Plus License</strong></td>
                            <td><span class='badge bg-primary'>Software</span></td>
                            <td>2,891</td>
                            <td class='text-end'>$289,000</td>
                            <td class='text-end'><span class='badge bg-success'>+15%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Support Package</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>892</td>
                            <td class='text-end'>$178,000</td>
                            <td class='text-end'><span class='badge bg-success'>+22%</span></td>
                        </tr>
                        <tr>
                            <td><strong>Training Program</strong></td>
                            <td><span class='badge bg-info'>Services</span></td>
                            <td>456</td>
                            <td class='text-end'>$91,000</td>
                            <td class='text-end'><span class='badge bg-warning'>+5%</span></td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(bootstrapDashboard)
pdf.SaveAs("sales-dashboard.pdf")
$vbLabelText   $csharpLabel

Resultado: Um painel de controle empresarial profissional com cartões de métricas flexbox do Bootstrap, layout de grade responsivo e tabelas de dados estilizadas — tudo renderizado com fidelidade perfeita no PDF.

PDFTron (Apryse): Módulo HTML2PDF com limitações de framework

A conversão de HTML para PDF do PDFTron é fornecida através do módulo HTML2PDF, que utiliza um mecanismo de renderização personalizado com limitações específicas para frameworks CSS modernos:

  • Motor personalizado: Não é baseado no Chromium, o que significa que o suporte a CSS3 é seletivo em vez de abrangente.
  • Suporte a Flexbox: Implementação parcial. Os layouts Flexbox do Bootstrap 4/5 podem não ser renderizados corretamente.
  • CSS Grid: Suporte limitado para especificações de layout CSS Grid.
  • Limitações do JavaScript : Execução limitada de JavaScript em comparação com os mecanismos de navegador completos.
  • Bootstrap 3: Geralmente funciona melhor que o Bootstrap 4/5 devido aos layouts baseados em tabelas.
  • Testes de framework necessários: Componentes complexos do Bootstrap exigem testes extensivos e possíveis soluções alternativas.

De acordo com relatos de desenvolvedores, usuários do PDFTron que trabalham com Bootstrap encontram os seguintes problemas:

  • Problemas de alinhamento na renderização das barras de navegação baseadas em Flexbox
  • Baralhos de cartas e sistemas de grade que exigem ajustes de CSS
  • Utilitários responsivos não estão sendo considerados na saída em PDF
  • É necessário simplificar os componentes do Bootstrap ou usar CSS alternativo?

Considerações para empresas: Para aplicações baseadas em versões modernas do Bootstrap (4+), o PDFTron pode exigir um esforço de desenvolvimento adicional significativo para lidar com as conversões de layout, o que pode anular suas outras vantagens de desempenho. A abordagem de mecanismo personalizado significa que você não obterá a mesma fidelidade de renderização que um navegador real.

Para obter suporte completo ao framework Bootstrap e orientações sobre testes, consulte o Guia de CSS do Bootstrap e Flexbox .

Quando devo escolher cada biblioteca?

A escolha certa depende das suas necessidades e limitações específicas.

Escolha o IronPDF quando:

A fidelidade ao HTML/CSS é crucial.

  • Aplicações web modernas com layouts complexos
  • Conteúdo com uso intensivo de JavaScript
  • Designs responsivos que precisam ser preservados

O desenvolvimento rápido é uma prioridade.

Transparência orçamentária é importante

  • A divulgação de preços permite um orçamento preciso. Sem custos surpresa ou taxas ocultas
  • Inclui todos os recursos da licença básica

Você precisa de recursos específicos

Escolha PDFTron (Apryse) quando:

Fluxos de trabalho de documentos empresariais

  • Processamento de formulários complexos com suporte a XFA
  • Conversão de arquivos CAD (DWG, DXF)
  • Manipulação avançada de documentos do Office

Desempenho acima de recursos

  • Processamento simples de documentos em grande volume
  • Requisitos de memória reduzidos
  • Necessidades básicas de conversão de HTML

Requisitos Específicos

  • Componentes integrados do visualizador de documentos
  • Diversos tipos de anotações (mais de 30)
  • Integração de sistemas legados

Ambiente de Grandes Empresas

  • Contratos de suporte dedicados
  • Desenvolvimento de funcionalidades personalizadas
  • Certificações de conformidade

Resumo e Conclusão

Tanto o IronPDF quanto o PDFTron (Apryse) são bibliotecas de PDF competentes, mas atendem a diferentes segmentos de mercado e casos de uso.

O IronPDF se destaca em:

  • Suporte a tecnologias web modernas (HTML5, CSS3, JavaScript)
  • Design de API amigável para desenvolvedores Preços transparentes e acessíveis.
  • Desenvolvimento rápido de aplicações
  • Implantações em nuvem e em contêineres

Os pontos fortes do PDFTron (Apryse) incluem:

  • Fluxos de trabalho de documentos empresariais
  • Suporte para CAD e formatos especializados
  • Menor consumo de recursos
  • Ampla capacidade de anotação
  • Compatibilidade com sistemas legados

Para a maioria dos desenvolvedores .NET que criam aplicativos modernos, o IronPDF oferece a melhor combinação de recursos, facilidade de uso e custo-benefício. Seu mecanismo de renderização baseado no Chrome garante uma conversão perfeita de HTML para PDF, enquanto a API intuitiva acelera o desenvolvimento.

O PDFTron continua sendo uma opção viável para empresas com requisitos específicos relacionados à conversão de CAD, processamento de formulários complexos ou ao trabalho com formatos de documentos legados. No entanto, a falta de transparência nos preços e a estrutura de licenciamento modular podem aumentar significativamente os custos totais.

Começando

Experimente o IronPDF:

Explore o PDFTron:

Lembre-se de avaliar cuidadosamente ambas as opções, considerando seus casos de uso específicos, antes de tomar uma decisão. Considere fatores como custos a longo prazo, qualidade do suporte e roteiro de funcionalidades, além das capacidades técnicas.

Comece a usar IronPDF no seu projeto hoje mesmo com um teste gratuito.

Primeiro passo:
green arrow pointer

ObservePDFTron é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pela PDFTron. 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.

Perguntas frequentes

Como posso converter HTML para PDF em C#?

Você pode usar o método RenderHtmlAsPdf do IronPDF para converter strings HTML em PDFs. Você também pode converter arquivos HTML em PDFs usando o RenderHtmlFileAsPdf .

Quais são as diferenças de desempenho entre o IronPDF e o PDFTron na conversão de HTML para PDF?

O IronPDF oferece renderização superior para conteúdo web complexo com seu mecanismo baseado no Chrome, proporcionando melhor suporte for JavaScript e CSS3. O PDFTron, embora mais rápido para HTML simples, pode não lidar com conteúdo complexo de forma tão eficaz.

Quais são as opções de licenciamento para IronPDF e PDFTron?

A IronPDF oferece licenças transparentes e perpétuas com todos os recursos incluídos a partir de US$ 749. Já a PDFTron exige orçamentos personalizados para licenciamento, que podem variar de US$ 5.000 a mais de US$ 100.000 por ano.

É possível converter páginas ASPX para PDF usando essas bibliotecas?

Sim, o IronPDF pode converter páginas ASPX em PDF usando o método AspxToPdf.RenderThisPageAsPdf em uma única linha de código. O PDFTron não oferece suporte direto à conversão de páginas ASPX.

Qual biblioteca é mais adequada para ambientes de nuvem como o Azure?

O IronPDF é otimizado para ambientes de nuvem, incluindo Azure e AWS, e funciona perfeitamente com o Azure Functions e o WebApps. O PDFTron pode exigir configuração adicional para uma implantação ideal na nuvem.

É possível criar formulários PDF preenchíveis com o IronPDF ou o PDFTron?

Sim, ambas as bibliotecas suportam a criação de formulários PDF preenchíveis. O IronPDF usa CreatePdfFormsFromHtml para conversão automática de formulários HTML. O PDFTron oferece uma ampla variedade de tipos de campos de formulário, mas requer uma integração mais complexa.

Quais opções de suporte estão disponíveis para usuários do IronPDF e do PDFTron?

A IronPDF oferece suporte técnico 24 horas por dia, 5 dias por semana, com acesso direto aos desenvolvedores e um tempo de resposta típico de 24 a 48 horas. As opções de suporte da PDFTron variam de acordo com o plano de licença, incluindo suporte básico por fórum e assistência direta paga.

Como o IronPDF e o PDFTron se comparam no tratamento de sites protegidos por senha?

O IronPDF oferece suporte à autenticação por meio do ChromeHttpLoginCredentials para lidar com formulários de login e autenticação HTTP, enquanto o PDFTron tem suporte limitado para esse recurso.

Jacob Mellor, Diretor de Tecnologia da Team Iron
Diretor de Tecnologia

Jacob Mellor é Diretor de Tecnologia da Iron Software e um engenheiro visionário pioneiro na tecnologia C# PDF. Como desenvolvedor original do código-fonte principal da Iron Software, ele moldou a arquitetura de produtos da empresa desde sua criação, transformando-a, juntamente com o CEO Cameron Rimington, em uma ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim