Saltar al pie de página
GUíAS DE MIGRACIóN

Cómo migrar de BitMiracle Docotic PDF a IronPDF en C#

Migrar de BitMiracle Docotic PDFa IronPDF: Guía completa de migración a C

BitMiracle Docotic PDF es una reputada biblioteca PDF .NET conocida por su arquitectura de código 100% gestionado y sus amplias capacidades de manipulación programática de PDF. Sin embargo, su estructura modular de complementos, que requiere paquetes independientes para la conversión de HTML a PDF, las funciones de diseño y otras funcionalidades, añade complejidad a la gestión de proyectos y la concesión de licencias. Esta completa guía proporciona una ruta de migración paso a paso de BitMiracle Docotic PDFa IronPDF, una biblioteca PDF .NET unificada con renderizado HTML basado en Chromium integrado y todas las funciones incluidas en un único paquete NuGet.

¿Por qué migrar de BitMiracle Docotic PDFa IronPDF?

Aunque BitMiracle Docotic PDFofrece sólidas funciones de manipulación de PDF, varios factores llevan a los equipos de desarrollo a buscar alternativas con una arquitectura más racionalizada.

Comparación de arquitecturas de paquetes

BitMiracle Docotic PDF utiliza un enfoque de complemento modular que requiere varios paquetes para una funcionalidad completa:

AspectoBitMiracle Docotic PDFIronPDF
HTML a PDFRequiere un complemento independiente (HtmlToPdf)Función principal incorporada
Estructura del paqueteCore + múltiples complementosPaquete NuGet único
Modelo de licenciaLicencia por adiciónTodas las funciones incluidas
Complejidad de la APIEspacios de nombres separados por complementoAPI unificada
Motor HTMLChromium (mediante complemento)Chromium (integrado)
Tamaño de la comunidadMás pequeñoMás recursos
DocumentaciónReferencias técnicasExtensos tutoriales

Paridad de características

Ambas bibliotecas son compatibles con una amplia funcionalidad PDF:

CaracterísticaBitMiracle Docotic PDFIronPDF
Crear PDF desde cero
HTML a PDF✅(complemento necesario)✅(integrado)
URL a PDF✅(complemento necesario)✅(integrado)
Manipulación de PDF
Extracción de texto
Fusionar/Dividir
Firmas digitales
Cifrado
Relleno de formularios
Conformidad con PDF/A

Diferencias clave en el enfoque

BitMiracle Docotic PDF utiliza el dibujo basado en lienzos con posicionamiento por coordenadas (canvas.DrawString(x, y, text)), mientras queIronPDFaprovecha HTML/CSS para el diseño y el posicionamiento. Esto representa un cambio de paradigma que simplifica la creación de contenidos para desarrolladores familiarizados con las tecnologías web.

Preparación de la migración

Prerrequisitos

Asegúrese de que su entorno cumple estos requisitos:

  • .NET Framework 4.6.2+ o .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ o VS Code con extensión de C#
  • Acceso al gestor de paquetes NuGet
  • Clave de licencia deIronPDF(prueba gratuita disponible en ironpdf.com)

Auditar el uso de BitMiracle Docotic PDF

Ejecute estos comandos en su directorio de soluciones para identificar todas las referencias a Docotic.Pdf:

# Find all Docotic.Pdf usages in your codebase
grep -r "using BitMiracle.Docotic" --include="*.cs" .
grep -r "PdfDocument\|PdfPage\|PdfCanvas" --include="*.cs" .

# Find NuGet package references
grep -r "Docotic.Pdf" --include="*.csproj" .
# Find all Docotic.Pdf usages in your codebase
grep -r "using BitMiracle.Docotic" --include="*.cs" .
grep -r "PdfDocument\|PdfPage\|PdfCanvas" --include="*.cs" .

# Find NuGet package references
grep -r "Docotic.Pdf" --include="*.csproj" .
SHELL

Cambios importantes que hay que anticipar

