2017-08-29 38 views
20

将FixedDocument序列化为XPS时,我有时会得到一个FileFormatException,告诉我字体的格式(我假设)不符合预期的文件格式规范(请参阅下面的例外)。序列化FixedDocument时FileFormatException

神秘的部分是:

  • 例外只会在一段时间
  • 它只会发生在某些的FontFamily /风格/重量组合(的Segoe UI斜体发生一次大胆似乎触发它)

有人知道为什么会发生这种情况(特别是为什么它不一致,但只在不可预测的时间间隔内发生)?

以下最低可再现的例子将触发异常每次运行约4至5倍(我的Windows 10的机器上,情况与.NET 4,4.6.1等):

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); 
      } 
     } 
    } 
} 

以下异常升高(请原谅德国):

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) 

第一行可以翻译成:

"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. 
+0

您是否已将xaml中的文化设置设置为德语?即'xml:lang =“de-DE”'。 – XAMlMAX

+0

@XAMlMAX感谢您的建议,我不太确定这将如何帮助,但尽管如此尝试没有任何成功。 – Daniel

+1

我可以重现。如果我删除了'FontStyle = FontStyles.Italic',那么它可以工作......对我来说看起来像一个bug(你不是唯一的:https://www.questarter.com/q/odttf-file-does -not-conform-to-the-expected-file-format-specification-27_31339163.html),你应该向Microsoft Connect报告https://connect.microsoft.com/ –

回答

1

Source code in Question

注释的源代码似乎表明,这个调用本机代码。字体驱动程序需要访问已声明的字体。并非所有的字体都支持所有的变体。您应该确认您选择的字体系列已安装并支持斜体

如果api支持该选项,您应该尝试指明已经确认的特定字体(而非家族),并且支持您选择的变体。

祝你好运!