IRONSOFTWAREHOME
VÍDEOS

Como rasterizar um PDF para imagem em C#

Curtis Chau
Curtis Chau
Updated: 19 de julho de 2026

A migração do jsreport para o IronPDF transforma seu fluxo de trabalho de PDF em .NET , de um sistema dependente de Node.js com gerenciamento de binários externos e processos de servidor separados, para uma biblioteca .NET pura que é executada inteiramente no mesmo processo. Este guia fornece um caminho de migração abrangente, passo a passo, que elimina a complexidade da infraestrutura e os requisitos de modelos JavaScript para desenvolvedores .NET profissionais.

Por que migrar do jsreport para o IronPDF?

Os desafios do jsreport

O jsreport introduz uma complexidade que não pertence a um ambiente .NET puro:

  1. Dependência do Node.js : Requer o ambiente de execução e os binários do Node.js , adicionando complexidade à infraestrutura do que deveria ser uma aplicação .NET simples.

  2. Gestão Externa de Binários: É necessário baixar e gerenciar binários específicos da plataforma para Windows, Linux e OSX através de pacotes NuGet separados (jsreport.Binary, jsreport.Binary.Linux, jsreport.Binary.OSX).

  3. Processo de Servidor Separado: Funciona como uma utilidade ou servidor web — é necessário um gerenciamento adicional de processos com os métodos de ciclo de vida StartAsync() e KillAsync().

  4. Modelagem em JavaScript : Força o aprendizado de Handlebars, JsRender ou outros sistemas de modelagem em JavaScript em vez de usar os recursos nativos do C#.

  5. Estrutura de Solicitação Complexa: Requer objetos RenderRequest verbosos com configurações Template aninhadas até mesmo para geração simples de PDF.

  6. Limitações de Licenciamento: O nível gratuito está limitado a 5 templates por instância; o uso comercial além disso requer uma licença Enterprise ($395/ano por instância) ou Enterprise Scale ($1,295/ano, isento de royalties em todas as instâncias). See jsreport.net/buy.

  7. Saída baseada em fluxo: Retorna fluxos que exigem operações manuais em arquivos e gerenciamento de fluxos de memória.

Comparação entre jsreport e IronPDF

RecursojsreportIronPDF
Tempo de execuçãoNode.js + .NET.NET puro
Gerenciamento BinárioManual (pacotes jsreport.Binary)Automático
Processo do servidorRequerido (servidor utilitário ou web)Em andamento
ModelagemJavaScript (Handlebars, etc.)C# (Razor, interpolação de strings)
Estilo APIObjetos de solicitação detalhadosMétodos limpos e fluentes
SaídaFluxoObjeto PdfDocument
Manipulação de PDFLimitadoExtenso (mesclar, dividir, editar)
Suporte assíncronoSomente assíncronoTanto síncrono quanto assíncrono

Para equipes planejando adoção do .NET 10 e C# 14, o IronPDF fornece uma base nativa do .NET sem dependências de runtime externas.


Avaliação da Complexidade da Migração

Esforço estimado por funcionalidade

RecursoComplexidade da Migração
HTML para PDFMuito baixo
URL para PDFMuito baixo
Cabeçalhos/RodapésBaixo
Configurações da páginaBaixo
Ciclo de vida do servidorBaixo
Gerenciamento BinárioBaixo

Mudança de paradigma

A mudança fundamental nesta migração do jsreport é a substituição de objetos de requisição verbosos com gerenciamento de servidor por chamadas de método simples em processo:

jsreport: LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) → Fluxo → File
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
Text

Antes de começar

Pré-requisitos

  1. Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
  3. Licença do IronPDF: Obtenha sua chave de licença em IronPDF

Alterações no pacote NuGet

# Remove jsreport packages
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
dotnet remove package jsreport.Local
dotnet remove package jsreport.Types
dotnet remove package jsreport.Client

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuração de licença

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Identificar o uso do jsreport

# Find all jsreport references
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
SHELL

Referência completa da API

Mapeamentos de Classes

Classe jsreportEquivalente ao IronPDF
LocalReportingChromePdfRenderer
ReportingServiceChromePdfRenderer
RenderRequestParâmetros do método
TemplateParâmetros do método
ChromeRenderingOptions
ReportPdfDocument
Engine(não é necessário)

Mapeamentos de Métodos

Método jsreportEquivalente ao IronPDF
LocalReporting().UseBinary().AsUtility().Create()new ChromePdfRenderer()
rs.RenderAsync(request)renderer.RenderHtmlAsPdf(html)
rs.StartAsync()(não é necessário)
rs.KillAsync()(não é necessário)
report.Content.CopyTo(stream)pdf.SaveAs(path) ou pdf.BinaryData

