Questa pagina può contenere testo tradotto automaticamente.

Rendering e stampa di 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 di software e desideri visualizzare documenti PDF nella tua applicazione? Non vuoi chiedere all'utente di configurare Adobe Reader e aprire il documento lì.

Potrebbe anche essere necessario implementare altri requisiti relativi ai PDF. Ad esempio, stampare documenti PDF. Oppure genera miniature per i documenti PDF caricati. Oppure supporta la modifica dei PDF nella tua applicazione desktop o web.

Tutto ciò di cui hai bisogno è una libreria PDF in grado di eseguire il rendering e stampare documenti PDF.

Stampa PDF in C#

Libreria .NET per visualizzare, modificare o stampare documenti PDF

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

Il primo è la possibilità di convertire PDF in immagini. Puoi implementare quasi tutto in base a questa funzionalità. Dalla stampa PDF alla visualizzazione di un PDF su HoloLense o alla pubblicazione di un PDF su Instagram. Ciò è possibile perché le immagini sono supportate ovunque.

La seconda caratteristica fondamentale è la capacità di disegnare pagine PDF sulla superficie di disegno di un System.Drawing.Graphics. Ti consente di eseguire il rendering e stampare PDF in Windows Forms o applicazioni WPF. Per utilizzare questa funzionalità, aggiungi DLL dell'estensione BitMiracle.Docotic.Pdf.Gdi al tuo progetto.

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

Libreria Docotic.Pdf 9.5.17664-dev Test di regressione Ne sono passati 14,820 Download totali di NuGet 4,998,853

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

.NET non supporta la stampa di documenti PDF immediatamente. Devi trasformare il tuo documento PDF in un'immagine, un file XPS o disegnarlo su una superficie System.Drawing.Graphics. È quindi possibile utilizzare le classi .NET per stampare l'output dall'interno di un Windows Form o di un'applicazione WPF.

Nelle applicazioni Windows Forms, puoi utilizzare le classi dallo spazio dei nomi System.Drawing.Printing. Sono inoltre disponibili utili classi PrintDialog e PrintPreviewDialog per creare un'interfaccia utente di stampa.

Tieni presente che non è consigliabile utilizzare nulla dello spazio dei nomi System.Drawing negli 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 utilizzi lo spazio dei nomi System.Drawing in ambienti macOS e Linux.

WPF fornisce un'altra classe PrintDialog ma non fornisce classi per l'anteprima di stampa. Fortunatamente, WPF ti consente di utilizzare la classe PrintPreviewDialog da System.Windows.Forms.dll. Pertanto, è più semplice utilizzare le classi di stampa dagli spazi dei nomi 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 i documenti PDF
  • stampare documenti PDF su una stampante selezionata
  • impostare il formato della carta, la modalità di ridimensionamento e altre impostazioni di stampa

L'applicazione utilizza la libreria Docotic.Pdf, DLL dell'estensione BitMiracle.Docotic.Pdf.Gdi e classi di stampa dagli spazi dei nomi System.Windows.Forms e System.Drawing.Printing . È possibile utilizzare le classi PdfPrintDocument e PdfPrintHelper nei progetti WPF o Windows Forms.

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

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

    // Lavora per punti per avere unità coerenti per 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 reali". E visualizziamo anche i margini rigidi della stampante nella finestra di dialogo Anteprima di stampa. Quindi disegniamo la pagina PDF corrente sull'oggetto Graphics utilizzando il metodo di estensione PdfPage.Draw.

La classe PdfPrintHelper ti consente di utilizzare PdfPrintDocument con le classi dell'interfaccia utente 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;
    }
}

Questo è tutto. Effettuare le seguenti operazioni per implementare la stampa PDF nell'applicazione Windows Forms o WPF:

  • aggiungere i file PdfPrintDocument, PdfPrintHelper e PrintSize da l'esempio
  • aggiungere un riferimento alla libreria Docotic.Pdf
  • aggiungere un riferimento alla DLL dell'estensione BitMiracle.Docotic.Pdf.Gdi
  • (Solo WPF) aggiunge riferimenti agli assembly System.Windows.Forms e System.Drawing

Le classi dello spazio dei nomi System.Drawing.Printing funzionano bene nelle applicazioni Windows Form e WPF. Ma ci sono casi in cui non puoi o non dovresti usare System.Drawing.Printing.

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

In questi casi, è necessario prima convertire il documento PDF in 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);

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

Quindi, stampa le immagini utilizzando 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.

Rendering di PDF in C# e VB.NET

Visualizzare il PDF nella tua applicazione è come stamparlo. In ASP.NET, WPF, Eto.Forms, Avalonia o qualsiasi altro tipo di applicazione, converti PDF in immagine e quindi visualizza l'immagine.

In un'app Windows Forms, puoi disegnare una pagina PDF in un contesto System.Drawing.Graphics da qualsiasi controllo. Oppure puoi convertire una pagina PDF in un System.Drawing.Bitmap e quindi visualizzare la 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 precedente richiede l'aggiunta della DLL dell'estensione BitMiracle.Docotic.Pdf.Gdi al progetto.

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

Docotic.Pdf ti consente di ottenere informazioni dettagliate su ogni oggetto su una pagina PDF. Puoi estrarre porzioni di testo, immagini, percorsi vettoriali, controlli di moduli e annotazioni da una pagina PDF.

Quindi nella tua applicazione puoi eseguire il rendering di tutti gli oggetti estratti. Puoi anche implementare la possibilità di selezionare e modificare gli oggetti renderizzati.

Guarda l'esempio Estrai testo, immagini e percorsi dal PDF. Mostra come estrarre e disegnare oggetti di pagina nel contesto System.Drawing.Graphics.

Puoi anche estrarre oggetti di testo come tracciati vettoriali. Utilizzare l'overload PdfPage.GetObjects(PdfObjectExtractionOptions) per questo.

Conclusione

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

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