Imprimir PDF em aplicação WPF

O seguinte trecho de código também funciona com a biblioteca Aspose.PDF.Drawing.

Impressão direta

A biblioteca Aspose.PDF tem a capacidade de converter arquivos PDF para XPS. Podemos usar essa função para organizar a impressão de documentos. Vamos considerar o exemplo para impressão direta:

    private void Print_OnClick(object sender, RoutedEventArgs e)
    {
        var openFileDialog = new OpenFileDialog
        {
            Filter = "Documentos PDF|*.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);

        //Criar URI para o pacote Xps
        //Qualquer Uri será na verdade adequado aqui. Ele atua como um substituto para o
        //Uri do pacote dentro do PackageStore
        var inMemoryPackageName = $"memorystream://{Guid.NewGuid()}.xps";
        var packageUri = new Uri(inMemoryPackageName);

        //Adicionar pacote ao 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, "Um documento fixo");
            else
                throw new NullReferenceException();
        }
        PackageStore.RemovePackage(packageUri);
        xpsDoc.Close();

    }

Neste caso, seguiremos estas etapas:

  1. Abrir arquivo PDF usando OpenFileDialog
  2. Converter PDF para XPS e armazenar em um objeto MemoryStream
  3. Associar o objeto MemoryStream com o pacote Xps
  4. Adicionar o pacote ao Armazenamento de Pacotes
  5. Criar um XpsDocument baseado no pacote
  6. Obter uma instância da sequência FixedDocumentSequence
  7. Enviar esta sequência para a impressora usando PrintDialog

Visualizar e imprimir documento

Em muitos casos, os usuários querem ver o documento antes de imprimir. Para implementar uma visualização, podemos usar uma classe DocViewer. A maioria das etapas para implementar essa abordagem é semelhante ao exemplo anterior.

private void OpenFile_OnClick(object sender, RoutedEventArgs e)
{
    var openFileDialog = new OpenFileDialog
    {
        Filter = "Documentos PDF|*.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);

        //Adicionar pacote ao Armazenamento de Pacotes
        PackageStore.AddPackage(packageUri, package);

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