CambiarBitMiracle Docotic PDFIronPDFImpacto
Representación HTMLRequiere el complemento HtmlToPdfIncorporado enEliminar paquete adicional
Indización de páginasbasado en 0 (Páginas[0])basado en 0 (Páginas[0])No se necesitan cambios
Sistema de coordenadasOrigen inferior izquierdoFlujo HTML/CSSUtilizar CSS para el posicionamiento
Dibujo en lienzo<código>PdfCanvas.DrawText()</códigoMarcado HTMLCambio de paradigma
Extracción de textopage.GetText()<código>pdf.ExtractAllText()</códigoCambio de nombre del método
Carga de documentosnuevo PdfDocument(ruta)<código>PdfDocument.FromFile(path)</códigoConstructor → método estático
Ahorro<código>document.Save(ruta)</código<código>pdf.SaveAs(ruta)</códigoCambio de nombre del método
DisposiciónPatrón IDisposableNo es necesarioGestión de recursos más sencilla

Proceso de migración paso a paso

Paso 1: Actualizar paquetes NuGet

Elimine los paquetes BitMiracle Docotic PDFe instale IronPDF:

# Remove Docotic.Pdf packages
dotnet remove package BitMiracle.Docotic.Pdf
dotnet remove package BitMiracle.Docotic.Pdf.HtmlToPdf
dotnet remove package BitMiracle.Docotic.Pdf.Layout

# Install IronPDF
dotnet add package IronPdf
# Remove Docotic.Pdf packages
dotnet remove package BitMiracle.Docotic.Pdf
dotnet remove package BitMiracle.Docotic.Pdf.HtmlToPdf
dotnet remove package BitMiracle.Docotic.Pdf.Layout

# Install IronPDF
dotnet add package IronPdf
SHELL

Paso 2: Actualizar referencias de espacios de nombres

Sustituya los espacios de nombres PDF de BitMiracle Docotic por IronPDF:

// Remove these
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.Layout;
using BitMiracle.Docotic.Pdf.HtmlToPdf;

// Add this
using IronPdf;
// Remove these
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.Layout;
using BitMiracle.Docotic.Pdf.HtmlToPdf;

// Add this
using IronPdf;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Paso 3: Configurar la licencia

// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Referencia completa de migración de API

Operaciones de documentos

TareaBitMiracle Docotic PDFIronPDF
Crear documento vacíonuevo PdfDocument()nuevo PdfDocument()
Cargar desde archivonuevo PdfDocument(ruta)<código>PdfDocument.FromFile(path)</código
Cargar desde stream<código>PdfDocument.Load(stream)</código<código>PdfDocument.FromStream(stream)</código
Cargar desde bytes<código>PdfDocument.Load(bytes)</código<código>PdfDocument.FromBinaryData(bytes)</código
Guardar en archivo<código>document.Save(ruta)</código<código>pdf.SaveAs(ruta)</código
Obtener recuento de páginasdocument.PageCount<código>pdf.PageCount</código
Cerrar/Disponerdocument.Dispose()No es necesario

Conversión de HTML a PDF

TareaBitMiracle Docotic PDF(complemento HtmlToPdf)IronPDF
Cadena HTML a PDF<código>HtmlConverter.Create(html).ToPdf()</códigorenderer.RenderHtmlAsPdf(html)
Archivo HTML a PDFHtmlConverter.Create(new Uri(filePath)).ToPdf()<código>renderer.RenderHtmlFileAsPdf(ruta)</código
URL a PDFHtmlConverter.Create(new Uri(url)).ToPdf()<código>renderer.RenderUrlAsPdf(url)</código
Establecer tamaño de páginaoptions.PageSize = PageSize.A4renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
Establecer márgenesoptions.PageMargins = new Margins(20)renderer.RenderingOptions.MarginTop = 20

Operaciones de fusión y división

TareaBitMiracle Docotic PDFIronPDF
Fusionar documentos<código>doc1.Append(doc2)</códigoPdfDocument.Merge(pdf1, pdf2)
Documento divididodocument.CopyPage(index) a nuevo doc<código>pdf.CopyPages(start, end)</código

Ejemplos de migración de código

Conversión de HTML a PDF

La operación más común demuestra la importante simplificación que proporciona IronPDF.

Implementación de BitMiracle Docotic PDF:

// NuGet: Install-Package Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;

