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

Comparação entre o IronPDF e o Apitron PDF Kit

Trabalhar com arquivos PDF em C# pode ser um desafio para os desenvolvedores. Há muitos fatores a considerar ao criar conteúdo para esses arquivos, e ainda mais ao converter conteúdo de diferentes formatos para PDF. A automação tornou-se crucial nos processos de desenvolvimento de software. Esses desafios foram abordados com o desenvolvimento de bibliotecas projetadas para ajudar a ler, escrever, criar e modificar documentos PDF, bem como editar seus atributos e convertê-los de outros formatos.

Esta postagem do blog compara duas bibliotecas PDF for .NET e .NET Core:

  • A biblioteca IronPDF
  • O Kit PDF Apitron

IronPDF e Apitron PDF Kit são bibliotecas que fornecem funções de manipulação de PDF for .NET e .NET Core. Ambos podem ser usados ​​para tarefas de conversão e manipulação de campos de documentos. Eles também permitem a criação de marcadores. O próximo passo é decidir qual biblioteca C# PDF .NET é a melhor para nossos projetos .NET . Este artigo comparativo ajudará você a decidir entre essas duas bibliotecas de PDF.

Primeiro, vamos explorar o que as duas bibliotecas oferecem e, em seguida, passar à comparação propriamente dita.

A Biblioteca de Kits PDF da Apitron e seus Recursos

O Apitron PDF Kit é um componente .NET que permite manipular ou converter arquivos PDF de diversas maneiras. Você pode adicionar imagens, desenhos e textos, assinar documentos e muito mais. Você também pode editar conteúdo existente. O componente Apitron PDF Kit .NET pode ser usado para criar aplicativos móveis, de desktop, web, Windows e em nuvem em diversas plataformas.

Com este SDK de PDF, você poderá:

  • Extrair, modificar e adicionar elementos gráficos (texto, imagens, desenhos)
  • Dividir ou mesclar documentos PDF
  • Preencha ou crie formulários PDF protegidos por senha, com suporte para FDF.
  • Crie documentos PDF com várias camadas e grupos de conteúdo opcionais (OCG).
  • Adicionar ou remover campos de documentos
  • Utilize texto da direita para a esquerda ou bidirecional para criar o conteúdo da página.
  • Analisar recursos dentro de um documento - fontes definidas, arquivos incorporados
  • Assinar digitalmente e verificar assinaturas existentes em documentos PDF

Principais características do IronPDF

Os desenvolvedores, especialmente os programadores C#, irão apreciar a biblioteca IronPDF .NET . Com essa ferramenta, você pode construir facilmente um aplicativo de processamento de PDF em .NET Core .

O IronPDF utiliza o mecanismo .NET Chromium para converter páginas HTML (em código ou em formato de URL) em arquivos PDF. Não é necessário usar APIs complexas para posicionar objetos de navegação ou criar PDFs a partir de HTML. O IronPDF oferece suporte a documentos web padrão, incluindo HTML, ASPX, JS, CSS e imagens.

O IronPDF pode ser criado usando HTML5, CSS, JS e imagens. Um arquivo PDF pode ser facilmente editado, carimbado e personalizado com cabeçalhos e rodapés. Isso também facilita a leitura de texto em PDF e a extração de gráficos.

Entre os principais recursos do IronPDF, destacam-se:

  • Criação de documentos PDF usando HTML4/5, CSS e JavaScript
  • Carregamento de URLs com credenciais de login de rede personalizadas, agentes de usuário, proxies, cookies, cabeçalhos HTTP e variáveis ​​de formulário (permitindo login por trás de formulários de login HTML)
  • Leitura e preenchimento de campos de formulário em PDF
  • Extração de texto e gráficos de PDFs
  • Atualizando páginas PDF com novo conteúdo HTML
  • Criação de cabeçalhos e rodapés em formato de texto ou HTML
  • Fusão e separação do conteúdo de documentos PDF
  • Conversão de formulários web ASP.NET em PDFs imprimíveis
  • Imprimir arquivos PDF sem o software Adobe Acrobat

O IronPDF está disponível em quase todos os sistemas operacionais e frameworks compatíveis com C#, incluindo:

  • .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, Windows

O restante do artigo segue da seguinte forma:

  1. Instalação do IronPDF
  2. Instalação do kit Apitron PDF
  3. Criar um documento PDF
  4. Criar cabeçalho e rodapé em PDF
  5. Assinar PDF digitalmente
  6. Preços e Licenciamento

1. Instalação do IronPDF

Existem quatro métodos para baixar e instalar a biblioteca IronPDF . Estes são:

  1. Usando o Gerenciador de Pacotes NuGet
  2. O Prompt de Comando do Desenvolvedor
  3. Baixe o pacote NuGet diretamente
  4. Baixe a biblioteca IronPDF .DLL.

1.1. Usando o Gerenciador de Pacotes NuGet

Para instalar o IronPDF, basta clicar com o botão direito do mouse no seu projeto no Explorador de Soluções. Isso abrirá o Gerenciador de Pacotes NuGet .

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 1: Acessando o Gerenciador de Pacotes NuGet usando o Explorador de Soluções

Acessando o Gerenciador de Pacotes NuGet usando o Explorador de Soluções

Após selecionar a opção, procure o pacote IronPDF e instale-o, conforme mostrado na captura de tela abaixo.

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 2: Instalando a biblioteca IronPDF usando o Gerenciador de Pacotes NuGet

Instalando a biblioteca IronPDF usando o Gerenciador de Pacotes NuGet

1.2. Usando o Prompt de Comando do Desenvolvedor

Você também pode instalar o IronPDF através do Prompt de Comando do Desenvolvedor.

  • Abra o Prompt de Comando do Desenvolvedor --- geralmente encontrado na pasta do Visual Studio
  • Digite o seguinte comando:
Install-Package IronPdf
  • Pressione Enter
  • Isso fará o download e a instalação do pacote. Recarregue seu projeto e comece a usá-lo.

1.3. Baixe o pacote NuGet diretamente

O IronPDF também pode ser instalado visitando diretamente o site do pacote NuGet do IronPDF e baixando o pacote. Os passos são:

  • Navegue até o pacote NuGet IronPDF
  • Selecione o pacote de download
  • Clique duas vezes no pacote baixado.
  • O pacote será instalado
  • Recarregue seu projeto do Visual Studio e comece a usá-lo.

