c# xpsdocument

c# - FileFormatException al serializar un FixedDocument



xpsdocument (1)

Código fuente en cuestión

Los comentarios en el código fuente parecen indicar que esto llama código nativo. El controlador de fuente necesita acceso a la fuente declarada. No todas las fuentes admiten todas las variaciones. Debe confirmar que la familia de fuentes que ha elegido está instalada y es compatible con cursiva .

Si la API es compatible con la opción, debe intentar indicar una fuente específica (en lugar de una familia) que ya ha confirmado que está instalada y admite las variaciones que ha elegido.

¡Buena suerte!

Al serializar un FixedDocument a XPS, a veces recibo una FileFormatException que me indica que el formato de una fuente (supongo) no se ajusta a la especificación de formato de archivo esperada (consulte la excepción más abajo).

La parte misteriosa es:

  • La excepción solo sucederá de vez en cuando.
  • Solo sucederá con ciertas combinaciones de FontFamily / Style / Weight (Segoe UI en cursiva y negrita parece activarlo)

¿Alguien sabe por qué sucede esto (y especialmente por qué no ocurre de manera consistente, pero solo en intervalos impredecibles)?

El siguiente ejemplo reproducible mínimo activará la excepción de 4 a 5 veces por ejecución (en mi máquina con Windows 10, ocurre con .NET 4, 4.6.1, etc.):

private void TestXpsSerialization(object a) { for (int i = 0; i < 400; ++i) { TextBlock block = new TextBlock { Text = "Test", FontFamily = new FontFamily("Segoe UI"), FontStyle = FontStyles.Italic, FontWeight = FontWeights.Bold, Background = null, FontSize = 12 }; FixedDocument fixedDoc = new FixedDocument(); PageContent pageContent = new PageContent(); FixedPage fixedPage = new FixedPage(); fixedPage.Children.Add(block); ((IAddChild) pageContent).AddChild(fixedPage); fixedDoc.Pages.Add(pageContent); using (MemoryStream documentStream = new MemoryStream()) { string inMemoryPackageName = string.Format("memorystream://{0}.xps", Guid.NewGuid()); Uri packageUri = new Uri(inMemoryPackageName); using (Package package = Package.Open(documentStream, FileMode.CreateNew)) { MemoryStream resultStream = new MemoryStream(); PackageStore.AddPackage(packageUri, package); using (XpsDocument xpsd = new XpsDocument(package, CompressionOption.Maximum, inMemoryPackageName)) { XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsd); writer.Write(fixedDoc); package.Flush(); using (MemoryStream outputStream = new MemoryStream()) { SerializerWriter serializerWriter = new XpsSerializerFactory().CreateSerializerWriter(outputStream); bool success = true; try { serializerWriter.Write(xpsd.GetFixedDocumentSequence()); } catch (Exception e) { success = false; Debug.WriteLine(e); } if (success) { outputStream.Seek(0, SeekOrigin.Begin); outputStream.CopyTo(resultStream); } } } PackageStore.RemovePackage(packageUri); Debug.WriteLine(resultStream.Length); } } } }

Se levanta la siguiente excepción (disculpen el alemán):

Ausnahme ausgelöst: "System.IO.FileFormatException" in PresentationCore.dll System.IO.FileFormatException: Die Datei "pack://memorystream:,,62db450e-87fe-4246-a727-15ab02c5c55e.xps,/Resources/34890974-3e2d-4baf-9003-24c3375636b0.ODTTF" entspricht nicht der erwarteten Dateiformatspezifikation. bei MS.Internal.TrueTypeSubsetter.ComputeSubset(Void* fontData, Int32 fileSize, Uri sourceUri, Int32 directoryOffset, UInt16[] glyphArray) bei MS.Internal.FontFace.TrueTypeFontDriver.ComputeFontSubset(ICollection`1 glyphs) bei System.Windows.Media.GlyphTypeface.ComputeSubset(ICollection`1 glyphs) bei System.Windows.Xps.Serialization.FEMCacheItem.SubSetFont(ICollection`1 glyphs, Stream stream) bei System.Windows.Xps.Serialization.FEMCacheItem.Commit() bei System.Windows.Xps.Serialization.XpsFontSubsetter.CommitFontSubsetsSignal(FontSubsetterCommitPolicies signal) bei System.Windows.Xps.Serialization.XpsFontSerializationService.SignalCommit(Type type) bei System.Windows.Xps.Serialization.XpsSerializationManager.ReleaseXmlWriter(Type writerType) bei System.Windows.Xps.Serialization.DocumentSequenceSerializer.set_XmlWriter(XmlWriter value) bei System.Windows.Xps.Serialization.DocumentSequenceSerializer.PersistObjectData(SerializableObjectContext serializableObjectContext) bei System.Windows.Xps.Serialization.ReachSerializer.SerializeObject(Object serializedObject) bei System.Windows.Xps.Serialization.XpsSerializationManager.SaveAsXaml(Object serializedObject) bei System.Windows.Xps.XpsDocumentWriter.SaveAsXaml(Object serializedObject, Boolean isSync) bei System.Windows.Xps.XpsDocumentWriter.Write(FixedDocumentSequence fixedDocumentSequence) bei System.Windows.Xps.Serialization.XpsSerializerWriter.Write(FixedDocumentSequence fixedDocumentSequence)

La primera línea se puede traducir a:

"System.IO.FileFormatException" in PresentationCore.dll System.IO.FileFormatException: "pack://memorystream:,,62db450e-87fe-4246-a727-15ab02c5c55e.xps,/Resources/34890974-3e2d-4baf-9003-24c3375636b0.ODTTF" file does not conform to the expected file format specification.