IRONSOFTWAREHOME
VIDEOS

Cómo rotar texto en PDFs usando C#

Curtis Chau
Curtis Chau
Updated: 19 de julio de 2026

Por qué migrar de MuPDF a IronPDF

Para los ISVs y desarrolladores españoles, la licencia AGPL de MuPDF tiene una dimensión regulatoria específica: combinar MuPDF AGPL con software de facturación VeriFactu puede obligar a publicar el código fuente completo del sistema de facturación bajo AGPL. Dado que el RDL 15/2025 exige que los proveedores de software de facturación conformen sus sistemas a VeriFactu, esta obligación de publicación de código puede ser incompatible con el modelo de negocio de un ISV comercial — el mismo riesgo "iText AGPL × VeriFactu" que se aplica a otras bibliotecas AGPL.

Los retos de MuPDF

MuPDF es un excelente renderizador de PDF, pero su licencia AGPL y su enfoque exclusivo de renderización crean limitaciones significativas para los desarrolladores .NET que crean aplicaciones comerciales:

  1. La trampa de la licencia AGPL: la licencia viral de MuPDFrequiere que la aplicación completa se publique en código abierto bajo AGPL o que se compren licencias comerciales costosas con precios opacos y de venta por contacto.

  2. Enfoque solo en la representación: MuPDFes un visualizador/representador; no está diseñado para la creación de PDF a partir de HTML, flujos de trabajo de generación de documentos, llenado de formularios o adición de marcas de agua y encabezados/pies de página.

  3. No admite HTML: MuPDFno admite la conversión directa de HTML a PDF. En primer lugar, tendrás que utilizar otra biblioteca para convertir HTML a un formato compatible. Esta es una limitación fundamental: MuPDFes principalmente un renderizador/visualizador de PDF.

  4. Dependencias nativas: los binarios específicos de la plataforma requieren administración manual para Windows, Linux y macOS. Los despliegues de Docker se vuelven complejos con los requisitos de las bibliotecas nativas, y el empaquetado del despliegue introduce desafíos.

  5. Manipulación limitada: no hay soporte integrado para fusionar o dividir archivos PDF, rotación o reordenamiento de páginas, marcas de agua o anotaciones, o firmas digitales.

  6. Complejidad de interoperabilidad de C: los enlaces nativos introducen problemas de gestión de memoria, errores específicos de la plataforma y sobrecarga de serialización.

Comparación entre MuPDFe IronPDF

CaracterísticaMuPDFIronPDF
LicenciaAGPL (viral) o comercial caroComercial con precios transparentes
Enfoque principalRenderización/visualizaciónSolución PDF completa
HTML a PDFNo soportadoMotor Chromium completo
Creación de PDFNo soportadoHTML, URL, imágenes
Manipulación de PDFLimitadoCompletar (combinar, dividir, editar)
DependenciasBinarios nativosTotalmente gestionado
Soporte de plataformasManual por plataformaAutomático
Soporte de AsyncLimitadoAsync/await completo
Integración .NETInteroperabilidad de C.NET nativo

Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026, IronPDF proporciona una base a prueba de futuro como biblioteca .NET totalmente gestionada sin complejidad de interoperabilidad nativa.

Contexto regulatorio español: riesgo AGPL en software VeriFactu

Para los ISVs españoles, la licencia AGPL de MuPDF cobra relevancia específica:

Riesgo AGPL × VeriFactu: combinar MuPDF AGPL en un sistema de facturación que deba cumplir con VeriFactu (RDL 15/2025) puede obligar a publicar el código fuente del sistema completo bajo AGPL. Si el código de facturación es propietario, esta obligación es incompatible con el modelo comercial. Las alternativas son: adquirir la licencia comercial de MuPDF (costosa, precios opacos) o migrar a IronPDF con licencia comercial predecible.

MuPDF no genera PDFs desde HTML: VeriFactu y TicketBAI requieren representaciones gráficas de facturas con leyenda VERI*FACTU o Factura verificable en la sede electrónica de la AEAT, QR de la AEAT, y datos estructurados en HTML/CSS. MuPDF no puede generar estos documentos desde HTML; IronPDF sí.

TicketBAI (Bizkaia, Gipuzkoa, Araba): MuPDF no soporta firmas digitales (Manipulación limitada — sin firmas digitales). IronPDF incluye soporte nativo XAdES para TicketBAI.

Facturae XML / FACe: los PDFs que acompañan a Facturae XML requieren generación desde HTML. MuPDF no puede hacerlo; IronPDF sí.

