{"record":{"id":"624809c50a037e26","repo":"dotnet/wpf","slug":"printingcanceledexception","errorCode":null,"errorMessage":"PrintingCanceledException","messagePattern":"PrintingCanceledException","errorType":"exception","errorClass":"PrintingCanceledException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/XpsOMPackagingPolicy.cs","lineNumber":126,"sourceCode":"        StartNewDocument()\n        {\n            try\n            {\n                Uri uri = _xpsManager.GenerateUniqueUri(XpsS0Markup.FixedDocumentContentType);\n                _currentFixedDocumentUri = uri;\n                IOpcPartUri partUri = GenerateIOpcPartUri(uri);\n                if (_currentDocumentPrintTicket == null)\n                {\n                    _currentDocumentPrintTicket = new PrintTicket();\n                }\n                IXpsOMPrintTicketResource printTicketResource = GeneratePrintTicketResource(XpsS0Markup.FixedDocumentContentType, _currentDocumentPrintTicket);\n                _currentFixedDocumentSequenceWriter.StartNewDocument(partUri, printTicketResource, null, null, null);\n                _currentFixedDocumentWriterRef++;\n            }\n            catch (COMException)\n            {\n                Invalidate();\n                throw new PrintingCanceledException();\n            }\n        }\n\n        internal\n        void\n        ReleaseXpsOMWriterForFixedDocument()\n        {\n            if (_currentFixedDocumentWriterRef > 0)\n            {\n                _currentFixedDocumentWriterRef--;\n\n                if (_currentFixedDocumentWriterRef == 0)\n                {\n                    _currentDocumentPrintTicket = null;\n                    _currentFixedDocumentUri = null;\n                }\n            }\n        }","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/XpsOMPackagingPolicy.cs#L108-L144","documentation":"StartNewDocument calls IXpsOMPackageWriter.StartNewDocument through COM. Any COMException (invalid print ticket resource, part URI creation failure, writer already in a bad state, job cancelled) causes the policy to be invalidated and PrintingCanceledException to be thrown. This is the XpsOM path's uniform way of reporting that the print job can no longer proceed.","triggerScenarios":"Serialization calling StartNewDocument for a new FixedDocument when the COM package writer rejects the call — malformed/null _currentDocumentPrintTicket, spooler failure, cancelled job, or invalid part URI.","commonSituations":"Printer goes offline between pages/documents; PrintTicket contains settings unsupported by the driver causing COM failure; job cancelled by user while document is being written.","solutions":["Validate the PrintTicket against the PrintQueue capabilities (queue.GetPrintCapabilities) before writing.","Retry the entire print job; the policy is invalidated and cannot continue.","Catch PrintingCanceledException and report the job as cancelled/failed to the user.","Confirm the printer/driver is online and the spooler is healthy."],"exampleFix":"// before\nxpsWriter.Write(fixedDocSequence, printTicket); // throws PrintingCanceledException\n// after\nPrintQueue queue = ...;\nPrintCapabilities caps = queue.GetPrintCapabilities(printTicket);\nif (caps != null) { xpsWriter.Write(fixedDocSequence, printTicket); } // and catch PrintingCanceledException as job-cancel","handlingStrategy":"try-catch","validationCode":"var caps = printQueue.GetPrintCapabilities(printTicket); if (caps == null) throw new InvalidOperationException(\"PrintTicket incompatible with queue\");","typeGuard":"static bool TicketValid(PrintQueue q, PrintTicket t) => q.GetPrintCapabilities(t) != null;","tryCatchPattern":"try { xpsWriter.Write(seq, ticket); }\ncatch (PrintingCanceledException) { NotifyUser(\"Job cancelled or printer unavailable; retry the job.\"); }","preventionTips":["Validate PrintTicket against queue capabilities before writing","Monitor printer status during long jobs","Retry the whole job rather than resuming an invalidated policy","Keep drivers and spooler healthy"],"tags":["wpf","printing","com","xps"],"backgroundTag":"printing-canceled","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}