Uma comparação entre IronPDF e PDFNet
1. Introdução
Procurando as ferramentas de PDF perfeitas para o .NET Framework?
Neste artigo, vamos analisar como trabalhar com arquivos PDF em C# (uma das linguagens de programação mais populares). Analisaremos duas ferramentas de PDF líderes de mercado para C# no .NET Framework, usando exemplos de código para compará-las com base em seu desempenho e recursos. Por fim, examinaremos os detalhes de licenciamento e aprenderemos como obter as chaves de licença.
As duas bibliotecas de PDF são:
- PDFNet
- IronPDF
2. IronPDF
IronPDF é uma biblioteca C# .NET desenvolvida pela Iron Software para resolver todos os problemas de PDF para desenvolvedores C# .NET usando uma única biblioteca. O IronPDF utiliza o mecanismo Chromium e possui uma variedade de recursos úteis e poderosos, como a conversão de arquivos HTML5, JavaScript, CSS e de imagem para PDF, a criação de cabeçalhos e rodapés personalizados e a exibição de PDFs exatamente como aparecem em um navegador. O IronPDF permite ler dados de arquivos PDF e inseri-los automaticamente em seus aplicativos .NET e sistemas de armazenamento de dados. Você pode importar, mover e indexar conteúdo de arquivos PDF antigos para seus aplicativos de gerenciamento de documentos e de negócios.
2.1. Funcionalidades do IronPDF
2.1.1. Conversões de PDF
Essa funcionalidade permite gerar arquivos PDF a partir de vários formatos, como HTML, visualizações MVC, formulários da Web, strings HTML e URLs.
2.1.2. Extração do conteúdo do PDF
Em muitas circunstâncias, você pode extrair facilmente o texto incorporado em PDFs. No entanto, se isso falhar, é muito provável que seu texto esteja incorporado em uma imagem. Para digitalizar documentos em busca de texto visual, em vez de texto simples, use a biblioteca IronOCR .
2.1.3 Cabeçalhos e Rodapés
É possível adicionar cabeçalhos e rodapés durante a criação de um PDF ou a PDFs já existentes. Utilizando a propriedade Opções de Impressão, você pode criar um cabeçalho e um rodapé para cada página do documento. Esses parâmetros estão disponíveis no objeto ChromePdfRenderer. Este exemplo é executado em um aplicativo de console .NET Core .
2.1.4. Processamento de imagens em PDF
Isso permite aos usuários gerar imagens a partir de PDFs, bem como PDFs a partir de fotografias. Suporta extração de imagens, diversas extensões de imagem e impressão de PDFs.
2.1.5. Documentos PDF IO
O IronPDF também inclui criptografia de PDF de 128 bits, bloqueio de PDF protegido por senha e assinatura digital de PDFs.
2.1.6. Edição de PDF
A ferramenta IronPDF permite adicionar marcas d'água, adicionar páginas, remover páginas, planos de fundo, planos de primeiro plano e muito mais aos seus PDFs.
2.1.7. Compatibilidade
O IronPDF é compatível com quase todos os sistemas operacionais e frameworks compatíveis com C#, tais como:
- Windows
- .NET Core 2.1, 3.0, 3.1, .NET 6 e 5
- Conformidade com o .NET Standard 2.0 para compatibilidade universal
- Azure
- AWS
- Docker
- Linux
3. PDFNet
O SDK PDFNet .NET da PDFTron traz processamento, anotação, edição e criação de PDFs precisos para qualquer framework ou aplicação na web, dispositivos móveis, desktops ou servidores. Ele gerencia todo o processo de gerenciamento de documentos e informações com sua infraestrutura e elimina a necessidade de dependências de servidores de terceiros. A plataforma web da PDFTron inclui uma versão em JS com suporte para todas as plataformas e uma chave de licença de demonstração para todos os SDKs de PDF.
Um dos benefícios mais significativos do PDFNet é que ele é verdadeiramente multiplataforma, permitindo que nossos usuários adicionem facilmente compatibilidade com PDF e funcionalidades comerciais relevantes aos seus fluxos de trabalho e aplicativos em diversos contextos distintos de dispositivos móveis e desktops, tudo isso usando praticamente a mesma interface.
3.1. Recursos do SDK PDFNet
3.1.1. Compatibilidade
O SDK PDFNet é compatível com diversas plataformas e frameworks. Para garantir a consistência da plataforma, a API JavaScript é utilizada da mesma forma que a API PDFNet. Versões do SDK for Node.js e Electron também estão disponíveis. Este pacote requer binários adicionais não gerenciados.
3.1.2. Edição e visualização
Oferece aos usuários recursos de leitura e edição de PDFs seguros, escaláveis e de alta fidelidade em plataformas online, móveis e de desktop.
3.1.3. Assinatura
Crie procedimentos de assinatura personalizados. Documentos assinados digitalmente podem ser certificados, validados e selados.
3.1.4. Redação Verdadeira
Remova dados sensíveis de documentos, como informações pessoais ou informações pessoais de saúde, mantendo o documento pesquisável.
3.1.5. Manipulação da Página
É possível adicionar, remover ou reorganizar páginas. Os documentos podem ser reunidos, fundidos ou divididos em partes. Visualize vários documentos simultaneamente no mesmo leitor ou lado a lado.
4. Criando um novo projeto no Visual Studio
Neste artigo, vamos usar um aplicativo de console para gerar documentos PDF.
Abra o software Visual Studio e acesse o menu Arquivo. Selecione "novo projeto" e, em seguida, selecione aplicativo de console.
Insira o nome do projeto e selecione o caminho na caixa de texto apropriada. Em seguida, clique no botão Criar. Selecione a .NET Framework desejada, conforme mostrado na captura de tela abaixo:
O projeto do Visual Studio agora irá gerar a estrutura para o aplicativo de console. Após a conclusão, será aberto o arquivo Program.cs, no qual você poderá escrever e executar código-fonte.
Agora podemos adicionar a biblioteca e testar o programa.
5. Instale a biblioteca IronPDF.
A biblioteca IronPDF pode ser baixada e instalada de quatro maneiras diferentes. Estes são:
- Usando o Gerenciador de Pacotes NuGet do Visual Studio
- Utilizando a linha de comando do Visual Studio.
- Download direto do pacote IronPDF da Galeria NuGet .
- Download direto da página de downloads do IronPDF .
5.1 Usando o Gerenciador de Pacotes NuGet do Visual Studio
O software Visual Studio oferece a opção NuGet Package Manager para instalar o pacote diretamente na solução. A captura de tela abaixo mostra como abrir o Gerenciador de Pacotes NuGet .
Com a interface gráfica do Gerenciador de Pacotes aberta, clique na aba Procurar e pesquise por "IronPDF:"
Na imagem acima, podemos ver a lista de pacotes relacionados encontrados na pesquisa. Selecione a opção IronPDF e instale o pacote em nossa solução.
5.2 Usando a linha de comando do Visual Studio
No menu do Visual Studio, acesse Ferramentas > Gerenciador de Pacotes NuGet > Console do Gerenciador de Pacotes.
- Insira a seguinte linha na guia do console do gerenciador de pacotes:
Install-Package IronPdf
O pacote IronPDF será agora instalado no projeto.
5.3 Download direto da página da Web do NuGet
A terceira maneira é baixar o pacote NuGet diretamente da Galeria NuGet , especificamente o pacote IronPDF .
- Selecione a opção de pacote de download no menu à direita.
- Clique duas vezes no pacote baixado; Será instalado automaticamente. Em seguida, recarregue a solução e comece a usá-la no projeto.
5.4 Download direto da página da IronPDF
Faça o download do pacote mais recente diretamente da página de downloads do IronPDF . Após o download, siga os passos abaixo para adicionar o pacote ao projeto.
- Clique com o botão direito do mouse no projeto na janela de soluções. Em seguida, selecione as opções de referência e navegue até o local onde o arquivo de referência foi baixado. Em seguida, clique em OK para adicionar a referência.
6. Instale o SDK do PDFNet
O SDK do PDFNet pode ser baixado e instalado de quatro maneiras diferentes.
- Utilizando o Gerenciador de Pacotes NuGet do Visual Studio.
- Utilizando a linha de comando do Visual Studio.
- Download direto do pacote PDFNet da Galeria NuGet .
- Usando PDFNetLoader.dll
6.1. Usando o Gerenciador de Pacotes NuGet do Visual Studio
Conforme explicado acima, acesse as ferramentas no Visual Studio e abra o gerenciador de pacotes NuGet . Uma lista será exibida — clique em "Gerenciar pacotes NuGet para soluções".
Uma janela com uma barra de pesquisa será exibida. Procure por PDFNet e instale-o no projeto.
6.2. Usando a linha de comando do Visual Studio
No menu do Visual Studio, acesse Ferramentas > Gerenciador de Pacotes NuGet > Console do Gerenciador de Pacotes.
- Insira a seguinte linha na guia do console do gerenciador de pacotes:
Install-Package PDFNet -Version 9.2.0
6.3. Download direto da página da Web do NuGet
A terceira maneira é baixar o pacote NuGet diretamente da Galeria NuGet , especificamente o pacote PDFNet .
- Selecione o pacote de download desejado no menu à direita.
- Clique duas vezes no pacote baixado para iniciar o processo de instalação.
6.4. Usando PDFNetLoader.dll
Você também pode instalar a API PDFNet usando o arquivo PDFNetLoader.dll. Faça o download dele na página de lançamentos do GitHub para PDFNetLoader.dll .
Baixe o pacote, coloque-o na pasta bin do projeto e execute-o. No seu projeto do Visual Studio, adicione PDFNetLoader.dll como uma referência.
Renderização do Bootstrap e do framework CSS
As aplicações web modernas dependem muito do Bootstrap e dos frameworks CSS para um design consistente e responsivo. Ao gerar PDFs a partir de conteúdo da web, a capacidade de renderizar com precisão essas estruturas sem modificações é essencial para manter a consistência do design e reduzir o esforço de desenvolvimento.
IronPDF: Suporte completo ao framework Bootstrap
Bootstrap 5: Sistema completo de layout flexbox, CSS Grid, classes utilitárias e todas as bibliotecas de componentes. Bootstrap 4: Componentes de cartão completos, navegação, utilitários flexíveis e design responsivo.
- Tailwind CSS: Todas as classes utilitárias são renderizadas com precisão no navegador.
- Foundation: Sistema de grade completo e suporte a componentes CSS3 moderno: Flexbox, CSS Grid, propriedades personalizadas, animações, transições e transformações.
Validação no mundo real: o IronPDF renderiza a página inicial do Bootstrap e todos os exemplos oficiais com fidelidade perfeita em cada pixel.
Exemplo de código: Painel de controle do sistema de gestão de aprendizagem
using IronPdf;
// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";
var renderer = new ChromePdfRenderer();
string bootstrapLMS = @"
<!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'>
<div>
<h1 class='display-6 mb-1'>Student Learning Dashboard</h1>
<p class='text-muted mb-0'>Spring Semester 2025</p>
</div>
<span class='badge bg-success fs-5'>92% Overall Progress</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-primary'>
<div class='card-body'>
<div class='text-primary mb-2' style='font-size: 2rem;'>📚</div>
<h3 class='mb-1'>6/8</h3>
<p class='text-muted mb-0'>Courses Completed</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-success'>
<div class='card-body'>
<div class='text-success mb-2' style='font-size: 2rem;'>🎯</div>
<h3 class='mb-1'>24/28</h3>
<p class='text-muted mb-0'>Assignments Submitted</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-warning'>
<div class='card-body'>
<div class='text-warning mb-2' style='font-size: 2rem;'>⏱️</div>
<h3 class='mb-1'>48hrs</h3>
<p class='text-muted mb-0'>Study Time This Week</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-info'>
<div class='card-body'>
<div class='text-info mb-2' style='font-size: 2rem;'>⭐</div>
<h3 class='mb-1'>A- Average</h3>
<p class='text-muted mb-0'>Current GPA: 3.7</p>
</div>
</div>
</div>
</div>
<div class='row g-4'>
<div class='col-md-8'>
<div class='card shadow-sm'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Current Courses</h5>
</div>
<div class='card-body p-0'>
<div class='list-group list-group-flush'>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Advanced Web Development</h6>
<small class='text-muted'>Prof. Johnson | Mondays & Wednesdays, 2:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 95%'></div>
</div>
<small class='text-muted'>95% Complete | Final Project Due: May 15</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Database Systems</h6>
<small class='text-muted'>Prof. Chen | Tuesdays & Thursdays, 10:00 AM</small>
</div>
<span class='badge bg-primary'>Grade: A-</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 88%'></div>
</div>
<small class='text-muted'>88% Complete | Midterm: April 28</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Artificial Intelligence Fundamentals</h6>
<small class='text-muted'>Prof. Martinez | Fridays, 1:00 PM</small>
</div>
<span class='badge bg-warning text-dark'>Grade: B+</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 75%'></div>
</div>
<small class='text-muted'>75% Complete | Research Paper Due: May 5</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Computer Networks</h6>
<small class='text-muted'>Prof. Davis | Mondays & Wednesdays, 4:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 92%'></div>
</div>
<small class='text-muted'>92% Complete | Lab Exam: April 30</small>
</div>
</div>
</div>
</div>
</div>
<div class='col-md-4'>
<div class='card shadow-sm mb-3'>
<div class='card-header bg-warning text-dark'>
<h5 class='mb-0'>Upcoming Deadlines</h5>
</div>
<div class='card-body p-0'>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-danger me-2'>Today</span>
<div class='flex-grow-1'>
<small><strong>AI Assignment 4</strong></small>
<br><small class='text-muted'>Neural Networks Lab</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-warning text-dark me-2'>Apr 28</span>
<div class='flex-grow-1'>
<small><strong>Database Midterm</strong></small>
<br><small class='text-muted'>Chapters 1-8</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-info me-2'>Apr 30</span>
<div class='flex-grow-1'>
<small><strong>Networks Lab Exam</strong></small>
<br><small class='text-muted'>Practical Assessment</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-primary me-2'>May 5</span>
<div class='flex-grow-1'>
<small><strong>AI Research Paper</strong></small>
<br><small class='text-muted'>15-20 pages</small>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-header bg-info text-white'>
<h5 class='mb-0'>Study Resources</h5>
</div>
<div class='card-body'>
<div class='d-grid gap-2'>
<button class='btn btn-outline-primary btn-sm'>📖 Course Materials</button>
<button class='btn btn-outline-primary btn-sm'>💬 Discussion Forums</button>
<button class='btn btn-outline-primary btn-sm'>🎥 Recorded Lectures</button>
<button class='btn btn-outline-primary btn-sm'>📝 Practice Quizzes</button>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapLMS);
pdf.SaveAs("lms-dashboard.pdf");
using IronPdf;
// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";
var renderer = new ChromePdfRenderer();
string bootstrapLMS = @"
<!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'>
<div>
<h1 class='display-6 mb-1'>Student Learning Dashboard</h1>
<p class='text-muted mb-0'>Spring Semester 2025</p>
</div>
<span class='badge bg-success fs-5'>92% Overall Progress</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-primary'>
<div class='card-body'>
<div class='text-primary mb-2' style='font-size: 2rem;'>📚</div>
<h3 class='mb-1'>6/8</h3>
<p class='text-muted mb-0'>Courses Completed</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-success'>
<div class='card-body'>
<div class='text-success mb-2' style='font-size: 2rem;'>🎯</div>
<h3 class='mb-1'>24/28</h3>
<p class='text-muted mb-0'>Assignments Submitted</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-warning'>
<div class='card-body'>
<div class='text-warning mb-2' style='font-size: 2rem;'>⏱️</div>
<h3 class='mb-1'>48hrs</h3>
<p class='text-muted mb-0'>Study Time This Week</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-info'>
<div class='card-body'>
<div class='text-info mb-2' style='font-size: 2rem;'>⭐</div>
<h3 class='mb-1'>A- Average</h3>
<p class='text-muted mb-0'>Current GPA: 3.7</p>
</div>
</div>
</div>
</div>
<div class='row g-4'>
<div class='col-md-8'>
<div class='card shadow-sm'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Current Courses</h5>
</div>
<div class='card-body p-0'>
<div class='list-group list-group-flush'>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Advanced Web Development</h6>
<small class='text-muted'>Prof. Johnson | Mondays & Wednesdays, 2:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 95%'></div>
</div>
<small class='text-muted'>95% Complete | Final Project Due: May 15</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Database Systems</h6>
<small class='text-muted'>Prof. Chen | Tuesdays & Thursdays, 10:00 AM</small>
</div>
<span class='badge bg-primary'>Grade: A-</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 88%'></div>
</div>
<small class='text-muted'>88% Complete | Midterm: April 28</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Artificial Intelligence Fundamentals</h6>
<small class='text-muted'>Prof. Martinez | Fridays, 1:00 PM</small>
</div>
<span class='badge bg-warning text-dark'>Grade: B+</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 75%'></div>
</div>
<small class='text-muted'>75% Complete | Research Paper Due: May 5</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Computer Networks</h6>
<small class='text-muted'>Prof. Davis | Mondays & Wednesdays, 4:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 92%'></div>
</div>
<small class='text-muted'>92% Complete | Lab Exam: April 30</small>
</div>
</div>
</div>
</div>
</div>
<div class='col-md-4'>
<div class='card shadow-sm mb-3'>
<div class='card-header bg-warning text-dark'>
<h5 class='mb-0'>Upcoming Deadlines</h5>
</div>
<div class='card-body p-0'>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-danger me-2'>Today</span>
<div class='flex-grow-1'>
<small><strong>AI Assignment 4</strong></small>
<br><small class='text-muted'>Neural Networks Lab</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-warning text-dark me-2'>Apr 28</span>
<div class='flex-grow-1'>
<small><strong>Database Midterm</strong></small>
<br><small class='text-muted'>Chapters 1-8</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-info me-2'>Apr 30</span>
<div class='flex-grow-1'>
<small><strong>Networks Lab Exam</strong></small>
<br><small class='text-muted'>Practical Assessment</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-primary me-2'>May 5</span>
<div class='flex-grow-1'>
<small><strong>AI Research Paper</strong></small>
<br><small class='text-muted'>15-20 pages</small>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-header bg-info text-white'>
<h5 class='mb-0'>Study Resources</h5>
</div>
<div class='card-body'>
<div class='d-grid gap-2'>
<button class='btn btn-outline-primary btn-sm'>📖 Course Materials</button>
<button class='btn btn-outline-primary btn-sm'>💬 Discussion Forums</button>
<button class='btn btn-outline-primary btn-sm'>🎥 Recorded Lectures</button>
<button class='btn btn-outline-primary btn-sm'>📝 Practice Quizzes</button>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapLMS);
pdf.SaveAs("lms-dashboard.pdf");
Imports IronPdf
' Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here"
Dim renderer As New ChromePdfRenderer()
Dim bootstrapLMS 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'>
<div>
<h1 class='display-6 mb-1'>Student Learning Dashboard</h1>
<p class='text-muted mb-0'>Spring Semester 2025</p>
</div>
<span class='badge bg-success fs-5'>92% Overall Progress</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-primary'>
<div class='card-body'>
<div class='text-primary mb-2' style='font-size: 2rem;'>📚</div>
<h3 class='mb-1'>6/8</h3>
<p class='text-muted mb-0'>Courses Completed</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-success'>
<div class='card-body'>
<div class='text-success mb-2' style='font-size: 2rem;'>🎯</div>
<h3 class='mb-1'>24/28</h3>
<p class='text-muted mb-0'>Assignments Submitted</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-warning'>
<div class='card-body'>
<div class='text-warning mb-2' style='font-size: 2rem;'>⏱️</div>
<h3 class='mb-1'>48hrs</h3>
<p class='text-muted mb-0'>Study Time This Week</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-info'>
<div class='card-body'>
<div class='text-info mb-2' style='font-size: 2rem;'>⭐</div>
<h3 class='mb-1'>A- Average</h3>
<p class='text-muted mb-0'>Current GPA: 3.7</p>
</div>
</div>
</div>
</div>
<div class='row g-4'>
<div class='col-md-8'>
<div class='card shadow-sm'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Current Courses</h5>
</div>
<div class='card-body p-0'>
<div class='list-group list-group-flush'>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Advanced Web Development</h6>
<small class='text-muted'>Prof. Johnson | Mondays & Wednesdays, 2:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 95%'></div>
</div>
<small class='text-muted'>95% Complete | Final Project Due: May 15</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Database Systems</h6>
<small class='text-muted'>Prof. Chen | Tuesdays & Thursdays, 10:00 AM</small>
</div>
<span class='badge bg-primary'>Grade: A-</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 88%'></div>
</div>
<small class='text-muted'>88% Complete | Midterm: April 28</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Artificial Intelligence Fundamentals</h6>
<small class='text-muted'>Prof. Martinez | Fridays, 1:00 PM</small>
</div>
<span class='badge bg-warning text-dark'>Grade: B+</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 75%'></div>
</div>
<small class='text-muted'>75% Complete | Research Paper Due: May 5</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Computer Networks</h6>
<small class='text-muted'>Prof. Davis | Mondays & Wednesdays, 4:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 92%'></div>
</div>
<small class='text-muted'>92% Complete | Lab Exam: April 30</small>
</div>
</div>
</div>
</div>
</div>
<div class='col-md-4'>
<div class='card shadow-sm mb-3'>
<div class='card-header bg-warning text-dark'>
<h5 class='mb-0'>Upcoming Deadlines</h5>
</div>
<div class='card-body p-0'>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-danger me-2'>Today</span>
<div class='flex-grow-1'>
<small><strong>AI Assignment 4</strong></small>
<br><small class='text-muted'>Neural Networks Lab</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-warning text-dark me-2'>Apr 28</span>
<div class='flex-grow-1'>
<small><strong>Database Midterm</strong></small>
<br><small class='text-muted'>Chapters 1-8</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-info me-2'>Apr 30</span>
<div class='flex-grow-1'>
<small><strong>Networks Lab Exam</strong></small>
<br><small class='text-muted'>Practical Assessment</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-primary me-2'>May 5</span>
<div class='flex-grow-1'>
<small><strong>AI Research Paper</strong></small>
<br><small class='text-muted'>15-20 pages</small>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-header bg-info text-white'>
<h5 class='mb-0'>Study Resources</h5>
</div>
<div class='card-body'>
<div class='d-grid gap-2'>
<button class='btn btn-outline-primary btn-sm'>📖 Course Materials</button>
<button class='btn btn-outline-primary btn-sm'>💬 Discussion Forums</button>
<button class='btn btn-outline-primary btn-sm'>🎥 Recorded Lectures</button>
<button class='btn btn-outline-primary btn-sm'>📝 Practice Quizzes</button>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(bootstrapLMS)
pdf.SaveAs("lms-dashboard.pdf")
Resultado: PDF de um sistema profissional de gestão de aprendizagem com o sistema de grid do Bootstrap 5, componentes de cartão, barras de progresso, badges, layouts flexbox e grupos de listas — tudo renderizado com espaçamento, tipografia e precisão de cores perfeitos.
PDFNet (Apryse): Suporte parcial a CSS moderno
O PDFNet utiliza um mecanismo de renderização HTML personalizado com suporte seletivo a CSS3:
- Implementação limitada do Flexbox: os layouts baseados em Flexbox do Bootstrap 4/5 podem ser renderizados de forma inconsistente.
- Suporte parcial ao CSS Grid: designs baseados em grid geralmente exigem alternativas.
- Limitações do JavaScript : Execução mínima em comparação com ambientes de navegador completos.
- Testes de framework necessários: os componentes do Bootstrap precisam ser validados antes do uso em produção.
Impacto no desenvolvimento: As equipes precisam testar cada componente do Bootstrap individualmente e, frequentemente, criam layouts simplificados ou CSS alternativo para o PDFNet, o que aumenta a complexidade e reduz a consistência do design.
Para obter orientações completas sobre o framework Bootstrap e recursos modernos de renderização CSS, consulte o Guia de CSS do Bootstrap e Flexbox .
7. Impressão de um arquivo PDF (Exemplos de código)
Imprimir um arquivo PDF é um recurso indispensável para aplicativos modernos que trabalham com PDFs. Aqui, discutiremos como imprimir arquivos PDF usando ambas as ferramentas.
7.1. Imprimindo um arquivo PDF usando o IronPDF
O IronPDF imprime um PDF enviando-o para a impressora padrão do computador. Isso abrirá a interface de impressão do Windows — basta clicar em imprimir para que a impressão seja realizada.
using IronPdf;
class PrintPDF
{
static void Main(string[] args)
{
// Create a new PDF and print it
var Renderer = new IronPdf.ChromePdfRenderer();
PdfDocument Pdf = Renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
// Send the PDF to the default printer to print
Pdf.Print(300, false);
}
}
using IronPdf;
class PrintPDF
{
static void Main(string[] args)
{
// Create a new PDF and print it
var Renderer = new IronPdf.ChromePdfRenderer();
PdfDocument Pdf = Renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
// Send the PDF to the default printer to print
Pdf.Print(300, false);
}
}
Imports IronPdf
Friend Class PrintPDF
Shared Sub Main(ByVal args() As String)
' Create a new PDF and print it
Dim Renderer = New IronPdf.ChromePdfRenderer()
Dim Pdf As PdfDocument = Renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf")
' Send the PDF to the default printer to print
Pdf.Print(300, False)
End Sub
End Class
7.2. Imprimindo um arquivo PDF usando o PDFNet
O SDK PDFNet da PDFTron também oferece um recurso de impressão. Abaixo está o trecho de código-fonte para imprimir um arquivo PDF no PDFNet.
using System;
using pdftron;
using pdftron.PDF;
using pdftron.Common;
using pdftron.Filters;
namespace PDFPrintTestCS
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Opening the input file...");
using (PDFDoc pdfdoc = new PDFDoc("tiger.pdf"))
{
pdfdoc.InitSecurityHandler();
Console.WriteLine("Printing the input file using PDF.Print.StartPrintJob...");
PrinterMode printerMode = new PrinterMode();
printerMode.SetAutoCenter(true);
printerMode.SetAutoRotate(true);
printerMode.SetCollation(true);
printerMode.SetCopyCount(1);
printerMode.SetDPI(300); // Set print quality to 300 DPI
printerMode.SetDuplexing(PrinterMode.DuplexMode.e_Duplex_Auto);
printerMode.SetNUp(PrinterMode.NUp.e_NUp_1_1, PrinterMode.NUpPageOrder.e_PageOrder_LeftToRightThenTopToBottom);
printerMode.SetOrientation(PrinterMode.Orientation.e_Orientation_Portrait);
printerMode.SetOutputAnnot(PrinterMode.PrintContentTypes.e_PrintContent_DocumentAndAnnotations);
printerMode.SetOutputColor(PrinterMode.OutputColor.e_OutputColor_Grayscale);
printerMode.SetOutputPageBorder(false);
printerMode.SetOutputQuality(PrinterMode.OutputQuality.e_OutputQuality_Medium);
printerMode.SetPaperSize(new Rect(0, 0, 612, 792));
PageSet pagesToPrint = new PageSet(1, pdfdoc.GetPageCount(), PageSet.Filter.e_all);
Print.StartPrintJob(pdfdoc, "", pdfdoc.GetFileName(), "", pagesToPrint, printerMode, null);
}
}
}
}
using System;
using pdftron;
using pdftron.PDF;
using pdftron.Common;
using pdftron.Filters;
namespace PDFPrintTestCS
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Opening the input file...");
using (PDFDoc pdfdoc = new PDFDoc("tiger.pdf"))
{
pdfdoc.InitSecurityHandler();
Console.WriteLine("Printing the input file using PDF.Print.StartPrintJob...");
PrinterMode printerMode = new PrinterMode();
printerMode.SetAutoCenter(true);
printerMode.SetAutoRotate(true);
printerMode.SetCollation(true);
printerMode.SetCopyCount(1);
printerMode.SetDPI(300); // Set print quality to 300 DPI
printerMode.SetDuplexing(PrinterMode.DuplexMode.e_Duplex_Auto);
printerMode.SetNUp(PrinterMode.NUp.e_NUp_1_1, PrinterMode.NUpPageOrder.e_PageOrder_LeftToRightThenTopToBottom);
printerMode.SetOrientation(PrinterMode.Orientation.e_Orientation_Portrait);
printerMode.SetOutputAnnot(PrinterMode.PrintContentTypes.e_PrintContent_DocumentAndAnnotations);
printerMode.SetOutputColor(PrinterMode.OutputColor.e_OutputColor_Grayscale);
printerMode.SetOutputPageBorder(false);
printerMode.SetOutputQuality(PrinterMode.OutputQuality.e_OutputQuality_Medium);
printerMode.SetPaperSize(new Rect(0, 0, 612, 792));
PageSet pagesToPrint = new PageSet(1, pdfdoc.GetPageCount(), PageSet.Filter.e_all);
Print.StartPrintJob(pdfdoc, "", pdfdoc.GetFileName(), "", pagesToPrint, printerMode, null);
}
}
}
}
Imports System
Imports pdftron
Imports pdftron.PDF
Imports pdftron.Common
Imports pdftron.Filters
Namespace PDFPrintTestCS
Friend Class Program
Shared Sub Main(ByVal args() As String)
Console.WriteLine("Opening the input file...")
Using pdfdoc As New PDFDoc("tiger.pdf")
pdfdoc.InitSecurityHandler()
Console.WriteLine("Printing the input file using PDF.Print.StartPrintJob...")
Dim printerMode As New PrinterMode()
printerMode.SetAutoCenter(True)
printerMode.SetAutoRotate(True)
printerMode.SetCollation(True)
printerMode.SetCopyCount(1)
printerMode.SetDPI(300) ' Set print quality to 300 DPI
printerMode.SetDuplexing(PrinterMode.DuplexMode.e_Duplex_Auto)
printerMode.SetNUp(PrinterMode.NUp.e_NUp_1_1, PrinterMode.NUpPageOrder.e_PageOrder_LeftToRightThenTopToBottom)
printerMode.SetOrientation(PrinterMode.Orientation.e_Orientation_Portrait)
printerMode.SetOutputAnnot(PrinterMode.PrintContentTypes.e_PrintContent_DocumentAndAnnotations)
printerMode.SetOutputColor(PrinterMode.OutputColor.e_OutputColor_Grayscale)
printerMode.SetOutputPageBorder(False)
printerMode.SetOutputQuality(PrinterMode.OutputQuality.e_OutputQuality_Medium)
printerMode.SetPaperSize(New Rect(0, 0, 612, 792))
Dim pagesToPrint As New PageSet(1, pdfdoc.GetPageCount(), PageSet.Filter.e_all)
Print.StartPrintJob(pdfdoc, "", pdfdoc.GetFileName(), "", pagesToPrint, printerMode, Nothing)
End Using
End Sub
End Class
End Namespace
8. Criar PDFs a partir de HTML
Ambas as bibliotecas possuem recursos de conversão de HTML para PDF, mas os métodos são ligeiramente diferentes.
8.1. Criar PDFs a partir de HTML usando o IronPDF
O IronPDF não exige o uso de JSON ou mecanismos de criptografia. O IronPDF suporta uma ampla gama de métodos. Por exemplo:
Converter arquivos HTML para PDF
using IronPdf;
class HtmlToPdf
{
static void Main(string[] args)
{
var Renderer = new IronPdf.ChromePdfRenderer();
Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>").SaveAs("pixel-perfect.pdf");
}
}
using IronPdf;
class HtmlToPdf
{
static void Main(string[] args)
{
var Renderer = new IronPdf.ChromePdfRenderer();
Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>").SaveAs("pixel-perfect.pdf");
}
}
Imports IronPdf
Friend Class HtmlToPdf
Shared Sub Main(ByVal args() As String)
Dim Renderer = New IronPdf.ChromePdfRenderer()
Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>").SaveAs("pixel-perfect.pdf")
End Sub
End Class
URL para PDF
using IronPdf;
class UrlToPdf
{
static void Main(string[] args)
{
IronPdf.ChromePdfRenderer Renderer = new IronPdf.ChromePdfRenderer();
var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
Pdf.SaveAs("url.pdf");
}
}
using IronPdf;
class UrlToPdf
{
static void Main(string[] args)
{
IronPdf.ChromePdfRenderer Renderer = new IronPdf.ChromePdfRenderer();
var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
Pdf.SaveAs("url.pdf");
}
}
Imports IronPdf
Friend Class UrlToPdf
Shared Sub Main(ByVal args() As String)
Dim Renderer As New IronPdf.ChromePdfRenderer()
Dim Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/")
Pdf.SaveAs("url.pdf")
End Sub
End Class
8.2. Criar PDFs a partir de HTML usando o PDFNet
O PDFNet também oferece recursos de conversão de HTML para PDF, utilizando tanto a conversão de páginas quanto a conversão de URLs. Devido à extensão do código, forneceremos apenas um exemplo aqui.
class HTML2PDFSample
{
private static pdftron.PDFNetLoader pdfNetLoader = pdftron.PDFNetLoader.Instance();
static HTML2PDFSample() {}
static void Main(string[] args)
{
string output_path = "../../../../TestFiles/Output/html2pdf_example";
string host = "https://www.pdftron.com";
HTML2PDF.SetModulePath("../../../../../Lib");
if (!HTML2PDF.IsModuleAvailable())
{
Console.WriteLine();
Console.WriteLine("Unable to run HTML2PDFTest: PDFTron SDK HTML2PDF module not available.");
return;
}
try
{
using (PDFDoc doc = new PDFDoc())
{
if (HTML2PDF.Convert(doc, host + "/"))
doc.Save(output_path + "_01.pdf", SDFDoc.SaveOptions.e_linearized);
else
Console.WriteLine("Conversion failed.");
}
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
}
}
class HTML2PDFSample
{
private static pdftron.PDFNetLoader pdfNetLoader = pdftron.PDFNetLoader.Instance();
static HTML2PDFSample() {}
static void Main(string[] args)
{
string output_path = "../../../../TestFiles/Output/html2pdf_example";
string host = "https://www.pdftron.com";
HTML2PDF.SetModulePath("../../../../../Lib");
if (!HTML2PDF.IsModuleAvailable())
{
Console.WriteLine();
Console.WriteLine("Unable to run HTML2PDFTest: PDFTron SDK HTML2PDF module not available.");
return;
}
try
{
using (PDFDoc doc = new PDFDoc())
{
if (HTML2PDF.Convert(doc, host + "/"))
doc.Save(output_path + "_01.pdf", SDFDoc.SaveOptions.e_linearized);
else
Console.WriteLine("Conversion failed.");
}
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
}
}
Friend Class HTML2PDFSample
Private Shared pdfNetLoader As pdftron.PDFNetLoader = pdftron.PDFNetLoader.Instance()
Shared Sub New()
End Sub
Shared Sub Main(ByVal args() As String)
Dim output_path As String = "../../../../TestFiles/Output/html2pdf_example"
Dim host As String = "https://www.pdftron.com"
HTML2PDF.SetModulePath("../../../../../Lib")
If Not HTML2PDF.IsModuleAvailable() Then
Console.WriteLine()
Console.WriteLine("Unable to run HTML2PDFTest: PDFTron SDK HTML2PDF module not available.")
Return
End If
Try
Using doc As New PDFDoc()
If HTML2PDF.Convert(doc, host & "/") Then
doc.Save(output_path & "_01.pdf", SDFDoc.SaveOptions.e_linearized)
Else
Console.WriteLine("Conversion failed.")
End If
End Using
Catch e As PDFNetException
Console.WriteLine(e.Message)
End Try
End Sub
End Class
9. Licenciamento
IronPDF é uma biblioteca que oferece uma licença gratuita para desenvolvedores. A IronPDF também oferece uma estrutura de preços especial: o pacote básico começa em $799 sem custos ocultos. Também é possível redistribuir produtos SaaS e OEM. Todas as licenças incluem garantia de reembolso de 30 dias, um ano de suporte e atualizações de software, validade para desenvolvimento/teste/homologação/produção e licença perpétua (compra única). As licenças do IronPDF oferecem o máximo desempenho para as necessidades dos usuários. Acesse a página de licenciamento do IronPDF para ver a estrutura completa de preços e a licença do IronPDF.
O SDK PDFTron PDFNet oferece diversas opções de licenciamento que podem ser adaptadas às necessidades do seu negócio. Três tipos de licenças estão disponíveis para redistribuição empresarial e OEM. As licenças corporativas destinam-se apenas ao uso organizacional e não podem ser utilizadas na distribuição de aplicativos. APIs adicionais que exigem acesso ao sistema de arquivos também estão incluídas nas licenças. Todas as licenças incluem uma chave de licença. Os três tipos de licenças são:
- Espectador
- Visualizador e Anotação
- SDK principal
Para obter mais informações sobre suas estruturas de licenciamento, visite esta página de informações sobre licenciamento da PDFTron .
10. Conclusão
O IronPDF oferece diversos recursos e funcionalidades para processar arquivos PDF e convertê-los para diferentes formatos. As conversões de HTML para PDF são produzidas em um formato vetorial adequado para impressão comercial de alta qualidade. Como resultado, você receberá um PDF nítido e de alta qualidade. Informações sobre licenças e preços podem ser encontradas no site.
Semelhante ao IronPDF, o PDFNet auxilia na transição, anotação, assinatura, preenchimento, conversão e edição de arquivos PDF. É compatível com múltiplas plataformas, incluindo Windows, iOS, Android, Web e Linux. Para uso em produção, os SDKs do PDFNet precisam de uma chave de produto.
As licenças do IronPDF são centradas no desenvolvedor, o que significa que você precisa adquirir uma licença com base em quantos desenvolvedores usarão o produto. Por outro lado, as licenças do PDFNet não funcionam da mesma maneira, operando, em vez disso, com base em um sistema de licenciamento por funcionalidade. Isso significa que você precisa obter a licença que suporte os recursos necessários. As licenças do IronPDF incluem todos os recursos prontos para uso. Com o PDFNet, alguns recursos, como a conversão de documentos, precisam ser adquiridos como complementos.
A biblioteca IronPDF oferece recursos de forma organizada, facilitando a escrita de código que executa tarefas complexas com poucas linhas de código. A Iron Software está oferecendo atualmente um pacote com cinco ferramentas pelo preço de apenas duas. As ferramentas incluídas no Iron Suite são:
Visite a página de informações do Iron Suite para explorar o Iron Suite .
Perguntas frequentes
Quais são as principais bibliotecas de PDF comparadas no artigo?
O artigo compara o IronPDF, desenvolvido pela Iron Software, e o PDFNet, da PDFTron, com foco em suas funcionalidades para desenvolvedores C# dentro do .NET Framework.
Como posso converter HTML para PDF em C#?
Você pode usar o método RenderHtmlAsPdf do IronPDF para converter strings HTML em PDFs. Além disso, você pode converter arquivos HTML e URLs em PDFs usando o robusto mecanismo Chromium do IronPDF.
Quais sistemas operacionais são suportados pelo IronPDF?
O IronPDF é compatível com vários sistemas operacionais, incluindo Windows, Azure e Docker, permitindo uma integração perfeita em diversos ambientes de desenvolvimento.
Como o IronPDF lida com a extração de dados de PDFs?
O IronPDF permite a extração eficiente de dados de PDFs, possibilitando aos desenvolvedores recuperar facilmente texto e imagens de documentos PDF para processamento posterior.
Quais são as opções de instalação do IronPDF?
O IronPDF pode ser instalado através do Gerenciador de Pacotes NuGet do Visual Studio, da Linha de Comando do Visual Studio ou diretamente da Galeria NuGet, garantindo uma configuração fácil para os desenvolvedores.
Quais são as diferenças de licenciamento entre o IronPDF e o PDFNet?
A IronPDF oferece licenças voltadas para desenvolvedores que incluem todos os recursos, enquanto as licenças da PDFNet são baseadas em recursos e podem exigir compras adicionais para funcionalidades específicas.
O IronPDF é adequado para tarefas com PDFs grandes?
Sim, o IronPDF é elogiado pela sua facilidade de uso e requisitos mínimos de código, o que o torna adequado para lidar com grandes tarefas em PDF de forma eficiente.
Quais ferramentas adicionais estão incluídas no pacote Iron Software?
O pacote Iron Software inclui o IronBarcode, IronXL, IronOCR, IronPDF e IronWebscraper, disponíveis em um único pacote, o que aumenta seu atrativo para desenvolvedores.