Penalización de hasta 150.000 €/año: el régimen VeriFactu sanciona a proveedores no conformes. Usar MuPDF AGPL sin licencia comercial en un sistema de facturación introduce tanto riesgo regulatorio (AGPL) como técnico (no puede generar las representaciones gráficas requeridas).

Ejemplo: generación de PDF desde HTML con IronPDF (imposible con MuPDF)

using IronPdf;

// MuPDF no puede hacer esto — IronPDF sí
var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .verifactu-legend {
            border: 2px solid #003366;
            padding: 8px 12px;
            font-size: 10px;
            text-align: center;
            margin-top: 20px;
        }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
        th { background-color: #003366; color: white; }
    </style>
</head>
<body>
    <h2>FACTURA Nº 2026-0033</h2>
    <table>
        <tr><th>Concepto</th><th>Total</th></tr>
        <tr><td>Mantenimiento software</td><td>600,00 €</td></tr>
    </table>
    <div class='verifactu-legend'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT placeholder]
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0033.pdf");

Evaluación de la complejidad de la migración

Esfuerzo estimado por función

CaracterísticaComplejidad de la migración
Carga del documentoMuy bajo
Extracción de TextoMuy bajo
Fusión de PDFBajo
Reproducción de imágenesBajo
HTML a PDFN/A (Nueva capacidad)
Seguridad/marcas de aguaN/A (Nueva capacidad)

Cambio de paradigma

El cambio fundamental en esta migración de MuPDFes pasar de un visualizador solo de renderizado a una solución PDF completa:

MuPDF:   MuPDFContext → MuPDFDocument → Iteración de páginas → Sólo renderizar/extraer
IronPDF: PdfDocument.FromFile() → Manipulación completa → Crear/Editar/Fusionar/Seguro
Text

Antes de empezar

Prerrequisitos

  1. Entorno .NET : .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acceso a NuGet : Capacidad para instalar paquetes NuGet
  3. Licencia de IronPDF: Obtenga su clave de licencia en IronPDF

Cambios en el paquete NuGet

# Remove MuPDFpackages
dotnet remove package MuPDF.NET
dotnet remove package MuPDFCore
dotnet remove package MuPDFCore.MuPDFWrapper

# Install IronPDF
dotnet add package IronPdf
SHELL