O IronPDF foi baixado e está pronto para uso. No entanto, antes disso, devemos instalar a biblioteca Apitron PDF.

2. Instalação do kit Apitron PDF

Para aplicações .NET Core , podemos instalar o Apitron usando o Gerenciador de Pacotes NuGet , ou podemos baixar e instalar o Apitron diretamente do site do Apitron PDF Kit no NuGet .

  • Abra os pacotes NuGet no Visual Studio, como fazíamos no IronPDF.
  • Pesquise por Apitron.PDF.Kit.
  • Clique em instalar no seu projeto atual.
A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 3: Pesquisa de kits PDF Apitron

Pesquisa de kits PDF Apitron

Você também pode usar o Console do Gerenciador de Pacotes NuGet para instalar o Apitron. Siga o passo "Usar o Prompt de Comando do Desenvolvedor", conforme mencionado no IronPDF , e digite o seguinte comando:

Install-Package Apitron.PDF.Kit

Pressione ENTER. Ele fará o download e a instalação do Apitron.PDF.Kit.

Adicione os seguintes namespaces:

using Apitron.PDF.Kit;
using Apitron.PDF.Kit.FixedLayout.Resources;
using Apitron.PDF.Kit.FixedLayout.Resources.Fonts;
using Apitron.PDF.Kit.FlowLayout.Content;
using Apitron.PDF.Kit.Styles;
using Apitron.PDF.Kit.Styles.Appearance;
using Font = Apitron.PDF.Kit.Styles.Text.Font;
using Apitron.PDF.Kit;
using Apitron.PDF.Kit.FixedLayout.Resources;
using Apitron.PDF.Kit.FixedLayout.Resources.Fonts;
using Apitron.PDF.Kit.FlowLayout.Content;
using Apitron.PDF.Kit.Styles;
using Apitron.PDF.Kit.Styles.Appearance;
using Font = Apitron.PDF.Kit.Styles.Text.Font;
Imports Apitron.PDF.Kit
Imports Apitron.PDF.Kit.FixedLayout.Resources
Imports Apitron.PDF.Kit.FixedLayout.Resources.Fonts
Imports Apitron.PDF.Kit.FlowLayout.Content
Imports Apitron.PDF.Kit.Styles
Imports Apitron.PDF.Kit.Styles.Appearance
Imports Font = Apitron.PDF.Kit.Styles.Text.Font
$vbLabelText   $csharpLabel

Agora, vamos à comparação entre o IronPDF e o Apitron PDF.

3. Criando um documento PDF

3.1. Utilizando o IronPDF

O IronPDF possui vários métodos para criar PDFs. Vamos explorar duas questões importantes.

URL existente para PDF

O IronPDF facilita a conversão de qualquer URL para PDF. O código a seguir ajuda a converter URL em PDF.

var Renderer = new IronPdf.ChromePdfRenderer();
// Render a PDF from an existing URL
using var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
// Save the PDF to a file
Pdf.SaveAs("url.pdf");
var Renderer = new IronPdf.ChromePdfRenderer();
// Render a PDF from an existing URL
using var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
// Save the PDF to a file
Pdf.SaveAs("url.pdf");
Dim Renderer = New IronPdf.ChromePdfRenderer()
' Render a PDF from an existing URL
Dim Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/")
' Save the PDF to a file
Pdf.SaveAs("url.pdf")
$vbLabelText   $csharpLabel

Texto de entrada HTML para PDF

O código abaixo explica como renderizar um documento PDF a partir de uma string HTML. Você pode usar apenas HTML ou combiná-lo com CSS, imagens e JavaScript.

var Renderer = new IronPdf.ChromePdfRenderer();
// Render a PDF from a simple HTML string
using var PDF = Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>");
PDF.SaveAs("pixel-perfect.pdf");

// Load external HTML assets like images, CSS, and JavaScript
// Set the optional BasePath as the file location to load assets from
using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>Sample Text</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
var Renderer = new IronPdf.ChromePdfRenderer();
// Render a PDF from a simple HTML string
using var PDF = Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>");
PDF.SaveAs("pixel-perfect.pdf");

// Load external HTML assets like images, CSS, and JavaScript
// Set the optional BasePath as the file location to load assets from
using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>Sample Text</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
Dim Renderer = New IronPdf.ChromePdfRenderer()
' Render a PDF from a simple HTML string
Dim PDF = Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>")
PDF.SaveAs("pixel-perfect.pdf")

' Load external HTML assets like images, CSS, and JavaScript
' Set the optional BasePath as the file location to load assets from
Dim AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>Sample Text</h1>", "C:\site\assets\")
AdvancedPDF.SaveAs("html-with-assets.pdf")
$vbLabelText   $csharpLabel

O resultado é o seguinte:

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 4: IronPDF: Gere PDF a partir de URL e string HTML/CSS.

IronPDF: Gere PDF a partir de URL e string HTML/CSS.

3.2. Utilizando o Kit PDF Apitron

O Apitron PDF não oferece uma maneira de converter um URL ou HTML em PDF. Permite converter PDF em HTML. No entanto, também converte arquivos XML em PDF. O arquivo XML utilizado é:

<?xml version="1.0" encoding="utf-8"?>
<FlowDocument xmlns="Apitron.PDF.Kit.FlowLayout.v1">
  <Resources>
    <Image resourceId="logo" fileName="../../images/logo.png" />
  </Resources>
  <Styles>
    <Style selector="flowdocument">
      <Color value="Black" />
    </Style>
    <Style selector="grid">
      <InnerBorder thickness="1" />
      <InnerBorderColor value="Black" />
    </Style>
  </Styles>
  <Elements>
    <Image>
      <Properties>
        <Class value="logo" />
        <ResourceId value="logo" />
      </Properties>
    </Image>
    <TextBlock>
      <Properties>
        <Class value="header" />
        <Text value="Sample Interview Questions for Candidates" />
      </Properties>
    </TextBlock>
    <Br />
    <TextBlock>
      <Properties>
        <Class value="headerNote" />
        <Text value="To help facilitate the interview process, the Human Resources Department has compiled a list of questions that might be used during the phone and/or on-campus interviews. Some of the questions deal with the same content, but are phrased differently while other questions may not pertain to a specific discipline; however all of the questions are unbiased and appropriate to ask. We hope you'll find this helpful." />
      </Properties>
    </TextBlock>
  </Elements>
  <Properties>
    <Margin value="30,20,30,20" />
  </Properties>
