Imprimir PDF en una aplicación WPF

El siguiente fragmento de código también funciona con la biblioteca Aspose.PDF.Drawing.

Impresión directa

La biblioteca Aspose.PDF tiene la capacidad de convertir archivos PDF a XPS. Podemos usar esta función para organizar la impresión de documentos. Consideremos el ejemplo para la impresión directa:

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

        //Crear URI para el paquete Xps
        //Cualquier Uri estará bien aquí. Actúa como un marcador de posición para
        //el Uri del paquete dentro de PackageStore
        var inMemoryPackageName = $"memorystream://{Guid.NewGuid()}.xps";
        var packageUri = new Uri(inMemoryPackageName);

        //Agregar paquete a 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, "Un documento fijo");
            else
                throw new NullReferenceException();
        }
        PackageStore.RemovePackage(packageUri);
        xpsDoc.Close();

    }

En este caso, seguiremos estos pasos:

  1. Abrir archivo PDF usando OpenFileDialog
  2. Convertir PDF a XPS y almacenarlo en un objeto MemoryStream
  3. Asociar el objeto MemoryStream con el paquete Xps
  4. Añadir el paquete al almacén de paquetes
  5. Crear un XpsDocument basado en el paquete
  6. Obtener una instancia de la secuencia FixedDocumentSequence
  7. Enviar esta secuencia a la impresora usando PrintDialog

Ver e imprimir documento

En muchos casos, los usuarios quieren ver el documento antes de imprimirlo. Para implementar una vista, podemos usar una clase DocViewer. La mayoría de los pasos para implementar este enfoque son similares al ejemplo 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);

        //Añadir paquete al almacén de paquetes
        PackageStore.AddPackage(packageUri, package);

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