Mapeamentos de propriedades de solicitação de renderização

Propriedade do modelo jsreportEquivalente ao IronPDF
Template.ContentPrimeiro parâmetro para RenderHtmlAsPdf()
Template.Recipe = Recipe.ChromePdf(não é necessário)
Template.Engine = Engine.None(não é necessário)
Chrome.HeaderTemplateRenderingOptions.TextHeader ou HtmlHeader
Chrome.FooterTemplateRenderingOptions.TextFooter ou HtmlFooter
Chrome.DisplayHeaderFooter(automático)
Chrome.MarginTopRenderingOptions.MarginTop

Mapeamentos de espaços reservados (cabeçalhos/rodapés)

jsreport - Espaço reservadoEspaço reservado para IronPDF
<span class='pageNumber'></span>{page}
<span class='totalPages'></span>{total-pages}
{#pageNum}{page}
{#numPages}{total-pages}
{#timestamp}{date}

Exemplos de migração de código

Exemplo 1: HTML básico para PDF

Antes (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<h1>Hello from jsreport</h1><p>This is a PDF document.</p>"
            }
        });

        using (var fileStream = File.Create("output.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("PDF created successfully!");
    }
}

Após (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully!");
    }
}

A abordagem jsreport requer três pacotes NuGet (jsreport.Binary, jsreport.Local, jsreport.Types), três importações de namespace, execução apenas assíncrona, uma cadeia de builder fluente (LocalReporting().UseBinary().AsUtility().Create()), um RenderRequest verboso com objeto Template aninhado especificando Recipe e Engine, e cópia manual de fluxo para arquivo com um bloco using.

O IronPDF reduz isso a um pacote NuGet , um namespace, três linhas de código e execução síncrona. O método ChromePdfRenderer.RenderHtmlAsPdf() aceita HTML diretamente e retorna um PdfDocument com um método SaveAs() simples. Consulte a documentação de conversão de HTML para PDF para obter opções de renderização adicionais.

Exemplo 2: URL para PDF

Antes (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<html><body><script>window.location='https://example.com';</script></body></html>"
            }
        });

        using (var fileStream = File.Create("webpage.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("Webpage PDF created successfully!");
    }
}

Após (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("Webpage PDF created successfully!");
    }
}

jsreport pode renderizar uma URL configurando Chrome.Url na solicitação, mas não há um método de conveniência de nível superior — e um padrão comum em código existente é a solução de redirecionamento JavaScript (window.location='https://example.com') mostrada acima, que pode falhar em sites que bloqueiam navegação por script.

IronPDF fornece um método RenderUrlAsPdf() dedicado que leva a URL como argumento direto, com execução completa de JavaScript e suporte moderno a CSS. Saiba mais sobre a conversão de URL para PDF .

Exemplo 3: PDF com cabeçalhos e rodapés

Antes (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<h1>Document with Header and Footer</h1><p>Main content goes here.</p>",
                Chrome = new Chrome()
                {
                    DisplayHeaderFooter = true,
                    HeaderTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Custom Header</div>",
                    FooterTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></div>"
                }
            }
        });

        using (var fileStream = File.Create("document_with_headers.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}

Após (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Custom Header",
            FontSize = 10
        };
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page} of {total-pages}",
            FontSize = 10
        };
        
        var pdf = renderer.RenderHtmlAsPdf("<h1>Document with Header and Footer</h1><p>Main content goes here.</p>");
        pdf.SaveAs("document_with_headers.pdf");
        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}

A abordagem jsreport requer adicionar um objeto Chrome ao Template, configurando DisplayHeaderFooter = true e usando templates HTML com substitutos de classes CSS especiais (<span class='pageNumber'></span>, <span class='totalPages'></span>). Os modelos de cabeçalho e rodapé devem incluir estilos embutidos completos.

IronPDF fornece uma configuração TextHeaderFooter mais limpa com propriedades dedicadas para CenterText, LeftText, RightText e FontSize. Substitutos de número de página usam a sintaxe mais simples {page} e {total-pages}. Consulte a documentação sobre cabeçalhos e rodapés para obter opções de cabeçalho HTML.


Notas críticas sobre migração

Elimine o gerenciamento do ciclo de vida do servidor

O jsreport requer gerenciamento explícito do ciclo de vida do servidor:

// jsreport (DELETE THIS):
var rs = new LocalReporting()
    .UseBinary(JsReportBinary.GetBinary())
    .AsUtility()
    .Create();

// Or for web server mode:
var rs = new LocalReporting()
    .UseBinary(JsReportBinary.GetBinary())
    .AsWebServer()
    .Create();

await rs.StartAsync();
// ... use rs ...
await rs.KillAsync();

O IronPDF é executado inteiramente no mesmo processo — sem inicialização de servidor, sem gerenciamento de processos, sem limpeza:

// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed

Remover pacotes binários específicos da plataforma

O jsreport requer pacotes NuGet separados para cada plataforma de destino:

# DELETE these platform-specific packages:
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
SHELL

O IronPDF lida automaticamente com todos os requisitos da plataforma por meio de um único pacote NuGet .

Atualizar sintaxe do marcador de posição

O jsreport usa marcadores de posição baseados em classes CSS ou chaves. O IronPDF usa uma sintaxe diferente:

// jsreport placeholders:
"<span class='pageNumber'></span>"  // or {#pageNum}
"<span class='totalPages'></span>"  // or {#numPages}

//IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"

Substituir Handlebars com Interpolação de Strings C#

jsreport frequentemente usa templatização Handlebars com Engine.Handlebars:

// jsreport Handlebars (DELETE THIS):
Template = new Template
{
    Content = "<h1>Hello, {{name}}</h1>",
    Engine = Engine.Handlebars
},
Data = new { name = "World" }

//IronPDF with C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
C#

Simplifique o gerenciamento de fluxos

O jsreport retorna um fluxo que requer cópia manual:

// jsreport stream handling (DELETE THIS):
using (var fileStream = File.Create("output.pdf"))
{
    report.Content.CopyTo(fileStream);
}

// Or for byte array:
using (var memoryStream = new MemoryStream())
{
    await report.Content.CopyToAsync(memoryStream);
    return memoryStream.ToArray();
}

//IronPDF direct access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;

Solução de problemas

Problema 1: Relatório Local não encontrado

Problema: Referências de código para a classe LocalReporting que não existe no IronPDF.

Solução: Substitua por ChromePdfRenderer:

// jsreport
var rs = new LocalReporting().UseBinary().AsUtility().Create();

// IronPDF
var renderer = new ChromePdfRenderer();

Problema 2: Solicitação de renderização não encontrada

Problema: O código usa objetos wrapper RenderRequest e Template.

Solução: Passe o HTML diretamente para os métodos de renderização:

// jsreport
await rs.RenderAsync(new RenderRequest { Template = new Template { Content = html } });

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);

Problema 3: Números de página não aparecem

Problema: Usando a sintaxe de substituto jsreport <span class='pageNumber'></span>.

Solução: Atualize para a sintaxe de marcador de posição do IronPDF:

// jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"

//IronPDF syntax
"Page {page} of {total-pages}"

Problema 4: JsReportBinary não encontrado

Problema: Referências de código para JsReportBinary.GetBinary().

Solução: Exclua completamente — o IronPDF não requer binários externos:

// DELETE this jsreport pattern:
.UseBinary(JsReportBinary.GetBinary())

//IronPDF needs nothing—just create the renderer:
var renderer = new ChromePdfRenderer();

Lista de verificação para migração

Pré-migração

  • Identifique todas as instruções jsreport using
  • Listar modelos usando Handlebars/JsRender (converter para interpolação de strings em C#)
  • Documente as opções atuais do Chrome utilizadas (margens, tamanho do papel)
  • Verifique se o modo de servidor web está ativado ou se é um modo utilitário (ambos são executados no mesmo processo).
  • Observe os pacotes binários específicos da plataforma (exclua todos)
  • Obtenha a chave de licença do IronPDF

Alterações no pacote

  • Remova o pacote jsreport.Binary
  • Remova o pacote jsreport.Binary.Linux
  • Remova o pacote jsreport.Binary.OSX
  • Remova o pacote jsreport.Local
  • Remova o pacote jsreport.Types
  • Remova o pacote jsreport.Client
  • Instale o pacote IronPdf

Alterações no código

  • Adicionar configuração de chave de licença na inicialização
  • Substitua LocalReporting por ChromePdfRenderer
  • Remova o wrapper RenderRequest
  • Remova o wrapper Template
  • Atualize a sintaxe de substituto (<span class='pageNumber'>{page})
  • Substituir Handlebars por interpolação de strings em C#
  • Remova as chamadas StartAsync() / KillAsync()
  • Substitua a cópia de fluxo por BinaryData ou SaveAs()

Testando

  • Testar todos os caminhos de geração de PDF
  • Verificar a renderização do cabeçalho/rodapé
  • Verifique a numeração das páginas.
  • Validar espaçamento das margens
  • Teste com páginas CSS/JavaScript complexas
  • Desempenho de referência

Pós-migração

  • Excluir arquivos binários do jsreport
  • Remova as dependências do Node.js, caso não sejam mais necessárias.
  • Atualizar scripts de implantação
  • Atualizar documentação

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

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

...
Leia mais

Artigos relacionados

Key in blue circle

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

Your trial license will be sent to your email address

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

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

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

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