</FlowDocument>
<?xml version="1.0" encoding="utf-8"?>
<FlowDocument xmlns="Apitron.PDF.Kit.FlowLayout.v1">
  <Resources>
    <Image resourceId="logo" fileName="../../images/logo.png" />
  </Resources>
  <Styles>
    <Style selector="flowdocument">
      <Color value="Black" />
    </Style>
    <Style selector="grid">
      <InnerBorder thickness="1" />
      <InnerBorderColor value="Black" />
    </Style>
  </Styles>
  <Elements>
    <Image>
      <Properties>
        <Class value="logo" />
        <ResourceId value="logo" />
      </Properties>
    </Image>
    <TextBlock>
      <Properties>
        <Class value="header" />
        <Text value="Sample Interview Questions for Candidates" />
      </Properties>
    </TextBlock>
    <Br />
    <TextBlock>
      <Properties>
        <Class value="headerNote" />
        <Text value="To help facilitate the interview process, the Human Resources Department has compiled a list of questions that might be used during the phone and/or on-campus interviews. Some of the questions deal with the same content, but are phrased differently while other questions may not pertain to a specific discipline; however all of the questions are unbiased and appropriate to ask. We hope you'll find this helpful." />
      </Properties>
    </TextBlock>
  </Elements>
  <Properties>
    <Margin value="30,20,30,20" />
  </Properties>
</FlowDocument>
XML

O código para converter este modelo XML em PDF é o seguinte:

// Use Apitron's FlowDocument to convert XML to PDF
using (Stream stream = File.OpenRead("C:\PLACE YOUR EXACT PATH HERE\template.xml"), 
               outputStream = File.Create("fromTemplate.pdf"))
{
    ResourceManager resourceManager = new ResourceManager();
    FlowDocument doc = FlowDocument.LoadFromXml(stream, resourceManager);

    doc.Write(outputStream, resourceManager);
}
// Use Apitron's FlowDocument to convert XML to PDF
using (Stream stream = File.OpenRead("C:\PLACE YOUR EXACT PATH HERE\template.xml"), 
               outputStream = File.Create("fromTemplate.pdf"))
{
    ResourceManager resourceManager = new ResourceManager();
    FlowDocument doc = FlowDocument.LoadFromXml(stream, resourceManager);

    doc.Write(outputStream, resourceManager);
}
' Use Apitron's FlowDocument to convert XML to PDF
Using stream As Stream = File.OpenRead("C:\PLACE YOUR EXACT PATH HERE\template.xml"),
      outputStream As Stream = File.Create("fromTemplate.pdf")

    Dim resourceManager As New ResourceManager()
    Dim doc As FlowDocument = FlowDocument.LoadFromXml(stream, resourceManager)

    doc.Write(outputStream, resourceManager)
End Using
$vbLabelText   $csharpLabel

O resultado é o seguinte:

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 5: Documento PDF Apitron

Documento PDF Apitron

Ao compararmos os resultados do IronPDF e do Apitron, fica evidente que o IronPDF cria documentos impressionantes utilizando renderização HTML, sem sequer redimensionar as imagens. Por outro lado, o Apitron produz resultados semelhantes aos do IronPDF , mas apenas se o arquivo XML contiver estilos registrados.

4. Adicionar cabeçalhos e rodapés a documentos PDF

4.1. Utilizando o IronPDF

Adicionar cabeçalhos e rodapés é muito simples com o IronPDF. O IronPDF permite adicionar números de página e quebras de página, anexar uma capa, margens, etc.

O código para adicionar cabeçalhos e rodapés está abaixo:

var Renderer = new ChromePdfRenderer();

// Add a header
Renderer.RenderingOptions.FirstPageNumber = 1; // Use 2 if a cover page will be appended
Renderer.RenderingOptions.TextHeader.DrawDividerLine = true;
Renderer.RenderingOptions.TextHeader.CenterText = "This is the header text";
Renderer.RenderingOptions.TextHeader.Font = IronPdf.Font.FontTypes.Helvetica;
Renderer.RenderingOptions.TextHeader.FontSize = 12;
Renderer.RenderingOptions.MarginTop = 25; // Create 25mm space for header

// Add a footer too
Renderer.RenderingOptions.TextFooter.DrawDividerLine = true;
Renderer.RenderingOptions.TextFooter.Font = IronPdf.Font.FontTypes.Arial;
Renderer.RenderingOptions.TextFooter.FontSize = 12;
Renderer.RenderingOptions.TextFooter.LeftText = "{date} {time}";
Renderer.RenderingOptions.TextFooter.RightText = "{page} of {total-pages}";
Renderer.RenderingOptions.MarginTop = 25; // Create 25mm space for footer

using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>This is header and footer generated pdf file</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
var Renderer = new ChromePdfRenderer();

// Add a header
Renderer.RenderingOptions.FirstPageNumber = 1; // Use 2 if a cover page will be appended
Renderer.RenderingOptions.TextHeader.DrawDividerLine = true;
Renderer.RenderingOptions.TextHeader.CenterText = "This is the header text";
Renderer.RenderingOptions.TextHeader.Font = IronPdf.Font.FontTypes.Helvetica;
Renderer.RenderingOptions.TextHeader.FontSize = 12;
Renderer.RenderingOptions.MarginTop = 25; // Create 25mm space for header

// Add a footer too
Renderer.RenderingOptions.TextFooter.DrawDividerLine = true;
Renderer.RenderingOptions.TextFooter.Font = IronPdf.Font.FontTypes.Arial;
Renderer.RenderingOptions.TextFooter.FontSize = 12;
Renderer.RenderingOptions.TextFooter.LeftText = "{date} {time}";
Renderer.RenderingOptions.TextFooter.RightText = "{page} of {total-pages}";
Renderer.RenderingOptions.MarginTop = 25; // Create 25mm space for footer

using var AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>This is header and footer generated pdf file</h1>", @"C:\site\assets\");
AdvancedPDF.SaveAs("html-with-assets.pdf");
Dim Renderer = New ChromePdfRenderer()