También elimine los binarios nativos de MuPDF de su implementación:

  • Eliminar mupdf.dll, libmupdf.so, libmupdf.dylib
  • Eliminar carpetas específicas de la plataforma (runtimes/*/native/)
  • Actualizar los archivos Docker para eliminar la instalación de MuPDF

Configuración de licencias

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

Identificar el uso de MuPDF

# Find all MuPDFreferences
grep -r "MuPDF\|MuPDFCore\|MuPDFDocument" --include="*.cs" .
SHELL

Referencia completa de la API

Carga del documento

MuPDFIronPDF
new MuPDFDocument(path)PdfDocument.FromFile(path)
new MuPDFDocument(stream)PdfDocument.FromStream(stream)
document.Dispose()pdf.Dispose()

Acceso a la página

MuPDFIronPDF
document.Pages.Countpdf.PageCount
document.Pages[index]pdf.Pages[index]
page.GetText()page.Text

Extracción de texto

MuPDFIronPDF
Recorrer document.Pages[i].GetText()pdf.ExtractAllText()

Creación de PDF (no disponible en MuPDF)

MuPDFIronPDF
(no compatible)ChromePdfRenderer.RenderHtmlAsPdf(html)
(no compatible)ChromePdfRenderer.RenderUrlAsPdf(url)

Manipulación de PDF (limitada en MuPDF)

MuPDFIronPDF
Bucles de copia de página manualPdfDocument.Merge(pdf1, pdf2)
(no compatible)pdf.ApplyWatermark(html)
(no compatible)pdf.SecuritySettings

Ejemplos de migración de código

Ejemplo 1: Conversión de HTML a PDF (MuPDF no puede hacer esto)

Antes (MuPDF):

// NuGet: Install-Package MuPDF.NET
using MuPDFCore;
using System.IO;

class Program
{
    static void Main()
    {
        // MuPDFdoesn't support HTML a PDFconversion directly
        // You would need to use another library to convert HTML to a supported format first
        // This is a limitation - MuPDFis primarily a PDF renderer/viewer
        
        // Alternative: Use a browser engine or intermediate conversion
        string html = "<html><body><h1>Hello World</h1></body></html>";
        
        // Not natively supported in MuPDF
        throw new NotSupportedException("MuPDF does not support direct HTML a PDFconversion");
    }
}
C#

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string html = "<html><body><h1>Hello World</h1></body></html>";
        
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}

Este ejemplo pone de manifiesto la limitación más importante de MuPDF: no puede convertir HTML a PDF en absoluto. El código MuPDFlanza explícitamente NotSupportedException porque la conversión de HTML a PDF simplemente no es una capacidad que MuPDFproporciona. Si necesitaba esta funcionalidad con MuPDF, tenía que utilizar una biblioteca independiente como wkhtmltopdf o un motor de navegador y, a continuación, cargar el PDF resultante con MuPDFpara su visualización.

ChromePdfRenderer de IronPDF utiliza un motor Chromium completo para renderizar HTML con soporte completo para CSS3, JavaScript y estándares web modernos. El método RenderHtmlAsPdf() acepta cadenas HTML directamente. Consulte la documentación HTML a PDF para conocer otras opciones de conversión, como la conversión de URL y de archivos HTML.

Ejemplo 2: Extracción de texto

Antes (MuPDF):

// NuGet: Install-Package MuPDF.NET
using MuPDFCore;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        using (MuPDFDocument document = new MuPDFDocument("input.pdf"))
        {
            StringBuilder allText = new StringBuilder();
            
            for (int i = 0; i < document.Pages.Count; i++)
            {
                string pageText = document.Pages[i].GetText();
                allText.AppendLine(pageText);
            }
            
            Console.WriteLine(allText.ToString());
        }
    }
}

Después (IronPDF):

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

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");
        string text = pdf.ExtractAllText();
        
        Console.WriteLine(text);
    }
}

El enfoque de MuPDFrequiere crear un bloque using con un MuPDFDocument, iterar manualmente a través de document.Pages.Count con un bucle for, llamar a document.Pages[i].GetText() para cada página y construir el texto con un StringBuilder. Se trata de 12 líneas de código para una simple extracción de texto.

IronPDF reduce esto a 3 líneas: carga el documento con PdfDocument.FromFile(), llama a ExtractAllText() e imprime el resultado. Sin iteración manual, sin StringBuilder, sin gestión explícita de recursos con bloques using para esta sencilla operación. Obtenga más información sobre la extracción de texto de archivos PDF .

Ejemplo 3: Fusión de varios PDF

Antes (MuPDF):

// NuGet: Install-Package MuPDF.NET
using MuPDFCore;
using System.IO;

class Program
{
    static void Main()
    {
        using (MuPDFDocument doc1 = new MuPDFDocument("file1.pdf"))
        using (MuPDFDocument doc2 = new MuPDFDocument("file2.pdf"))
        {
            // Create a new document
            using (MuPDFDocument mergedDoc = MuPDFDocument.Create())
            {
                // Copy pages from first document
                for (int i = 0; i < doc1.Pages.Count; i++)
                {
                    mergedDoc.CopyPage(doc1, i);
                }
                
                // Copy pages from second document
                for (int i = 0; i < doc2.Pages.Count; i++)
                {
                    mergedDoc.CopyPage(doc2, i);
                }
                
                mergedDoc.Save("merged.pdf");
            }
        }
    }
}

Después (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("file1.pdf");
        var pdf2 = PdfDocument.FromFile("file2.pdf");
        
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}

La operación de fusión de MuPDFes especialmente prolija. Debe abrir ambos documentos fuente en bloques anidados using, crear un nuevo documento vacío con MuPDFDocument.Create(), iterar a través de cada página del primer documento llamando a CopyPage(), iterar a través de cada página del segundo documento llamando a CopyPage() y, finalmente, guardar. Son más de 20 líneas de código con anidamiento complejo.

El método estático PdfDocument.Merge() de IronPDF acepta múltiples documentos PDF y devuelve un único documento fusionado. La operación completa consta de 4 líneas de código legible. Para fusionar muchos documentos, puedes pasar una lista: PdfDocument.Merge(pdfList). Consulte la documentación sobre fusión y división de PDF para obtener más opciones.


Notas de migración críticas

Quitar binarios nativos

MuPDF requiere bibliotecas nativas específicas de la plataforma. Tras migrar a IronPDF, elimine todos los binarios nativos de MuPDF:

# Delete native libraries
rm -f mupdf*.dll libmupdf*.so libmupdf*.dylib

# Remove runtime folders
rm -rf runtimes/*/native/

# Update Docker files to remove MuPDFinstallation
SHELL

IronPDF es un código .NET totalmente gestionado, sin binarios nativos que gestionar entre plataformas.

Patrón Dispose simplificado

MuPDF requiere un contexto y una gestión de documentos explícitos:

// MuPDF: Nested using blocks required
using (MuPDFDocument document = new MuPDFDocument("input.pdf"))
{
    // Work with document
}

// IronPDF: Simpler pattern
var pdf = PdfDocument.FromFile("input.pdf");
// Work with pdf

Cambio de patrón de iteración de página

MuPDF utiliza iteración basada en índices con recuento explícito de páginas:

// MuPDF
for (int i = 0; i < document.Pages.Count; i++)
{
    var pageText = document.Pages[i].GetText();
}

//IronPDF(foreach supported)
foreach (var page in pdf.Pages)
{
    var pageText = page.Text;
}

Nuevas funciones disponibles

Tras migrar a IronPDF, obtendrá funciones que MuPDFno puede ofrecerle:

// Creación de PDFfrom HTML (not possible in MuPDF)
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>");

// Watermarks (not possible in MuPDF)
pdf.ApplyWatermark("<div style='color:red;opacity:0.3;'>DRAFT</div>");

// Password Protection (not possible in MuPDF)
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "user";

// Headers and Footers (not possible in MuPDF)
pdf.AddTextHeader("Document Title");
pdf.AddTextFooter("Page {page} of {total-pages}");

Solución de problemas

Edición 1: MuPDFDocument Not Found

Problema: la clase MuPDFDocument no existe en IronPDF.

Solución: Utilice PdfDocument.FromFile():

// MuPDF
using (MuPDFDocument document = new MuPDFDocument("input.pdf"))

// IronPDF
var pdf = PdfDocument.FromFile("input.pdf");

Asunto 2: Páginas.no encontradas

Problema: el patrón document.Pages.Count no funciona.

Solución: Utilice pdf.PageCount:

// MuPDF
for (int i = 0; i < document.Pages.Count; i++)

// IronPDF
for (int i = 0; i < pdf.PageCount; i++)
// Or use: foreach (var page in pdf.Pages)

Edición 3: GetText() no se encuentra

Problema: el método page.GetText() no existe.

Solución: utilice la propiedad page.Text o pdf.ExtractAllText():

// MuPDF
string pageText = document.Pages[i].GetText();

// IronPDF
string pageText = pdf.Pages[i].Text;
// Or for all text:
string allText = pdf.ExtractAllText();

Edición 4: Página de copia no encontrada

Problema: Patrón de copia de página manual para fusionar.

Solución: utilice PdfDocument.Merge() estático:

// MuPDF
mergedDoc.CopyPage(doc1, i);

// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);

Lista de comprobación de la migración

Pre-Migración

  • Inventario de todos los usos de MuPDFen el código base
  • Documentar todas las operaciones de renderizado (DPI, factores de escala)
  • Identificar cualquier necesidad de creación de PDF (actualmente utilizando herramientas externas)
  • Enumerar los requisitos de extracción de texto
  • Revisar los scripts de implementación para el manejo binario nativo
  • Obtener la clave de licencia de IronPDF

Cambios en el paquete

  • Eliminar el paquete MuPDF.NET
  • Eliminar el paquete MuPDFCore
  • Eliminar el paquete MuPDFCore.MuPDFWrapper
  • Instalar IronPdf el paquete NuGet : dotnet add package IronPdf
  • Actualizar las importaciones de espacios de nombres

Cambios de código

  • Agregar configuración de clave de licencia al inicio
  • Reemplace MuPDFDocument con PdfDocument.FromFile()
  • Reemplace document.Pages.Count con pdf.PageCount
  • Reemplace page.GetText() con page.Text o pdf.ExtractAllText()
  • Reemplazar los bucles manuales CopyPage con PdfDocument.Merge()
  • Eliminar bloques using anidados para la gestión del contexto
  • Agregue código de creación de PDF si es necesario (HTML a PDF)

Posmigración

  • Eliminar los binarios nativos de MuPDFdel proyecto
  • Actualizar los archivos Docker para eliminar la instalación de MuPDF
  • Eliminar carpetas de tiempo de ejecución específicas de la plataforma
  • Ejecutar pruebas de regresión comparando la salida renderizada
  • Prueba en todas las plataformas de destino (Windows, Linux, macOS)
  • Considere agregar nuevas capacidades (marcas de agua, seguridad, encabezados/pies de página)

Cumplimiento LOPDGDD, FNMT-RCM, SII y Crea y Crece: el entorno regulatorio completo para ISVs españoles

La decisión de migrar de MuPDF a IronPDF en el mercado español implica no solo resolver el riesgo AGPL × VeriFactu sino también cubrir el entorno regulatorio completo de facturación electrónica:

Marco regulatorioMuPDFIronPDF
VeriFactu leyenda VERI*FACTUNo (sin HTML-to-PDF)Sí (Chromium CSS3)
TicketBAI XAdES/PAdESNo (sin firma digital)Sí (nativo)
Facturae XML en PDF/A-3No
LOPDGDD on-premiseParcial (binarios nativos)Sí (headless)
FNMT-RCM certificados eIDASNoSí (PKCS#12)
Crea y Crece EN 16931NoSí (PDF/A)
Licencia ISV propietarioAGPL (riesgo copyleft)Comercial (predecible)

LOPDGDD y AEPD: Las facturas contienen datos personales (NIF, CIF, domicilio fiscal) bajo supervisión de la AEPD (Agencia Española de Protección de Datos). IronPDF procesa on-premise sin transmitir datos fiscales a servicios externos — simplificando el análisis de cumplimiento LOPDGDD.

eIDAS y FNMT-RCM: Para la firma digital de facturas electrónicas conforme a eIDAS, IronPDF soporta certificados PKCS#12 emitidos por la FNMT-RCM (Fábrica Nacional de Moneda y Timbre). MuPDF no implementa ningún tipo de firma digital — la firma XAdES para TicketBAI y PAdES para FACe requeriría bibliotecas externas adicionales.

SII (Suministro Inmediato de Información): Las grandes empresas españolas comunican datos de facturación a la AEAT en tiempo real bajo el SII. Los sistemas integrados con SII se benefician de IronPDF headless on-premise con rendimiento predecible, sin las complejidades de interoperabilidad C que introduce MuPDF en entornos .NET de producción.

Crea y Crece (EN 16931/CIUS-ES): La Ley Crea y Crece establece facturación electrónica B2B obligatoria desde 2027-2028 con Facturae XML en PDF/A-3. IronPDF soporta PDF/A nativo — migrando ahora se evita un segundo cambio de motor cuando entren en vigor los plazos.

Ejemplo: factura VeriFactu con NIF/CIF y formato EUR español (imposible con MuPDF AGPL)

using IronPdf;

// IronPDF: licencia comercial predecible, sin AGPL, sin riesgo copyleft para ISVs
var renderer = new ChromePdfRenderer();
var html = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .header { display: flex; justify-content: space-between; align-items: flex-start; }
        .verifactu { border: 2px solid #003366; padding: 8px; text-align: center; margin-top: 20px; font-size: 10px; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
        th { background-color: #003366; color: white; }
    </style>
</head>
<body>
    <div class='header'>
        <div><strong>FACTURA Nº 2026-0033</strong><br>Fecha: 28/05/2026<br>NIF: B-11223344</div>
        <div>CIF Receptor: A-44332211</div>
    </div>
    <table>
        <tr><th>Concepto</th><th>Base imponible</th><th>IVA (21%)</th><th>Total</th></tr>
        <tr><td>Visualización PDF on-premise</td><td>1.500,00 €</td><td>315,00 €</td><td>1.815,00 €</td></tr>
    </table>
    <div class='verifactu'>
        <strong>VERI*FACTU</strong><br>
        Factura verificable en la sede electrónica de la AEAT<br>
        [QR AEAT — sede.agenciatributaria.gob.es]
    </div>
</body>
</html>";

// MuPDF no puede generar PDFs desde HTML (es solo un visor/renderizador de PDFs existentes)
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("factura-verifactu-2026-0033.pdf");

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 estructurados y visualmente atractivos.

...
Leer más

Artículos Relacionados

Key in blue circle

Obtenga su clave de prueba gratuita de 30 días al instante.

Your trial license will be sent to your email address

Sin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.

bullet_checkedNo se requiere tarjeta de crédito ni creación de cuentaSin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Reserve su Demostración en Vivo gratuita
Booking Badge

Confiado por millones de ingenieros en todo el mundo

Logos de clientes de Iron Software
Obtén tu Consulta Sin Compromiso
Completa el formulario a continuación o envía un correo a sales@ironsoftware.com
Tus detalles siempre serán mantenidos confidenciales.
Confiado por millones de ingenieros en todo el mundo
Logos de clientes de Iron Software
Obtenga su Clave de Prueba de 30 días gratis al instante.
No se requiere tarjeta de crédito ni creación de cuenta