Questa pagina può contenere testo tradotto automaticamente.

Renderizzare e stampare documenti PDF in C# e VB.NET

Tutti pensano ad Adobe Reader quando si tratta di leggere documenti PDF. Ma cosa fare se sei uno sviluppatore software e vuoi visualizzare documenti PDF nella tua applicazione? Non vuoi chiedere all'utente di configurare Adobe Reader e aprire lì il documento.

Potresti anche dover implementare altri requisiti relativi ai PDF. Ad esempio, stampare documenti PDF. Oppure generare miniature per documenti PDF caricati. Oppure supportare la modifica dei PDF nella tua applicazione desktop o web.

Tutto ciò che ti serve è una libreria PDF in grado di renderizzare e stampare documenti PDF.

Stampa PDF in C#

Libreria .NET per visualizzare, modificare o stampare documenti PDF

La libreria Docotic.Pdf consente di visualizzare, modificare e stampare documenti PDF in C# e VB.NET. Puoi implementare qualsiasi flusso complesso di rendering PDF usando tre funzionalità principali.

La prima è la possibilità di convertire PDF in immagini. Su questa funzionalità puoi implementare quasi tutto. Dalla stampa di PDF alla visualizzazione di un PDF su HoloLens o alla pubblicazione di un PDF su Instagram. Ciò è possibile perché le immagini sono supportate ovunque.

La seconda funzionalità chiave è la possibilità di disegnare le pagine PDF sulla superficie di disegno di System.Drawing.Graphics. Ti consente di renderizzare e stampare PDF in applicazioni Windows Forms o WPF. Per usare questa funzionalità, aggiungi BitMiracle.Docotic.Pdf.Gdi extension DLL al tuo progetto.

Ultima ma non meno importante è la possibilità di estrarre gli oggetti delle pagine PDF. Questa funzionalità ti consente di creare un visualizzatore PDF o un editor PDF nella tua applicazione C# o VB.NET.

Ottieni la libreria e una chiave di licenza gratuita a tempo limitato nella pagina Scarica la libreria PDF C# .NET.

.NET non supporta nativamente la stampa di documenti PDF. Devi trasformare il tuo documento PDF in un'immagine, in un file XPS, oppure disegnarlo su una superficie System.Drawing.Graphics. Poi puoi usare le classi .NET per stampare l'output da un'applicazione Windows Forms o WPF.

Nelle applicazioni Windows Forms, puoi usare le classi del namespace System.Drawing.Printing. Sono disponibili anche le utili classi PrintDialog e PrintPreviewDialog per creare l'interfaccia utente di stampa.

Nota che non è consigliato usare nulla del namespace System.Drawing in ambienti macOS e Linux. Le implementazioni macOS e Linux di System.Drawing sono incomplete e diverse dall'implementazione Windows. Potresti ottenere risultati errati e/o incoerenti se usi il namespace System.Drawing in ambienti macOS e Linux.

WPF fornisce un'altra classe PrintDialog ma non fornisce classi per l'anteprima di stampa. Fortunatamente, WPF consente di usare la classe PrintPreviewDialog da System.Windows.Forms.dll. Quindi, è più semplice usare le classi di stampa dei namespace System.Windows.Forms e System.Drawing.Printing nelle applicazioni WPF.

Guarda l'applicazione demo Stampa PDF in .NET, disponibile nelle versioni C# e VB.NET per WinForms e WPF. L'applicazione mostra come:

  • visualizzare un'anteprima di stampa per documenti PDF
  • stampare documenti PDF su una stampante selezionata
  • impostare il formato carta, la modalità di ridimensionamento e altre impostazioni di stampa

L'applicazione usa la libreria Docotic.Pdf, BitMiracle.Docotic.Pdf.Gdi extension DLL e le classi di stampa dei namespace System.Windows.Forms e System.Drawing.Printing. Puoi usare le classi PdfPrintDocument e PdfPrintHelper nei tuoi progetti WPF o Windows Forms.

La classe PdfPrintDocument descrive la logica principale di stampa. Questa classe collega Docotic.Pdf con la classe System.Drawing.Printing.PrintDocument. Il metodo chiave è il gestore dell'evento printDocument_PrintPage:

private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics gr = e.Graphics ?? throw new InvalidOperationException("No Graphics!");

    // Lavora in punti per avere unità coerenti in tutti i contesti:
    // 1. Stampante
    // 2. Anteprima di stampa
    // 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);
}