' Add a header
Renderer.RenderingOptions.FirstPageNumber = 1 ' Use 2 if a cover page will be appended
Renderer.RenderingOptions.TextHeader.DrawDividerLine = True
Renderer.RenderingOptions.TextHeader.CenterText = "This is the header text"
Renderer.RenderingOptions.TextHeader.Font = IronPdf.Font.FontTypes.Helvetica
Renderer.RenderingOptions.TextHeader.FontSize = 12
Renderer.RenderingOptions.MarginTop = 25 ' Create 25mm space for header

' Add a footer too
Renderer.RenderingOptions.TextFooter.DrawDividerLine = True
Renderer.RenderingOptions.TextFooter.Font = IronPdf.Font.FontTypes.Arial
Renderer.RenderingOptions.TextFooter.FontSize = 12
Renderer.RenderingOptions.TextFooter.LeftText = "{date} {time}"
Renderer.RenderingOptions.TextFooter.RightText = "{page} of {total-pages}"
Renderer.RenderingOptions.MarginTop = 25 ' Create 25mm space for footer

Dim AdvancedPDF = Renderer.RenderHtmlAsPdf("<img src='logo.png'><h1>This is header and footer generated pdf file</h1>", "C:\site\assets\")
AdvancedPDF.SaveAs("html-with-assets.pdf")
$vbLabelText   $csharpLabel

O resultado é o seguinte:

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 6: Cabeçalho e rodapé do IronPDF

Cabeçalho e rodapé do IronPDF

4.2. Utilizando o Kit PDF Apitron

O Apitron PDF Kit cria PDFs convertendo conteúdo em formato de estrutura XML para PDF. No Apitron PDF Kit, cabeçalhos e rodapés podem ser adicionados usando as propriedades PageHeader e PageFooter. O código para fazer isso é o seguinte:

// Register document resources first
ResourceManager resourceManager = new ResourceManager();
resourceManager.RegisterResource(new Apitron.PDF.Kit.FixedLayout.Resources.XObjects.Image("logo", "../../data/logo.png"));

// Create the document
FlowDocument doc = new FlowDocument() { Margin = new Thickness(10) };

// Register styles
doc.StyleManager.RegisterStyle(".pageHeader", new Style() { Font = new Font(StandardFonts.TimesBold, 20) });
doc.StyleManager.RegisterStyle(".pageFooter", new Style() { Align = Align.Right });
doc.StyleManager.RegisterStyle("hr", new Style() { Height = 2, Margin = new Thickness(0, 5, 0, 5) });
doc.StyleManager.RegisterStyle(".content", new Style() { Align = Align.Left, Display = Display.InlineBlock });

// Fill the header section
doc.PageHeader.Class = "pageHeader";
doc.PageHeader.Add(new Image("logo") { Width = 100, Height = 50 });
doc.PageHeader.Add(new TextBlock("This document is intended for internal use only") { TextIndent = 20 });
doc.PageHeader.Add(new Hr());

// Fill the footer section
doc.PageFooter.Class = "pageFooter";
doc.PageFooter.Add(new Hr());
doc.PageFooter.Add(new TextBlock((ctx) => string.Format("Page {0} from&nbsp;", ctx.CurrentPage + 1)));
doc.PageFooter.Add(new PageCount(3) { Display = Display.Inline });

// Add pages
for (int i = 0; i < 2; ++i)
{
    doc.Add(new TextBlock("This is header and footer generation pdf file.") { Class = "content" });
    doc.Add(new PageBreak());
}

// Generate PDF
using (Stream stream = File.Create("out.pdf"))
{
    doc.Write(stream, resourceManager);
}

Process.Start("out.pdf");
// Register document resources first
ResourceManager resourceManager = new ResourceManager();
resourceManager.RegisterResource(new Apitron.PDF.Kit.FixedLayout.Resources.XObjects.Image("logo", "../../data/logo.png"));

// Create the document
FlowDocument doc = new FlowDocument() { Margin = new Thickness(10) };

// Register styles
doc.StyleManager.RegisterStyle(".pageHeader", new Style() { Font = new Font(StandardFonts.TimesBold, 20) });
doc.StyleManager.RegisterStyle(".pageFooter", new Style() { Align = Align.Right });
doc.StyleManager.RegisterStyle("hr", new Style() { Height = 2, Margin = new Thickness(0, 5, 0, 5) });
doc.StyleManager.RegisterStyle(".content", new Style() { Align = Align.Left, Display = Display.InlineBlock });

// Fill the header section
doc.PageHeader.Class = "pageHeader";
doc.PageHeader.Add(new Image("logo") { Width = 100, Height = 50 });
doc.PageHeader.Add(new TextBlock("This document is intended for internal use only") { TextIndent = 20 });
doc.PageHeader.Add(new Hr());

// Fill the footer section
doc.PageFooter.Class = "pageFooter";
doc.PageFooter.Add(new Hr());
doc.PageFooter.Add(new TextBlock((ctx) => string.Format("Page {0} from&nbsp;", ctx.CurrentPage + 1)));
doc.PageFooter.Add(new PageCount(3) { Display = Display.Inline });

// Add pages
for (int i = 0; i < 2; ++i)
{
    doc.Add(new TextBlock("This is header and footer generation pdf file.") { Class = "content" });
    doc.Add(new PageBreak());
}

// Generate PDF
using (Stream stream = File.Create("out.pdf"))
{
    doc.Write(stream, resourceManager);
}

Process.Start("out.pdf");
' Register document resources first
Dim resourceManager As New ResourceManager()
resourceManager.RegisterResource(New Apitron.PDF.Kit.FixedLayout.Resources.XObjects.Image("logo", "../../data/logo.png"))

' Create the document
Dim doc As New FlowDocument() With {.Margin = New Thickness(10)}

' Register styles
doc.StyleManager.RegisterStyle(".pageHeader", New Style() With {.Font = New Font(StandardFonts.TimesBold, 20)})
doc.StyleManager.RegisterStyle(".pageFooter", New Style() With {.Align = Align.Right})
doc.StyleManager.RegisterStyle("hr", New Style() With {
	.Height = 2,
	.Margin = New Thickness(0, 5, 0, 5)
})
doc.StyleManager.RegisterStyle(".content", New Style() With {
	.Align = Align.Left,
	.Display = Display.InlineBlock
})

' Fill the header section
doc.PageHeader.Class = "pageHeader"
doc.PageHeader.Add(New Image("logo") With {
	.Width = 100,
	.Height = 50
})
doc.PageHeader.Add(New TextBlock("This document is intended for internal use only") With {.TextIndent = 20})
doc.PageHeader.Add(New Hr())

' Fill the footer section
doc.PageFooter.Class = "pageFooter"
doc.PageFooter.Add(New Hr())
doc.PageFooter.Add(New TextBlock(Function(ctx) String.Format("Page {0} from&nbsp;", ctx.CurrentPage + 1)))
doc.PageFooter.Add(New PageCount(3) With {.Display = Display.Inline})

' Add pages
For i As Integer = 0 To 1
	doc.Add(New TextBlock("This is header and footer generation pdf file.") With {.Class = "content"})
	doc.Add(New PageBreak())
Next i

' Generate PDF
Using stream As Stream = File.Create("out.pdf")
	doc.Write(stream, resourceManager)
End Using

Process.Start("out.pdf")
$vbLabelText   $csharpLabel

O resultado é o seguinte:

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 7: Cabeçalho e rodapé Apitron

Cabeçalho e rodapé Apitron

5. Assinar PDF digitalmente

5.1. Usando o IronPDF

Uma das funcionalidades mais importantes do processamento de PDF é a capacidade de assinar um documento PDF digitalmente. O IronPDF fornece todas as ferramentas necessárias para isso.

using IronPdf;

// Cryptographically sign an existing PDF in 1 line of code!
new IronPdf.Signing.PdfSignature("Iron.p12", "123456").SignPdfFile("any.pdf");

/***** Advanced example for more control *****/

// 1. Create a PDF
var Renderer = new IronPdf.ChromePdfRenderer();
var doc = Renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>");

// 2. Create a Signature.
// You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.

var signature = new IronPdf.Signing.PdfSignature("Iron.pfx", "123456");

// 3. Handwritten signature graphic
signature.LoadSignatureImageFromFile("handwriting.png");

// 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.SignPdfWithDigitalSignature(signature);

// 5. The PDF is not signed until saved to file, stream or byte array.
doc.SaveAs("signed.pdf");
using IronPdf;

// Cryptographically sign an existing PDF in 1 line of code!
new IronPdf.Signing.PdfSignature("Iron.p12", "123456").SignPdfFile("any.pdf");

/***** Advanced example for more control *****/

// 1. Create a PDF
var Renderer = new IronPdf.ChromePdfRenderer();
var doc = Renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>");

// 2. Create a Signature.
// You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.

var signature = new IronPdf.Signing.PdfSignature("Iron.pfx", "123456");

// 3. Handwritten signature graphic
signature.LoadSignatureImageFromFile("handwriting.png");

// 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.SignPdfWithDigitalSignature(signature);

// 5. The PDF is not signed until saved to file, stream or byte array.
doc.SaveAs("signed.pdf");
Imports IronPdf

' Cryptographically sign an existing PDF in 1 line of code!
Call (New IronPdf.Signing.PdfSignature("Iron.p12", "123456")).SignPdfFile("any.pdf")

'''*** Advanced example for more control ****

' 1. Create a PDF
Dim Renderer = New IronPdf.ChromePdfRenderer()
Dim doc = Renderer.RenderHtmlAsPdf("<h1>Testing 2048 bit digital security</h1>")

' 2. Create a Signature.
' You may create a .pfx or .p12 PDF signing certificate using Adobe Acrobat Reader.

Dim signature = New IronPdf.Signing.PdfSignature("Iron.pfx", "123456")

' 3. Handwritten signature graphic
signature.LoadSignatureImageFromFile("handwriting.png")

' 4. Sign the PDF with the PdfSignature. Multiple signing certificates may be used
doc.SignPdfWithDigitalSignature(signature)

' 5. The PDF is not signed until saved to file, stream or byte array.
doc.SaveAs("signed.pdf")
$vbLabelText   $csharpLabel

5.2 Utilizando o Kit PDF Apitron

A inserção de uma assinatura em um PDF usando o Apitron PDF Kit é um processo longo e técnico.

static void Main(string[] args)
{
    string fileName = "signedTwice.pdf";

    using (Stream stream = File.Create(fileName))
    {
        FlowDocument doc = new FlowDocument() { Margin = new Thickness(10) };
        doc.Add(new TextBlock("Signed using Apitron PDF Kit for .NET"));
        doc.Write(stream, new ResourceManager());
    }

    // Save
    Sign(fileName, "../../data/certs/JohnDoe.pfx", "password", "../../data/images/signatureImage.png", new Boundary(10, 750, 110, 800));
}

// Implementation of Sign Method
private static void Sign(string pathToDocument, string pathToCertificate, string password, string pathToSignatureImage, Boundary signatureViewLocation)
{
    // Open existing document and sign once
    using (Stream inputStream = new FileStream(pathToDocument, FileMode.Open, FileAccess.ReadWrite))
    {
        using (FixedDocument doc = new FixedDocument(inputStream))
        {
            string imageResourceId = Guid.NewGuid().ToString("N");
            string signatureFieldId = Guid.NewGuid().ToString("N");

            // Register signature image resource
            doc.ResourceManager.RegisterResource(new Image(imageResourceId, pathToSignatureImage));

            // Create first signature field and initialize it using a stored certificate
            SignatureField signatureField = new SignatureField(signatureFieldId);
            using (Stream signatureDataStream = File.OpenRead(pathToCertificate))
            {
                signatureField.Signature = Signature.Create(new Pkcs12Store(signatureDataStream, password));
            }

            // Add signature fields to the document
doc.AcroForm.Fields.Add(signatureField);

            // Create first signature view using the image resource
            SignatureFieldView signatureView = new SignatureFieldView(signatureField, signatureViewLocation);
            signatureView.ViewSettings.Graphic = Graphic.Image;
            signatureView.ViewSettings.GraphicResourceID = imageResourceId;
            signatureView.ViewSettings.Description = Description.None;

            // Add views to page annotations collection
doc.Pages[0].Annotations.Add(signatureView);

            // Save as incremental update
doc.Save();
        }
    }
}
static void Main(string[] args)
{
    string fileName = "signedTwice.pdf";

    using (Stream stream = File.Create(fileName))
    {
        FlowDocument doc = new FlowDocument() { Margin = new Thickness(10) };
        doc.Add(new TextBlock("Signed using Apitron PDF Kit for .NET"));
        doc.Write(stream, new ResourceManager());
    }

    // Save
    Sign(fileName, "../../data/certs/JohnDoe.pfx", "password", "../../data/images/signatureImage.png", new Boundary(10, 750, 110, 800));
}

// Implementation of Sign Method
private static void Sign(string pathToDocument, string pathToCertificate, string password, string pathToSignatureImage, Boundary signatureViewLocation)
{
    // Open existing document and sign once
    using (Stream inputStream = new FileStream(pathToDocument, FileMode.Open, FileAccess.ReadWrite))
    {
        using (FixedDocument doc = new FixedDocument(inputStream))
        {
            string imageResourceId = Guid.NewGuid().ToString("N");
            string signatureFieldId = Guid.NewGuid().ToString("N");

            // Register signature image resource
            doc.ResourceManager.RegisterResource(new Image(imageResourceId, pathToSignatureImage));

            // Create first signature field and initialize it using a stored certificate
            SignatureField signatureField = new SignatureField(signatureFieldId);
            using (Stream signatureDataStream = File.OpenRead(pathToCertificate))
            {
                signatureField.Signature = Signature.Create(new Pkcs12Store(signatureDataStream, password));
            }

            // Add signature fields to the document
doc.AcroForm.Fields.Add(signatureField);

            // Create first signature view using the image resource
            SignatureFieldView signatureView = new SignatureFieldView(signatureField, signatureViewLocation);
            signatureView.ViewSettings.Graphic = Graphic.Image;
            signatureView.ViewSettings.GraphicResourceID = imageResourceId;
            signatureView.ViewSettings.Description = Description.None;

            // Add views to page annotations collection
doc.Pages[0].Annotations.Add(signatureView);

            // Save as incremental update
doc.Save();
        }
    }
}
Imports System
Imports System.IO
Imports Apitron.PDF.Rasterizer
Imports Apitron.PDF.Kit.FixedLayout
Imports Apitron.PDF.Kit
Imports Apitron.PDF.Kit.Styles
Imports Apitron.PDF.Kit.Signatures
Imports Apitron.PDF.Kit.Interactive.Annotations

Module Module1
    Sub Main(args As String())
        Dim fileName As String = "signedTwice.pdf"

        Using stream As Stream = File.Create(fileName)
            Dim doc As New FlowDocument() With {.Margin = New Thickness(10)}
            doc.Add(New TextBlock("Signed using Apitron PDF Kit for .NET"))
            doc.Write(stream, New ResourceManager())
        End Using

        ' Save
        Sign(fileName, "../../data/certs/JohnDoe.pfx", "password", "../../data/images/signatureImage.png", New Boundary(10, 750, 110, 800))
    End Sub

    ' Implementation of Sign Method
    Private Sub Sign(pathToDocument As String, pathToCertificate As String, password As String, pathToSignatureImage As String, signatureViewLocation As Boundary)
        ' Open existing document and sign once
        Using inputStream As Stream = New FileStream(pathToDocument, FileMode.Open, FileAccess.ReadWrite)
            Using doc As New FixedDocument(inputStream)
                Dim imageResourceId As String = Guid.NewGuid().ToString("N")
                Dim signatureFieldId As String = Guid.NewGuid().ToString("N")

                ' Register signature image resource
                doc.ResourceManager.RegisterResource(New Image(imageResourceId, pathToSignatureImage))

                ' Create first signature field and initialize it using a stored certificate
                Dim signatureField As New SignatureField(signatureFieldId)
                Using signatureDataStream As Stream = File.OpenRead(pathToCertificate)
                    signatureField.Signature = Signature.Create(New Pkcs12Store(signatureDataStream, password))
                End Using

                ' Add signature fields to the document
                doc.AcroForm.Fields.Add(signatureField)

                ' Create first signature view using the image resource
                Dim signatureView As New SignatureFieldView(signatureField, signatureViewLocation)
                signatureView.ViewSettings.Graphic = Graphic.Image
                signatureView.ViewSettings.GraphicResourceID = imageResourceId
                signatureView.ViewSettings.Description = Description.None

                ' Add views to page annotations collection
                doc.Pages(0).Annotations.Add(signatureView)

                ' Save as incremental update
                doc.Save()
            End Using
        End Using
    End Sub
End Module
$vbLabelText   $csharpLabel

O resultado é praticamente o mesmo para as bibliotecas. É possível perceber claramente que o IronPDF é mais fácil e conveniente para manipular conteúdo em PDF. O PDF gerado é assinado com o certificado e a assinatura impressos nele.

Utilizando Bootstrap 5 com IronPDF para Galerias de Portfólio

O mecanismo de renderização Chrome V8 do IronPDF oferece suporte completo aos componentes modernos do Bootstrap 5, permitindo que você gere documentos PDF visualmente impressionantes com galerias de portfólio profissionais. Este exemplo demonstra layouts em grade, efeitos de foco, sobreposições de gradiente e emblemas de categoria - recursos que seriam difíceis de implementar com bibliotecas PDF tradicionais como o Apitron PDF SDK.

using IronPdf;

var renderer = new ChromePdfRenderer();

string portfolioGallery = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .gallery-item {
            position: relative;
            overflow: hidden;
            border-radius: 10px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
        }
        .gallery-item img {
            width: 100%;
            height: 250px;
            object-fit: cover;
            transition: transform 0.3s;
        }
        .gallery-item:hover img {
            transform: scale(1.1);
        }
        .gallery-overlay {
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
            background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
            padding: 20px;
            color: white;
        }
        .category-badge {
            position: absolute;
            top: 10px;
            right: 10px;
        }
        @media print {
            .gallery-item { page-break-inside: avoid; }
        }
    </style>
</head>
<body>
    <div class='container py-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4'>Design Portfolio</h1>
            <p class='lead text-muted'>Showcase of PDF Document Designs</p>
        </div>

        <div class='row mb-4'>
            <div class='col-12'>
                <div class='btn-group' role='group'>
                    <button class='btn btn-primary'>All Projects</button>
                    <button class='btn btn-outline-primary'>Invoices</button>
                    <button class='btn btn-outline-primary'>Reports</button>
                    <button class='btn btn-outline-primary'>Forms</button>
                    <button class='btn btn-outline-primary'>Certificates</button>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-primary category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📄</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Professional Invoice Template</h5>
                        <small>Corporate billing with itemized details</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-success category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📊</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Analytics Dashboard Report</h5>
                        <small>Data visualization and metrics</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-warning category-badge'>Certificate</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>🏆</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Award Certificate</h5>
                        <small>Professional achievement recognition</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-info category-badge'>Form</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #fa709a 0%, #fee140 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📝</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Application Form</h5>
                        <small>Multi-page data collection</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-danger category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #30cfd0 0%, #330867 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>💰</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Payment Receipt</h5>
                        <small>Transaction confirmation document</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-secondary category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📈</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Financial Statement</h5>
                        <small>Quarterly performance overview</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='text-center mt-5'>
            <p class='text-muted'>All templates rendered with IronPDF's Chromium engine</p>
            <div class='d-flex justify-content-center gap-2'>
                <span class='badge bg-primary'>Bootstrap 5</span>
                <span class='badge bg-success'>Responsive</span>
                <span class='badge bg-info'>Print-Ready</span>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(portfolioGallery);
pdf.SaveAs("portfolio-gallery.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string portfolioGallery = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .gallery-item {
            position: relative;
            overflow: hidden;
            border-radius: 10px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
        }
        .gallery-item img {
            width: 100%;
            height: 250px;
            object-fit: cover;
            transition: transform 0.3s;
        }
        .gallery-item:hover img {
            transform: scale(1.1);
        }
        .gallery-overlay {
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
            background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
            padding: 20px;
            color: white;
        }
        .category-badge {
            position: absolute;
            top: 10px;
            right: 10px;
        }
        @media print {
            .gallery-item { page-break-inside: avoid; }
        }
    </style>
</head>
<body>
    <div class='container py-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4'>Design Portfolio</h1>
            <p class='lead text-muted'>Showcase of PDF Document Designs</p>
        </div>

        <div class='row mb-4'>
            <div class='col-12'>
                <div class='btn-group' role='group'>
                    <button class='btn btn-primary'>All Projects</button>
                    <button class='btn btn-outline-primary'>Invoices</button>
                    <button class='btn btn-outline-primary'>Reports</button>
                    <button class='btn btn-outline-primary'>Forms</button>
                    <button class='btn btn-outline-primary'>Certificates</button>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-primary category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📄</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Professional Invoice Template</h5>
                        <small>Corporate billing with itemized details</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-success category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📊</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Analytics Dashboard Report</h5>
                        <small>Data visualization and metrics</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-warning category-badge'>Certificate</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>🏆</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Award Certificate</h5>
                        <small>Professional achievement recognition</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-info category-badge'>Form</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #fa709a 0%, #fee140 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📝</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Application Form</h5>
                        <small>Multi-page data collection</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-danger category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #30cfd0 0%, #330867 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>💰</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Payment Receipt</h5>
                        <small>Transaction confirmation document</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-secondary category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📈</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Financial Statement</h5>
                        <small>Quarterly performance overview</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='text-center mt-5'>
            <p class='text-muted'>All templates rendered with IronPDF's Chromium engine</p>
            <div class='d-flex justify-content-center gap-2'>
                <span class='badge bg-primary'>Bootstrap 5</span>
                <span class='badge bg-success'>Responsive</span>
                <span class='badge bg-info'>Print-Ready</span>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(portfolioGallery);
pdf.SaveAs("portfolio-gallery.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim portfolioGallery As String = "
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .gallery-item {
            position: relative;
            overflow: hidden;
            border-radius: 10px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
        }
        .gallery-item img {
            width: 100%;
            height: 250px;
            object-fit: cover;
            transition: transform 0.3s;
        }
        .gallery-item:hover img {
            transform: scale(1.1);
        }
        .gallery-overlay {
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
            background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
            padding: 20px;
            color: white;
        }
        .category-badge {
            position: absolute;
            top: 10px;
            right: 10px;
        }
        @media print {
            .gallery-item { page-break-inside: avoid; }
        }
    </style>
</head>
<body>
    <div class='container py-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4'>Design Portfolio</h1>
            <p class='lead text-muted'>Showcase of PDF Document Designs</p>
        </div>

        <div class='row mb-4'>
            <div class='col-12'>
                <div class='btn-group' role='group'>
                    <button class='btn btn-primary'>All Projects</button>
                    <button class='btn btn-outline-primary'>Invoices</button>
                    <button class='btn btn-outline-primary'>Reports</button>
                    <button class='btn btn-outline-primary'>Forms</button>
                    <button class='btn btn-outline-primary'>Certificates</button>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-primary category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📄</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Professional Invoice Template</h5>
                        <small>Corporate billing with itemized details</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-success category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📊</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Analytics Dashboard Report</h5>
                        <small>Data visualization and metrics</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-warning category-badge'>Certificate</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>🏆</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Award Certificate</h5>
                        <small>Professional achievement recognition</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-info category-badge'>Form</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #fa709a 0%, #fee140 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📝</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Application Form</h5>
                        <small>Multi-page data collection</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-danger category-badge'>Invoice</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #30cfd0 0%, #330867 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>💰</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Payment Receipt</h5>
                        <small>Transaction confirmation document</small>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='gallery-item'>
                    <span class='badge bg-secondary category-badge'>Report</span>
                    <svg width='100%' height='250' style='background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)'>
                        <text x='50%' y='50%' text-anchor='middle' fill='white' font-size='48' opacity='0.3'>📈</text>
                    </svg>
                    <div class='gallery-overlay'>
                        <h5 class='mb-1'>Financial Statement</h5>
                        <small>Quarterly performance overview</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='text-center mt-5'>
            <p class='text-muted'>All templates rendered with IronPDF's Chromium engine</p>
            <div class='d-flex justify-content-center gap-2'>
                <span class='badge bg-primary'>Bootstrap 5</span>
                <span class='badge bg-success'>Responsive</span>
                <span class='badge bg-info'>Print-Ready</span>
            </div>
        </div>
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(portfolioGallery)
pdf.SaveAs("portfolio-gallery.pdf")
$vbLabelText   $csharpLabel

Este código gera um portfólio profissional em PDF com um layout de grade responsivo, emblemas visuais de categoria, sobreposições de gradiente e efeitos de foco. O mecanismo de renderização do Chrome preserva todos os estilos do Bootstrap, layouts CSS Grid e propriedades CSS personalizadas – recursos que as bibliotecas de PDF tradicionais têm dificuldade em replicar.

Principais vantagens em relação ao SDK PDF da Apitron:

  • Suporte nativo ao Bootstrap 5 sem conversão
  • Os layouts CSS Grid e Flexbox são renderizados perfeitamente.
  • Fundos gradientes e efeitos CSS modernos
  • Código mais simples com saída de maior qualidade

Para um guia completo sobre geração de PDFs com Bootstrap, consulte o Guia de HTML para PDF com Bootstrap .

6. Preços e Licenciamento

Preços e licenciamento do IronPDF

IronPDF é uma biblioteca C# gratuita para desenvolvimento e que pode ser licenciada para uso comercial a qualquer momento. Licenças de projeto para desenvolvedores individuais, agências e organizações multinacionais, bem como para redistribuição SaaS e OEM, estão disponíveis. Todas as licenças oferecem garantia de reembolso de 30 dias, um ano de suporte e atualizações, validade para desenvolvimento/teste/produção e licença perpétua (compra única).

O pacote Lite está disponível para $799 sem custos recorrentes. Mais detalhes e assistência para escolher a melhor licença estão disponíveis na página de licenciamento do produto IronPDF .

A Comparison of IronPDF with Apitron PDF SDK .NET - Figure 8: Licenciamento IronPDF

Licenciamento IronPDF

Preços e licenciamento do kit Apitron PDF

Existem dois sistemas de licenciamento atualmente em uso: o Moderno e o Legado. Se você já possui uma licença, o regime de licenciamento legado permanecerá ativo até que sua licença expire. Em seguida, você precisa entrar em contato com o suporte ao cliente para realizar a transição. O regime de licenciamento moderno aplica-se a si apenas se for um novo cliente.

No sistema atual, existem três níveis de licenciamento:

  • Avaliação - período de avaliação de três meses para utilização de um produto totalmente funcional. Basta baixar o pacote do NuGet e começar a desenvolver.
  • Comunidade - Utilize produtos totalmente funcionais sem quaisquer custos em seus projetos não comerciais. É necessária aprovação.
  • Comercial - qualquer caso de uso não descrito acima. O preço depende do padrão de uso.

Conclusão

A biblioteca IronPDF cria PDFs com qualidade de imagem perfeita a partir de documentos como HTML, JS, CSS, JPG, PNG, GIF e SVG. O mecanismo Chromium ajuda a renderizar arquivos HTML ou URLs para gerar PDFs perfeitos como resultado.

O Apitron permite criar PDFs usando uma API de layout fixo, implementada para ser 100% compatível com a especificação PDF. Como um método de geração de conteúdo orientado a estilo, semelhante a HTML e CSS, esta API de layout fixo oferece a capacidade de criar relatórios, faturas, catálogos e muito mais impressionantes em minutos. Também oferece suporte à criação de modelos XML.

Os preços de licenciamento do Apitron PDF não estão disponíveis no site. Você precisa entrar em contato com o suporte e solicitar um orçamento com base no seu uso. Por outro lado, o IronPDF apresenta um pacote de licenciamento muito claro em seu site. Isso faz com que o IronPDF se destaque de seus concorrentes e permite que os usuários escolham de forma consciente, de acordo com suas necessidades.

Com o IronPDF, você pode trabalhar com arquivos PDF com mais facilidade do que com o Apitron PDF. O IronPDF permite que seus usuários escrevam menos linhas de código para tarefas complexas com PDFs. O IronPDF oferece vários métodos para gerar PDFs a partir de diversos tipos de arquivo, enquanto o Apitron só consegue converter documentos XML em documentos PDF. Em comparação com o Apitron, o IronPDF permite obter resultados perfeitos sem a necessidade de opções técnicas adicionais.

Todos os clientes da Iron Software têm a opção de adquirir os cinco produtos da empresa pelo preço de dois deles. Experimente o IronPDF gratuitamente por 30 dias para testar todas as suas funcionalidades. Adquira o pacote completo de produtos Iron Software em IronSoftware.com .

ObserveApitron PDF Kit é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pelo Apitron PDF Kit. 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 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 recursos o IronPDF oferece para a criação de PDFs?

O IronPDF permite criar PDFs a partir de HTML, CSS e JavaScript, carregar URLs, extrair texto e gráficos, mesclar PDFs e muito mais. É compatível com .NET Core, Azure, AWS, Docker, Linux e Windows.

Como posso assinar digitalmente um PDF em C#?

Com o IronPDF, você pode assinar PDFs digitalmente usando um certificado de assinatura PDF, que pode ser integrado com algumas linhas de código.

Quais são as opções de instalação do IronPDF?

O IronPDF pode ser instalado usando o Gerenciador de Pacotes NuGet, o Prompt de Comando do Desenvolvedor ou baixando o pacote NuGet ou a biblioteca IronPDF .DLL diretamente.

Existe alguma versão gratuita disponível para o IronPDF?

Sim, o IronPDF oferece uma versão gratuita para desenvolvimento, além de licenças comerciais. Informações detalhadas sobre preços, incluindo uma garantia de reembolso de 30 dias, estão disponíveis no site deles.

Como o Apitron PDF Kit lida com a conversão de HTML para PDF?

O Apitron PDF Kit não suporta a conversão direta de HTML para PDF, mas pode converter arquivos XML para PDF.

Quais são as características mais marcantes do Apitron PDF Kit?

O Apitron PDF Kit permite manipulação abrangente de PDFs, incluindo adição de imagens, desenhos, textos, assinatura de documentos e mesclagem ou divisão de PDFs. No entanto, não oferece conversão direta de HTML para PDF.

Como adicionar cabeçalhos e rodapés a um PDF em C#?

O IronPDF permite adicionar cabeçalhos e rodapés a PDFs facilmente usando métodos como AddTextHeader e AddTextFooter .

Quais são as opções de licenciamento disponíveis para o Apitron PDF Kit?

O Apitron PDF Kit oferece um período de avaliação de três meses e uma licença comunitária para projetos não comerciais. Para uso comercial, é necessário entrar em contato diretamente com a empresa para obter orçamentos.

Qual biblioteca de PDF é mais fácil de usar para desenvolvimento em .NET?

O IronPDF é geralmente mais fácil de usar para desenvolvimento .NET, fornecendo uma API mais direta e exigindo menos linhas de código para tarefas complexas em comparação com o Apitron PDF Kit.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

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