dotnet / wpf

WPF is a .NET Core UI framework for building Windows desktop applications.
MIT License
7.07k stars 1.17k forks source link

Printing XPS files fails on Windows 8.1 #2106

Open pieterphilippaerts opened 5 years ago

pieterphilippaerts commented 5 years ago

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 (https://github.com/dotnet/wpf/issues/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?

sandeep200321 commented 4 years ago

hi I am also facing a print issue in windows 8.1. Could you please confirm if this is related issue ? Link is below. If so can it be delivered early in .net version 3.1 ?

https://developercommunity.visualstudio.com/content/problem/1017810/print-issue-in-wpf-net-core-30-screen-hangs.html

wstaelens commented 4 years ago

https://github.com/dotnet/wpf/issues/1363

is this already fixed? (server2012r2)

ryalanms commented 3 years ago

This needs to be backported to 3.1 from 6.0.

wstaelens commented 3 years ago

2 years later ha! 7.0.0 milestone 😢