Skip to content

Printing XPS files fails on Windows 8.1 #2106

Open
@pieterphilippaerts

Description

@pieterphilippaerts

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?

Metadata

Metadata

Assignees

Labels

BugProduct bug (most likely)regressionstatus: This issue is a regression from a previous build or release

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions