Печать PDF в приложении WPF

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

Прямая печать

Библиотека Aspose.PDF имеет возможность конвертировать PDF файлы в XPS. Мы можем использовать эту функцию для организации печати документов. Рассмотрим пример прямой печати:

    private void Print_OnClick(object sender, RoutedEventArgs e)
    {
        var openFileDialog = new OpenFileDialog
        {
            Filter = "PDF Documents|*.pdf"
        };
        openFileDialog.ShowDialog();

        Aspose.Pdf.Document document = new Document(openFileDialog.FileName);
        var memoryStream = new MemoryStream();
        document.Save(memoryStream, SaveFormat.Xps);
        var package = Package.Open(memoryStream);

        //Создать URI для пакета Xps
        //Любой Uri здесь будет работать. Он служит заполнителем для
        //Uri пакета внутри PackageStore
        var inMemoryPackageName = $"memorystream://{Guid.NewGuid()}.xps";
        var packageUri = new Uri(inMemoryPackageName);

        //Добавить пакет в PackageStore
        PackageStore.AddPackage(packageUri, package);

        var xpsDoc = new XpsDocument(package, CompressionOption.Maximum, inMemoryPackageName);
        var fixedDocumentSequence = xpsDoc.GetFixedDocumentSequence();

        var printDialog = new PrintDialog();
        if (printDialog.ShowDialog() == true)
        {
            if (fixedDocumentSequence != null)
                printDialog.PrintDocument(fixedDocumentSequence.DocumentPaginator, "Фиксированный документ");
            else
                throw new NullReferenceException();
        }
        PackageStore.RemovePackage(packageUri);
        xpsDoc.Close();

    }

В данном случае мы будем следовать следующим шагам:

  1. Открыть PDF файл с помощью OpenFileDialog
  2. Конвертировать PDF в XPS и сохранить его в объекте MemoryStream
  3. Связать объект MemoryStream с Xps Package
  4. Добавить пакет в хранилище пакетов
  5. Создать XpsDocument на основе пакета
  6. Получить экземпляр FixedDocumentSequence
  7. Отправить эту последовательность на печать с использованием PrintDialog

Просмотр и печать документа

Во многих случаях пользователи хотят видеть документ перед печатью. Для реализации просмотра мы можем использовать класс DocViewer. Большинство шагов для реализации этого подхода аналогичны предыдущему примеру.

private void OpenFile_OnClick(object sender, RoutedEventArgs e)
{
    var openFileDialog = new OpenFileDialog
    {
        Filter = "PDF Documents|*.pdf"
    };

    if (openFileDialog.ShowDialog() == true)
    {
        var document = new Document(openFileDialog.FileName);
        var memoryStream = new MemoryStream();
        document.Save(memoryStream, SaveFormat.Xps);

        var package = Package.Open(memoryStream);

        var inMemoryPackageName = $"memorystream://{Guid.NewGuid()}.xps";
        var packageUri = new Uri(inMemoryPackageName);

        //Добавить пакет в PackageStore
        PackageStore.AddPackage(packageUri, package);

        var xpsDoc = new XpsDocument(package, CompressionOption.Maximum, inMemoryPackageName);
        DocViewer.Document = xpsDoc.GetFixedDocumentSequence();
        xpsDoc.Close();
    };
}