{"record":{"id":"d1a58b8db5b42559","repo":"dotnet/wpf","slug":"printticket-was-already-committed","errorCode":null,"errorMessage":"PrintTicket was already committed.","messagePattern":"PrintTicket was already committed\\.","errorType":"exception","errorClass":"XpsPackagingException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsFixedDocumentSequenceReaderWriter.cs","lineNumber":240,"sourceCode":"        /// <exception cref=\"SR.ReachPackaging_PrintTicketAlreadyCommitted\">PrintTicket has already been committed.</exception>\n        /// <exception cref=\"SR.ReachPackaging_NotAPrintTicket\">Property is not a valid PrintTicket instance.</exception>\n        public PrintTicket PrintTicket\n        {\n            get\n            {\n                if( _printTicket == null )\n                {\n                    _printTicket = CurrentXpsManager.EnsurePrintTicket(Uri);\n                }\n                return _printTicket;\n            }\n            set\n            {\n                if(value != null)\n                {\n                    if (_isPrintTicketCommitted)\n                    {\n                        throw new XpsPackagingException(SR.ReachPackaging_PrintTicketAlreadyCommitted);\n                    }\n                    if (!value.GetType().Equals(typeof(PrintTicket)))\n                    {\n                        throw new XpsPackagingException(SR.ReachPackaging_NotAPrintTicket);\n                    }\n                    _printTicket = value.Clone();\n                }\n                else\n                {\n                    _printTicket = null;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets a collection of all fixed documents that are contained within\n        /// this document sequence.\n        /// </summary>","sourceCodeStart":222,"sourceCodeEnd":258,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsFixedDocumentSequenceReaderWriter.cs#L222-L258","documentation":"The PrintTicket setter of XpsFixedDocumentSequenceReaderWriter throws XpsPackagingException (ReachPackaging_PrintTicketAlreadyCommitted) when a non-null ticket is assigned after the print ticket was already committed to the package. Once committed, the sequence-level ticket part is sealed and cannot be replaced via this property.","triggerScenarios":"Setting PrintTicket on XpsFixedDocumentSequenceReaderWriter after CommitContent/Commit wrote the sequence's ticket part.","commonSituations":"Document-sequence-level print settings applied after generation began; reusing one sequence writer for multiple jobs; late user changes to print options in a batch pipeline.","solutions":["Assign the PrintTicket before committing the document sequence.","If settings changed after commit, recreate the XpsFixedDocumentSequenceWriter/package with the new ticket.","Collect all job print settings up front, set once, then commit."],"exampleFix":"// before\nseq.PrintTicket = ticket;\nseq.CommitContent();\nseq.PrintTicket = newTicket; // throws\n// after\nseq.PrintTicket = newTicket;\nseq.CommitContent();","handlingStrategy":"validation","validationCode":"if (seqTicketSet && seqCommitted) throw new Exception(\"PrintTicket already committed; recreate the sequence writer.\");","typeGuard":null,"tryCatchPattern":"try { seq.PrintTicket = newTicket; }\ncatch (XpsPackagingException) { /* ticket committed: recreate package/sequence writer */ }","preventionTips":["Set sequence PrintTicket before CommitContent.","Never reuse committed sequence writers.","Freeze print options before starting generation."],"tags":["wpf","xps","printticket","invalid-state"],"backgroundTag":"invalid-state-transition","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-22T01:17:13.364Z"}