Esta página puede contener texto traducido automáticamente.

Renderizar e imprimir documentos PDF en C# y VB.NET

Todo el mundo piensa en Adobe Reader cuando se trata de leer documentos PDF. Pero, ¿qué hacer si es desarrollador de software y desea mostrar documentos PDF en su aplicación? No desea pedirle al usuario que configure Adobe Reader y abra el documento allí.

Es posible que también deba implementar otros requisitos relacionados con PDF. Por ejemplo, imprima documentos PDF. O genere miniaturas para los documentos PDF cargados. O admita la edición de PDF en su escritorio o aplicación web.

Todo lo que necesita es una biblioteca de PDF que pueda renderizar e imprimir documentos PDF.

Imprimir PDF en C#

Biblioteca .NET para ver, editar o imprimir documentos PDF

Biblioteca Docotic.Pdf le permite mostrar, editar e imprimir documentos PDF en C# y VB.NET. Puede implementar cualquier flujo de renderizado de PDF complejo utilizando tres funciones principales.

La primera es la capacidad de convertir PDF a imágenes. Puede implementar casi todo basándose en esta característica. Desde imprimir PDF hasta mostrar un PDF en HoloLense o publicar un PDF en Instagram. Esto es posible porque las imágenes se admiten en todas partes.

La segunda característica clave es la capacidad de dibujar páginas PDF en la superficie de dibujo de un System.Drawing.Graphics. Le permite renderizar e imprimir archivos PDF en Windows Forms o aplicaciones WPF. Para utilizar esta función, agregue DLL de extensión BitMiracle.Docotic.Pdf.Gdi a su proyecto.

Por último, pero no menos importante, está la capacidad de extraer objetos de páginas PDF. Esta característica le permite crear un visor o editor de PDF en su aplicación C# o VB.NET.

Puede descargar los binarios de la biblioteca o utilizar su paquete NuGet. Para probar Docotic.Pdf sin restricciones del modo de evaluación, puede obtener la clave de licencia gratuita por tiempo limitado utilizando el formulario aquí.

.NET no admite la impresión de documentos PDF listos para usar. Debe transformar su documento PDF en una imagen, un archivo XPS o dibujarlo en una superficie System.Drawing.Graphics. Luego puede usar clases .NET para imprimir el resultado desde Windows Forms o una aplicación WPF.

En las aplicaciones de Windows Forms, puede utilizar clases del espacio de nombres System.Drawing.Printing. También hay clases útiles PrintDialog y PrintPreviewDialog para crear una interfaz de usuario de impresión.

Tenga en cuenta que no se recomienda utilizar nada del espacio de nombres System.Drawing en entornos macOS y Linux. Las implementaciones de macOS y Linux de System.Drawing están incompletas y son diferentes de la implementación de Windows. Es posible que obtenga resultados incorrectos y/o inconsistentes si usa el espacio de nombres System.Drawing en entornos macOS y Linux.

WPF proporciona otra clase PrintDialog pero no proporciona clases para la vista previa de impresión. Afortunadamente, WPF le permite utilizar la clase PrintPreviewDialog de System.Windows.Forms.dll. Por lo tanto, es más fácil usar clases de impresión de los espacios de nombres System.Windows.Forms y System.Drawing.Printing en aplicaciones WPF.

Mire la aplicación de demostración Imprimir PDF en .NET que viene en versiones C# y VB.NET para WinForms y WPF. La aplicación muestra cómo:

  • mostrar una vista previa de impresión para documentos PDF
  • imprimir documentos PDF en una impresora seleccionada
  • configurar el tamaño del papel, el modo de escala y otras configuraciones de impresión

La aplicación utiliza la biblioteca Docotic.Pdf, DLL de extensión BitMiracle.Docotic.Pdf.Gdi y clases de impresión de los espacios de nombres System.Windows.Forms y System.Drawing.Printing . Puede utilizar sus clases PdfPrintDocument y PdfPrintHelper en sus proyectos de WPF o Windows Forms.

La clase PdfPrintDocument describe la lógica de impresión principal. Esta clase conecta Docotic.Pdf con la clase System.Drawing.Printing.PrintDocument. El método clave es el controlador de eventos printDocument_PrintPage:

private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics gr = e.Graphics;

    // Trabajar en puntos para tener unidades consistentes para todos los contextos:
    // 1. Impresora
    // 2. Vista previa de impresión
    // 3. PDF
    gr.PageUnit = GraphicsUnit.Point;

    if (m_printAction == PrintAction.PrintToPreview)
    {
        gr.Clear(Color.LightGray);
        gr.FillRectangle(Brushes.White, m_printableAreaInPoints);
        gr.IntersectClip(m_printableAreaInPoints);

        gr.TranslateTransform(m_printableAreaInPoints.X, m_printableAreaInPoints.Y);
    }

    PdfPage page = m_pdf.Pages[m_pageIndex];
    PdfSize pageSizeInPoints = getPageSizeInPoints(page);

    if (m_printSize == PrintSize.FitPage)
    {
        float sx = (float)(m_printableAreaInPoints.Width / pageSizeInPoints.Width);
        float sy = (float)(m_printableAreaInPoints.Height / pageSizeInPoints.Height);
        float scaleFactor = Math.Min(sx, sy);

        centerContentInPrintableArea(gr, pageSizeInPoints, scaleFactor);
        gr.ScaleTransform(scaleFactor, scaleFactor);
    }
    else if (m_printSize == PrintSize.ActualSize)
    {
        centerContentInPrintableArea(gr, pageSizeInPoints, 1);
    }

    page.Draw(gr);

    ++m_pageIndex;
    e.HasMorePages = (m_pageIndex <= m_lastPageIndex);
}