Per prima cosa, impostiamo le trasformazioni dell'oggetto Graphics della pagina stampata. È importante rispettare le impostazioni "Adatta pagina" e "Dimensioni effettive". Mostriamo anche i margini fisici della stampante nella finestra di dialogo Anteprima di stampa. Poi disegniamo la pagina PDF corrente sull'oggetto Graphics usando il metodo di estensione PdfPage.Draw.

La classe PdfPrintHelper ti consente di usare PdfPrintDocument con classi UI per la stampa. Ad esempio, puoi mostrare la finestra di dialogo di stampa per il tuo documento PDF in questo modo:

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

Ecco tutto. Fai quanto segue per implementare la stampa PDF nella tua applicazione Windows Forms o WPF:

  • aggiungi i file PdfPrintDocument, PdfPrintHelper e PrintSize da l'esempio
  • aggiungi un riferimento alla libreria Docotic.Pdf
  • aggiungi un riferimento a BitMiracle.Docotic.Pdf.Gdi extension DLL
  • (solo WPF) aggiungi riferimenti agli assembly System.Windows.Forms e System.Drawing

Le classi del namespace System.Drawing.Printing funzionano bene nelle applicazioni Windows Forms e WPF. Ma ci sono casi in cui non puoi o non dovresti usare System.Drawing.Printing.

Ad esempio, non dovresti usare System.Drawing.Printing nei servizi Windows o nelle applicazioni ASP.NET. System.Drawing.Printing potrebbe produrre risultati incoerenti quando si stampa su Linux o macOS. E non puoi usare System.Drawing.Printing nelle applicazioni Eto.Forms o Avalonia.

In questi casi, devi prima convertire il documento PDF in un'immagine. Questo esempio C# mostra come salvare una pagina PDF come immagine PNG o convertire un intero documento PDF in un TIFF multipagina:

using var pdf = new PdfDocument(@"your_document.pdf");

PdfDrawOptions options = PdfDrawOptions.Create();
options.HorizontalResolution = printerDpi;
options.VerticalResolution = printerDpi;

// salva una pagina
pdf.Pages[0].Save("page0.png", options);

// salva l'intero documento come TIFF bitonale multipagina
options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
pdf.SaveAsTiff("your_document.tiff", options);

Poi, stampa le immagini usando un framework o uno strumento di stampa alternativo. Guarda l'applicazione demo Stampa PDF in Eto.Forms che mostra come stampare documenti PDF senza System.Drawing.Printing.

Renderizzare PDF in C# e VB.NET

Visualizzare PDF nella tua applicazione è simile alla stampa. In ASP.NET, WPF, Eto.Forms, Avalonia o in qualsiasi altro tipo di applicazione, converti PDF in immagine e poi visualizza l'immagine.

In un'applicazione Windows Forms, puoi disegnare una pagina PDF su un contesto System.Drawing.Graphics da qualsiasi controllo. Oppure puoi convertire una pagina PDF in un System.Drawing.Bitmap e poi visualizzare il bitmap in un PictureBox.

Questo esempio mostra come convertire una pagina PDF in Bitmap in 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");

Il codice sopra richiede di aggiungere BitMiracle.Docotic.Pdf.Gdi extension DLL al tuo progetto.

Crea un visualizzatore PDF o un editor PDF in un'applicazione .NET

Docotic.Pdf ti consente di ottenere informazioni dettagliate su ogni oggetto in una pagina PDF. Puoi estrarre frammenti di testo, immagini, tracciati vettoriali, controlli di modulo e annotazioni da una pagina PDF.

Poi, nella tua applicazione, puoi renderizzare tutti gli oggetti estratti. Puoi anche implementare la possibilità di selezionare e modificare gli oggetti renderizzati.

Guarda l'esempio Estrai testo, immagini e tracciati da PDF. Mostra come estrarre e disegnare gli oggetti della pagina su un contesto System.Drawing.Graphics.

Puoi anche estrarre gli oggetti di testo come tracciati vettoriali. Per farlo, usa il sovraccarico PdfPage.GetObjects(PdfObjectExtractionOptions).

Conclusione

Usa la libreria Docotic.Pdf per visualizzare e stampare documenti PDF nei tuoi progetti .NET. Guarda gli esempi correlati in C# e VB.NET:

Contattaci se hai domande sulla stampa o sul rendering dei PDF.