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

Render and print PDF documents in C# and VB.NET

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

También puede necesitar implementar otros requisitos relacionados con PDF. Por ejemplo, imprimir documentos PDF. O generar miniaturas para documentos PDF cargados. O admitir la edición de PDF en su aplicación de escritorio o web.

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

Imprimir PDF en C#

Biblioteca .NET para ver, editar o imprimir documentos PDF

La biblioteca Docotic.Pdf permite mostrar, editar e imprimir documentos PDF en C# y VB.NET. Puede implementar cualquier flujo complejo de renderizado de PDF usando tres funcionalidades principales.

La primera es la capacidad de convertir PDF en imágenes. Puede implementar casi todo basándose en esta funcionalidad. Desde imprimir PDF hasta mostrar un PDF en HoloLens o publicar un PDF en Instagram. Eso es posible porque las imágenes se admiten en todas partes.

La segunda funcionalidad clave es la capacidad de dibujar páginas PDF en la superficie de dibujo de un System.Drawing.Graphics. Le permite renderizar e imprimir PDF en aplicaciones Windows Forms o WPF. Para usar esta funcionalidad, 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ágina PDF. Esta funcionalidad le permite crear un visor de PDF o un editor de PDF en su aplicación C# o VB.NET.

Obtenga la biblioteca y una clave de licencia gratuita con tiempo limitado en la página Descargar la biblioteca PDF de C# .NET.

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

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

Tenga en cuenta que no se recomienda usar nada del espacio de nombres System.Drawing en entornos macOS y Linux. Las implementaciones de System.Drawing en macOS y Linux están incompletas y son diferentes de la implementación de Windows. Puede obtener resultados incorrectos 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 vista previa de impresión. Por suerte, WPF le permite usar la clase PrintPreviewDialog de System.Windows.Forms.dll. Por 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.

Consulte la aplicación de demostración Imprimir PDF en .NET, disponible en versiones de 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 otros ajustes de impresión

La aplicación usa 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 usar sus clases PdfPrintDocument y PdfPrintHelper en sus proyectos WPF o Windows Forms.

La clase PdfPrintDocument describe la lógica principal de impresión. 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 ?? throw new InvalidOperationException("No Graphics!");

    // Trabaje en puntos para tener unidades coherentes en 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 los ajustes "Ajustar página" y "Tamaño real". Y también mostramos los márgenes físicos de la impresora en el cuadro de diálogo Vista previa de impresión. Después dibujamos la página PDF actual en el objeto Graphics mediante el método de extensión PdfPage.Draw.

La clase PdfPrintHelper le permite usar PdfPrintDocument con clases de interfaz de usuario para impresión. Por ejemplo, puede mostrar el cuadro de diálogo de impresión para 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:

  • agregue los archivos PdfPrintDocument, PdfPrintHelper y PrintSize del ejemplo
  • agregue una referencia a la biblioteca Docotic.Pdf
  • agregue 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 puede o no debe usar System.Drawing.Printing.

Por ejemplo, no debe usar 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 usar System.Drawing.Printing en aplicaciones Eto.Forms o Avalonia.

En esos casos, primero necesita convertir el documento PDF en imagen. Este ejemplo en C# muestra cómo guardar una página PDF como una imagen PNG o convertir un documento PDF completo en un TIFF multipágina:

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);

// guardar el documento completo como TIFF bitonal multipágina
options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
pdf.SaveAsTiff("your_document.tiff", options);

Luego, imprima las imágenes usando un marco de impresión o una herramienta alternativa. Consulte 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 PDF en su aplicación es similar a imprimir. En ASP.NET, WPF, Eto.Forms, Avalonia o cualquier otro tipo de aplicación, convierta PDF en imagen y luego muestre la imagen.

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

Este ejemplo muestra cómo convertir una página PDF en 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 DLL de extensión BitMiracle.Docotic.Pdf.Gdi a su proyecto.

Crear 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 de 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 su aplicación, puede renderizar todos los objetos extraídos. También puede implementar la capacidad de seleccionar y editar los objetos renderizados.

Consulte 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 puede extraer objetos de texto como rutas vectoriales. Para ello, use la sobrecarga PdfPage.GetObjects(PdfObjectExtractionOptions).

Conclusión

Use la biblioteca Docotic.Pdf para mostrar e imprimir documentos PDF en sus proyectos .NET. Consulte los ejemplos relacionados en C# y VB.NET:

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