Description
Hi everyone,
I'm using .NET Core 3 to print XPS files. The code I have is simple and working perfectly on Windows 7 and Windows 10, but it fails on Windows 8.1 (multiple machines, both 32-bit and 64-bit).
I've tried a number of different variations of the printing code, but here's a simple example:
var pd = new PrintDialog();
if (pd.ShowDialog() == true) {
var tdoc = new XpsDocument(@"<SOMEPATH>\temp.xps", FileAccess.ReadWrite);
pd.PrintDocument(tdoc.GetFixedDocumentSequence().DocumentPaginator, "temp.xps");
}
This code works perfectly on Windows 7 and Windows 10, but on Window 8.1 I always get the following exception:
System.IO.IOException: Cannot retrieve parts of writeonly container
at System.IO.Packaging.Package.ThrowIfWriteOnly()
at System.IO.Packaging.Package.GetRelationshipsByType(String relationshipType)
at System.Windows.Xps.Packaging.XpsManager.GetXpsDocumentStartingPart(Package package)
at System.Windows.Xps.Packaging.XpsDocument.AddFixedDocumentSequence()
at System.Windows.Xps.Serialization.XpsPackagingPolicy.AcquireXmlWriterForFixedDocumentSequence()
at System.Windows.Xps.Serialization.XpsSerializationManager.AcquireXmlWriter(Type writerType)
at System.Windows.Xps.Serialization.DocumentSequenceSerializer.get_XmlWriter()
at System.Windows.Xps.Serialization.DocumentSequenceSerializer.PersistObjectData(SerializableObjectContext serializableObjectContext)
at System.Windows.Xps.Serialization.ReachSerializer.SerializeObject(Object serializedObject)
at System.Windows.Xps.Serialization.XpsSerializationManager.SaveAsXaml(Object serializedObject)
at System.Windows.Xps.XpsDocumentWriter.SaveAsXaml(Object serializedObject, Boolean isSync)
at System.Windows.Xps.XpsDocumentWriter.Write(DocumentPaginator documentPaginator, PrintTicket printTicket)
at System.Windows.Controls.PrintDialog.PrintDocument(DocumentPaginator documentPaginator, String description)
I don't see any problems with the code, and the exact same code is actually working on Windows 8.1 if I use it in the full .NET Framework!! So this looks like a bug in .NET Core 3 (specifically on Windows 8.1).
Also note that I've really tried many variations of the printing code (including PrintDialog.PrintVisual, PrintQueue.AddJob, XpsDocumentWriter.Write, XpsDocumentWriter.WriteAsync, creating the XpsDocument in memory instead of from a file, ...), but none of them worked on Windows 8.1 and I always get similar exceptions, for example:
System.IO.IOException: Cannot retrieve parts of writeonly container
at System.IO.Packaging.Package.ThrowIfWriteOnly()
at System.IO.Packaging.Package.GetRelationshipsByType(String relationshipType)
at System.Windows.Xps.Packaging.XpsManager.GetXpsDocumentStartingPart(Package package)
at System.Windows.Xps.Packaging.XpsDocument.AddFixedDocumentSequence()
at System.Windows.Xps.Serialization.XpsPackagingPolicy.AcquireXmlWriterForFixedDocumentSequence()
at System.Windows.Xps.Serialization.XpsSerializationManager.AcquireXmlWriter(Type writerType)
at System.Windows.Xps.Serialization.ReachHierarchySimulator.SimulateBeginFixedDocumentSequence()
at System.Windows.Xps.Serialization.ReachHierarchySimulator.BeginConfirmToXPSStructure(Boolean mode)
at System.Windows.Xps.Serialization.XpsSerializationManager.SaveAsXaml(Object serializedObject)
at System.Windows.Xps.XpsDocumentWriter.SaveAsXaml(Object serializedObject, Boolean isSync)
at System.Windows.Xps.XpsDocumentWriter.Write(Visual visual, PrintTicket printTicket)
at System.Windows.Controls.PrintDialog.PrintVisual(Visual visual, String description)
This issue seems to be related to issue 597 (#597). this appears to be the exact same problem, however issue 597 was closed and marked as fixed.
If I execute the exact same code as the author of issue 597 (i.e. "PrintQueue.CreateXpsDocumentWriter(LocalPrintServer.GetDefaultPrintQueue()).Write(visual);"), I get the exact exception he got:
System.IO.IOException: Cannot retrieve parts of writeonly container
at System.IO.Packaging.Package.ThrowIfWriteOnly()
at System.IO.Packaging.Package.GetRelationshipsByType(String relationshipType)
at System.Windows.Xps.Packaging.XpsManager.GetXpsDocumentStartingPart(Package package)
at System.Windows.Xps.Packaging.XpsDocument.AddFixedDocumentSequence()
at System.Windows.Xps.Serialization.XpsPackagingPolicy.AcquireXmlWriterForFixedDocumentSequence()
at System.Windows.Xps.Serialization.XpsSerializationManager.AcquireXmlWriter(Type writerType)
at System.Windows.Xps.Serialization.ReachHierarchySimulator.SimulateBeginFixedDocumentSequence()
at System.Windows.Xps.Serialization.ReachHierarchySimulator.BeginConfirmToXPSStructure(Boolean mode)
at System.Windows.Xps.Serialization.XpsSerializationManager.SaveAsXaml(Object serializedObject)
at System.Windows.Xps.XpsDocumentWriter.SaveAsXaml(Object serializedObject, Boolean isSync)
at System.Windows.Xps.XpsDocumentWriter.Write(Visual visual)
Is it possible that the fix for issue 597 isn't working on Windows 8.1 for some reason?