2017-08-29 41 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支持該選項,您應該嘗試指明已經確認的特定字體(而非家族),並且支持您選擇的變體。

祝你好運!