Primero, configuramos las transformaciones del objeto Graphics de la página impresa. Es importante respetar las configuraciones de "Ajustar página" y "Tamaño real". Y también mostramos los márgenes duros de la impresora en el cuadro de diálogo Vista previa de impresión. Luego dibujamos la página PDF actual en el objeto Graphics usando el método de extensión PdfPage.Draw.

La clase PdfPrintHelper le permite usar PdfPrintDocument con clases de UI para imprimir. Por ejemplo, puede mostrar el cuadro de diálogo de impresión de su documento PDF así:

using (var pdf = new PdfDocument("your_document.pdf"))
    action(pdf, getPrintSize());

public static DialogResult ShowPrintDialog(PdfDocument pdf, PrintSize printSize)
{
    using (var printDialog = new PrintDialog())
    {
        printDialog.AllowSomePages = true;
        printDialog.AllowCurrentPage = true;
        printDialog.AllowSelection = true;

        printDialog.PrinterSettings.MinimumPage = 1;
        printDialog.PrinterSettings.MaximumPage = pdf.PageCount;
        printDialog.PrinterSettings.FromPage = printDialog.PrinterSettings.MinimumPage;
        printDialog.PrinterSettings.ToPage = printDialog.PrinterSettings.MaximumPage;

        var result = printDialog.ShowDialog();
        if (result == DialogResult.OK)
        {
            using (var printDocument = new PdfPrintDocument(pdf, printSize))
                printDocument.Print(printDialog.PrinterSettings);
        }

        return result;
    }
}

Eso es todo. Haga lo siguiente para implementar la impresión de PDF en su aplicación Windows Forms o WPF:

  • agregar archivos PdfPrintDocument, PdfPrintHelper y PrintSize de la muestra
  • agregar una referencia a la biblioteca Docotic.Pdf
  • agregar una referencia a DLL de extensión BitMiracle.Docotic.Pdf.Gdi
  • (solo WPF) agregue referencias a los ensamblados System.Windows.Forms y System.Drawing

Las clases del espacio de nombres System.Drawing.Printing funcionan bien en aplicaciones Windows Forms y WPF. Pero hay casos en los que no puedes o no debes usar System.Drawing.Printing.

Por ejemplo, no debe utilizar System.Drawing.Printing en servicios de Windows o aplicaciones ASP.NET. System.Drawing.Printing puede producir resultados inconsistentes al imprimir en Linux o macOS. Y no puede utilizar System.Drawing.Printing en aplicaciones Eto.Forms o Avalonia.

En tales casos, primero debe convertir documento PDF a imagen. Este ejemplo de C# muestra cómo guardar una página PDF como una imagen PNG o convertir un documento PDF completo a un TIFF de varias páginas:

using (var pdf = new PdfDocument(@"your_document.pdf"))
{
    PdfDrawOptions options = PdfDrawOptions.Create();
    options.HorizontalResolution = printerDpi;
    options.VerticalResolution = printerDpi;

    // guardar una página
    pdf.Pages[0].Save("page0.png", options);

    // guarde todo el documento como TIFF bitonal de varias páginas
    options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
    pdf.SaveAsTiff("your_document.tiff", options);
}

Luego, imprima imágenes utilizando un marco o herramienta de impresión alternativa. Mire la aplicación de demostración Imprimir PDF en Eto.Forms que muestra cómo imprimir documentos PDF sin System.Drawing.Printing.

Renderizar PDF en C# y VB.NET

Mostrar un PDF en su aplicación es como imprimir. En ASP.NET, WPF, Eto.Forms, Avalonia o cualquier otro tipo de aplicación, convierta PDF a imagen y luego muestre la imagen.

En una aplicación de Windows Forms, puede dibujar una página PDF en un contexto System.Drawing.Graphics desde cualquier control. O puede convertir una página PDF a un System.Drawing.Bitmap y luego mostrar el mapa de bits en un PictureBox.

Este ejemplo muestra cómo convertir una página PDF a Bitmap en C#:

using (var pdf = new PdfDocument("render.pdf"))
{
    const float TargetResolution = 300;
    
    PdfPage page = pdf.Pages[0];
    double scaleFactor = TargetResolution / page.Resolution;

    using (var bitmap = new Bitmap((int)(page.Width * scaleFactor), (int)(page.Height * scaleFactor)))
    {
        bitmap.SetResolution(TargetResolution, TargetResolution);

        using (Graphics gr = Graphics.FromImage(bitmap))
            page.Draw(gr);

        bitmap.Save("result.png");
    }
}

El código anterior requiere que agregue BitMiracle.Docotic.Pdf.Gdi extensión DLL a su proyecto.

Cree un visor de PDF o un editor de PDF en una aplicación .NET

Docotic.Pdf le permite obtener información detallada sobre cada objeto en una página PDF. Puede extraer fragmentos de texto, imágenes, rutas vectoriales, controles de formulario y anotaciones de una página PDF.

Luego, en tu aplicación, puedes renderizar todos los objetos extraídos. También puede implementar la capacidad de seleccionar y editar los objetos renderizados.

Mire el ejemplo Extraer texto, imágenes y rutas de PDF. Muestra cómo extraer y dibujar objetos de página en el contexto System.Drawing.Graphics.

También puedes extraer objetos de texto como rutas vectoriales. Utilice la sobrecarga PdfPage.GetObjects(PdfObjectExtractionOptions) para eso.

Conclusión

Utilice la biblioteca Docotic.Pdf para mostrar e imprimir documentos PDF en sus proyectos .NET. Mire ejemplos relacionados de C# y VB.NET:

Contáctenos si tiene preguntas sobre la impresión o renderizado de PDF.