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.
您是否已將xaml中的文化設置設置爲德語?即'xml:lang =「de-DE」'。 – XAMlMAX
@XAMlMAX感謝您的建議,我不太確定這將如何幫助,但儘管如此嘗試沒有任何成功。 – Daniel
我可以重現。如果我刪除了'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/ –