class Program
{
    static void Main()
    {
        using (var pdf = new PdfDocument())
        {
            string html = "<html><body><h1>Hello World</h1><p>This is HTML a PDFconversion.</p></body></html>";

            pdf.CreatePage(html);
            pdf.Save("output.pdf");
        }

        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;

class Program
{
    static void Main()
    {
        using (var pdf = new PdfDocument())
        {
            string html = "<html><body><h1>Hello World</h1><p>This is HTML a PDFconversion.</p></body></html>";

            pdf.CreatePage(html);
            pdf.Save("output.pdf");
        }

        Console.WriteLine("PDF created successfully");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string html = "<html><body><h1>Hello World</h1><p>This is HTML a PDFconversion.</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string html = "<html><body><h1>Hello World</h1><p>This is HTML a PDFconversion.</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF elimina el requisito de la declaración using y proporciona una clase ChromePdfRenderer dedicada que indica claramente su capacidad de renderización basada en Chromium. Para más opciones de conversión de HTML, consulte la documentación HTML a PDF.

Fusión de varios PDF

Implementación de BitMiracle Docotic PDF:

// NuGet: Install-Package Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;

class Program
{
    static void Main()
    {
        using (var pdf1 = new PdfDocument("document1.pdf"))
        using (var pdf2 = new PdfDocument("document2.pdf"))
        {
            pdf1.Append(pdf2);
            pdf1.Save("merged.pdf");
        }

        Console.WriteLine("PDFs merged successfully");
    }
}
// NuGet: Install-Package Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;

class Program
{
    static void Main()
    {
        using (var pdf1 = new PdfDocument("document1.pdf"))
        using (var pdf2 = new PdfDocument("document2.pdf"))
        {
            pdf1.Append(pdf2);
            pdf1.Save("merged.pdf");
        }

        Console.WriteLine("PDFs merged successfully");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

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

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        merged.SaveAs("merged.pdf");

        Console.WriteLine("PDFs merged successfully");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        merged.SaveAs("merged.pdf");

        Console.WriteLine("PDFs merged successfully");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El método estático Merge deIronPDFacepta múltiples documentos directamente, proporcionando una API más limpia que el patrón iterativo Append. Para más opciones, consulte la documentación sobre la fusión de PDF.

Extracción de texto

Implementación de BitMiracle Docotic PDF:

// NuGet: Install-Package Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;

class Program
{
    static void Main()
    {
        using (var pdf = new PdfDocument("document.pdf"))
        {
            string allText = "";

            foreach (var page in pdf.Pages)
            {
                allText += page.GetText();
            }

            Console.WriteLine("Extracted text:");
            Console.WriteLine(allText);
        }
    }
}
// NuGet: Install-Package Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;

class Program
{
    static void Main()
    {
        using (var pdf = new PdfDocument("document.pdf"))
        {
            string allText = "";

            foreach (var page in pdf.Pages)
            {
                allText += page.GetText();
            }

            Console.WriteLine("Extracted text:");
            Console.WriteLine(allText);
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de IronPDF:

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

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("document.pdf");
        string allText = pdf.ExtractAllText();

        Console.WriteLine("Extracted text:");
        Console.WriteLine(allText);
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("document.pdf");
        string allText = pdf.ExtractAllText();

        Console.WriteLine("Extracted text:");
        Console.WriteLine(allText);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF reduce la extracción de texto de un bucle de varias líneas a una única llamada a un método. Para más opciones de extracción, consulte la documentación sobre extracción de texto.

Protección y cifrado de contraseñas

Implementación de IronPDF:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");

// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

pdf.SaveAs("protected.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");

// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

pdf.SaveAs("protected.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Para conocer todas las opciones de seguridad, consulte la documentación sobre cifrado.

Cabeceras y pies de página

Implementación de IronPDF:

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:center; font-size:12px;'>
            Company Header - Confidential
        </div>",
    DrawDividerLine = true,
    MaxHeight = 30
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:center; font-size:10px;'>
            Page {page} of {total-pages}
        </div>",
    DrawDividerLine = true,
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
pdf.SaveAs("with_headers.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:center; font-size:12px;'>
            Company Header - Confidential
        </div>",
    DrawDividerLine = true,
    MaxHeight = 30
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:center; font-size:10px;'>
            Page {page} of {total-pages}
        </div>",
    DrawDividerLine = true,
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
pdf.SaveAs("with_headers.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF admite marcadores de posición como {page} y {total-pages} para la numeración dinámica de páginas. Para más opciones, consulte la documentación sobre encabezados y pies de página.

Notas de migración críticas

Cambio de paradigma de Canvas a HTML

El enfoque de dibujo basado en lienzo de BitMiracle Docotic PDFdebe convertirse a HTML con posicionamiento CSS:

Patrón PDF de BitMiracle Docotic:

var canvas = pdfPage.Canvas;
canvas.DrawString(50, 50, "Hello, World!");
var canvas = pdfPage.Canvas;
canvas.DrawString(50, 50, "Hello, World!");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Patrón IronPDF:

var html = "<div style='position:absolute; left:50px; top:50px;'>Hello, World!</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
var html = "<div style='position:absolute; left:50px; top:50px;'>Hello, World!</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Indización de la misma página

Ambas bibliotecas utilizan la indexación basada en 0 (Pages[0] es la primera página), por lo que no es necesario realizar cambios en el código de acceso a las páginas.

Disposición no requerida

IronPDF no requiere sentencias using para la gestión de memoria, lo que simplifica la estructura del código:

// BitMiracle Docotic PDF- disposal required
using (var pdf = new PdfDocument("input.pdf"))
{
    // operations
}

//IronPDF- disposal optional
var pdf = PdfDocument.FromFile("input.pdf");
// operations - no using statement needed
// BitMiracle Docotic PDF- disposal required
using (var pdf = new PdfDocument("input.pdf"))
{
    // operations
}

//IronPDF- disposal optional
var pdf = PdfDocument.FromFile("input.pdf");
// operations - no using statement needed
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Soporte Async

El complemento HtmlToPdf de BitMiracle Docotic PDFrequiere patrones asíncronos en todas partes.IronPDFadmite métodos síncronos y asíncronos:

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

// Asynchronous
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
// Synchronous
var pdf = renderer.RenderHtmlAsPdf(html);

// Asynchronous
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Integración con .NET Core

Patrón IronPDF:

[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public IActionResult GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");

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

    [HttpGet("generate-async")]
    public async Task<IActionResult> GeneratePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");

        return File(pdf.Stream, "application/pdf", "report.pdf");
    }
}
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public IActionResult GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");

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

    [HttpGet("generate-async")]
    public async Task<IActionResult> GeneratePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");

        return File(pdf.Stream, "application/pdf", "report.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Lista de comprobación posterior a la migración

Después de completar la migración del código, verifique lo siguiente:

  • [ ] Ejecutar todas las pruebas unitarias para verificar que la generación de PDF funciona correctamente
  • [Comparar la calidad de salida de PDF (el motor Chromium deIronPDFpuede renderizar de forma ligeramente diferente, normalmente mejor)
  • [ ] Verificar la precisión de la extracción de texto
  • [ ] Probar la funcionalidad de rellenado de formularios
  • [Validación de firmas digitales, si procede
  • [ ] Operaciones por lotes de pruebas de rendimiento
  • [ ] Prueba en todos los entornos de destino
  • [ ] Actualización de procesos CI/CD
  • [ ] Eliminar archivos de licencia de Docotic.Pdf

Proteja su infraestructura PDF

Con .NET 10 en el horizonte y C# 14 introduciendo nuevas características del lenguaje, elegir una biblioteca PDF con una arquitectura unificada simplifica la gestión de dependencias y garantiza la disponibilidad constante de las características. El enfoque de paquete único deIronPDFsignifica que no necesitará realizar un seguimiento de la compatibilidad de múltiples versiones de complementos a medida que los proyectos se extiendan hasta 2025 y 2026.

Recursos adicionales


La migración de BitMiracle Docotic PDFaIronPDFelimina la complejidad de gestionar varios paquetes complementarios al tiempo que proporciona las mismas capacidades de renderizado HTML basadas en Chromium. La transición del dibujo basado en lienzos al posicionamiento HTML/CSS aprovecha las habilidades de desarrollo web que la mayoría de los desarrolladores de .NET ya poseen, lo que da como resultado un código de generación de PDF más fácil de mantener.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más