wpfannotationsxpsdocument

Printing XPS with Annotations fails


this works

FixedDocumentSeqeunce fixedDocumentSeqeunce = XPSdoc.GetFixedDocumentSeqeunce();    
DocumentPaginator paginator = fixedDocumentSeqeunce.DocumentPaginator;

printDialog.PrintDocument(paginator, "Title");

this fails

AnnotationDocumentPaginator adp = new AnnotationDocumentPaginator(paginator, service.Store); 
// same paginator as above    
printDialog.PrintDocument(adp, "Title");

printDialog.PrintDocument(adp, "Title"); is what is killing it
Somehow it appears to be corrupting the XPSdoc

Store appears to be good - I can get a count of the annotations
It fail even if I create zero annotations
But the print itself does not fail - I get a valid print
A try catch on the above does not catch an error
A few seconds after the print get errors starting with
(I have a handler for unhandled exceptions)

The specified visual is not an ancestor of the Visual

App crashes and the XPS document is never repainted in the DocumentViewer

I am able to get FlowDocuments with ScrollViewer to print annotation fine
And create the store the same way so I think that code is fine

.NET 4.5


Solution

  • Don't know what is going on in my larger program but I cannot reproduce it on a smaller program right now

    Figure it out
    In the failed code I was NOT using

    FixedDocumentSeqeunce fixedDocumentSeqeunce = XPSdoc.GetFixedDocumentSeqeunce();
    

    In the printDialog.PrintDocument I was using the EXACT same fixedDocumentSeqeunce the control was bound to. Print must alter fixedDocumentSeqeunce so it needs a fresh fixedDocumentSeqeunce.

    <Window x:Class="APSannotate.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:ann="clr-namespace:System.Windows.Annotations;assembly=PresentationFramework"
            Loaded="Window_Loaded"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Button Grid.Row="0" Grid.Column="0" Click="click" Content="Print"/>
            <Button Grid.Row="0" Grid.Column="1" Content="Sticky" Width="50" HorizontalAlignment="Left"
                    Command="ann:AnnotationService.CreateTextStickyNoteCommand"
                    CommandTarget="{Binding ElementName=docViewer}"/>
            <DocumentViewer Grid.Row="1" Grid.ColumnSpan="2" Document="{Binding Path=FixedDocSeq}" Name="docViewer"/>
        </Grid>
    </Window>
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Xps;
    using System.Windows.Annotations;
    using System.IO;
    using System.Xml;
    
    
    
    namespace APSannotate
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            AnnotationService _annotService;
            //FileStream _annotStream;
            System.Windows.Annotations.Storage.XmlStreamStore _annotStore;
            System.Windows.Xps.Packaging.XpsDocument xpsDoc;
            //MemoryStream _streamAnnoMem;
            public MainWindow()
            {
                this.DataContext = this;
                xpsDoc = new System.Windows.Xps.Packaging.XpsDocument(@"c:\temp\ann.xps", System.IO.FileAccess.Read);
                InitializeComponent();
    
            }
            public FixedDocumentSequence FixedDocSeq
            {
                get { return xpsDoc.GetFixedDocumentSequence(); }
            }
    
            private void click(object sender, RoutedEventArgs e)
            {
                PrintDialog printDialog = new PrintDialog();
                bool? result = printDialog.ShowDialog();
                if (result != null && result.Value)
                {
                    DocumentPaginator documentPaginator = FixedDocSeq.DocumentPaginator;
                    printDialog.PrintDocument(documentPaginator, "documentPaginator");
    
                    AnnotationService service = AnnotationService.GetService(docViewer);
                    AnnotationDocumentPaginator annotationDocumentPaginator = new AnnotationDocumentPaginator(documentPaginator, service.Store);
                    printDialog.PrintDocument(annotationDocumentPaginator, "annotationDocumentPaginator");
                }
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                StartAnnotations();
            }
            private void StartAnnotations()
            {
                // If there is no AnnotationService yet, create one.
                if (_annotService == null)
                    // docViewer is a document viewing control named in Window1.xaml.
                    _annotService = new AnnotationService(docViewer);
    
                // If the AnnotationService is currently enabled, disable it.
                if (_annotService.IsEnabled == true)
                    _annotService.Disable();
    
                // Open a stream to the file for storing annotations.
                //_annotStream = new FileStream(@"c:\temp\annoStore", FileMode.OpenOrCreate, FileAccess.ReadWrite);
                // Create an AnnotationStore using the file stream.
                //_annotStore = new System.Windows.Annotations.Storage.XmlStreamStore(_annotStream);
    
                MemoryStream _streamAnnoMem = new MemoryStream();
                _annotStore = new System.Windows.Annotations.Storage.XmlStreamStore(_streamAnnoMem);
    
                // Enable the AnnotationService using the new store.
                _annotService.Enable(_annotStore);
            }// end:StartAnnotations()
        }
    }