DotNetBrowser Printing API allows you to decide whether web page should be printed using printer device or saved as PDF document.


To save web page as PDF document you must register your own implementation of PrintHandler where you override default print settings and tell Chromium engine to save web page as PDF document at the specified path on the local file system. For example:


class MyPDFPrintHandler : PrintHandler
{
  Func<PrintSettings, PrintSettings> func;

  public MyPDFPrintHandler(Func<PrintSettings, PrintSettings> func)
  {
    this.func = func;
  }

  public PrintStatus OnPrint(PrintJob printJob)
  {
    PrintSettings printSettings = func(printJob.PrintSettings);
    printSettings.PrintToPDF = true;
    printSettings.Landscape = true;
    printSettings.PrintBackgrounds = true;
    printSettings.PageMargins = new PageMargins(20, 40, 40, 20);
    return PrintStatus.CONTINUE;
  }
}


browserView.Browser.PrintHandler = new MyPDFPrintHandler((printSettings) =>
{
  printSettings.PDFFilePath = dlg.FileName;
  return printSettings;
});
browserView.Browser.Print();


Once you register PrintHandler that saves web page as PDF document, you can initiate printing using one of the following ways:

  • By invoking the Browser.Print() method.
  • By invoking the window.print() JavaScript function.


Now, every time when printing is requested from .NET or JavaScript code, the PrintHandler will be used where you configure print settings to save web page as PDF document at specified file on the local file system.


using DotNetBrowser;
using DotNetBrowser.Events;
using DotNetBrowser.WPF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace PrintToPDFSample
{
    class MyPDFPrintHandler : PrintHandler
    {
        Func<PrintSettings, PrintSettings> func;

        public MyPDFPrintHandler(Func<PrintSettings, PrintSettings> func)
        {
            this.func = func;
        }

        public PrintStatus OnPrint(PrintJob printJob)
        {
            PrintSettings printSettings = func(printJob.PrintSettings);
            printSettings.PrintToPDF = true;
            printSettings.Landscape = true;
            printSettings.PrintBackgrounds = true;
            printSettings.PageMargins = new PageMargins(20, 40, 40, 20);
            return PrintStatus.CONTINUE;
        }
    }

    public class WindowMain : Window
    {
        private Button printButton;
        private WPFBrowserView browserView;
        private Grid layout;

        public WindowMain()
        {
            layout = new Grid();
            ColumnDefinition gridCol1 = new ColumnDefinition();
            layout.ColumnDefinitions.Add(gridCol1);
            RowDefinition gridRow1 = new RowDefinition();
            gridRow1.Height = new GridLength(45);
            RowDefinition gridRow2 = new RowDefinition();

            layout.RowDefinitions.Add(gridRow1);
            layout.RowDefinitions.Add(gridRow2);

            Content = layout;

            printButton = new Button();
            printButton.Content = "Print PDF";
            printButton.Height = 23;
            printButton.Click += printButton_Click;
            Grid.SetRow(printButton, 0);
            Grid.SetColumn(printButton, 0);

            browserView = new WPFBrowserView(BrowserFactory.Create());
            Grid.SetRow(browserView, 1);
            Grid.SetColumn(browserView, 0);

            layout.Children.Add(printButton);
            layout.Children.Add(browserView);

            Width = 1024;
            Height = 768;

            this.Loaded += WindowMain_Loaded;
        }

        void WindowMain_Loaded(object sender, RoutedEventArgs e)
        {
            browserView.Browser.LoadURL("http://www.teamdev.com/services");
        }

        void printButton_Click(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName = "document";
            dlg.DefaultExt = ".pdf";
            dlg.Filter = "PDF documents (.pdf)|*.pdf";
            dlg.Title = "Save page as PDF document";
            var res = dlg.ShowDialog();
            if (res.HasValue && res.Value)
            {
                browserView.Browser.PrintHandler = new MyPDFPrintHandler((printSettings) =>
                {
                    printSettings.PDFFilePath = dlg.FileName;
                    return printSettings;
                });
                browserView.Browser.Print();
            }
        }

        [STAThread]
        public static void Main()
        {
            Application app = new Application();

            WindowMain wnd = new WindowMain();
            app.Run(wnd);

            var browser = wnd.browserView.Browser;
            wnd.browserView.Dispose();
            browser.Dispose();
        }
    }
}


This code sample demonstrates how to print the web page to the pdf file in offscreen mode:

using System;
using System.IO;
using System.Threading;
using DotNetBrowser;

namespace OffscreenPrintToPDFSample
{
    class Program
    {
        [STAThread]
        static void Main()
        {
            Browser browser = BrowserFactory.Create(BrowserType.LIGHTWEIGHT);
            string pdfFilePath = Path.GetFullPath("sample.pdf");

            browser.PrintHandler = new MyPDFPrintHandler((printSettings) =>
            {
                printSettings.PDFFilePath = pdfFilePath;
                return printSettings;
            });

            ManualResetEvent waitEvent = new ManualResetEvent(false);
            browser.FinishLoadingFrameEvent += (s, e) =>
            {
                if (e.IsMainFrame)
                {
                    browser.Print();
                    Console.WriteLine("The web site was printed to the pdf file: "
                                      + pdfFilePath);
                    waitEvent.Set();
                }
            };
            browser.LoadURL("http://www.teamdev.com/services");

            Console.WriteLine("Start printing...");
            waitEvent.WaitOne();

            Console.WriteLine("Press any key to quit");
            Console.ReadKey();
            browser.Dispose();
        }

        internal class MyPDFPrintHandler : PrintHandler
        {
            private readonly Func<PrintSettings, PrintSettings> func;

            public MyPDFPrintHandler(Func<PrintSettings, PrintSettings> func)
            {
                this.func = func;
            }

            public PrintStatus OnPrint(PrintJob printJob)
            {
                PrintSettings printSettings = func(printJob.PrintSettings);
                printSettings.PrintToPDF = true;
                printSettings.Landscape = true;
                printSettings.PrintBackgrounds = true;
                printSettings.PageMargins = new PageMargins(20, 40, 40, 20);
                return PrintStatus.CONTINUE;
            }
        }
    }
}