#c# #.net #xps
#c# #.net #xps
Вопрос:
Я пытаюсь написать документ XPS. В настоящее время «doc» является FixedDocument с одним объектом PageContent с дочерним типом FixedPage с 7 UIElements в качестве «дочерних». Это выдает
error Message "Compressed part has inconsistent data length."
Вот пример
private FixedDocument Document;
private DocumentViewer Viewer;
private FixedPage Page;
private PageContent Content;
Во-первых, я успешно сбрасываю документ и средство просмотра:
private void ResetDocument()
{
Viewer = new DocumentViewer();
Document = new FixedDocument();
}
Я создаю одну новую страницу (я получаю одну и ту же ошибку для нескольких страниц)
public void NewPage()
{
Page = new FixedPage();
Content = new PageContent();
((IAddChild)Content).AddChild(Page);
Document.Pages.Add(Content);
}
Я успешно добавляю пользовательские элементы на страницу
public void AddVisualToPage(UIElement element)
{
Page.Children.Add(element);
}
Затем я получаю ошибку в этой части.
public void SaveCurrentDocument(string name)
{
Viewer.Document = Document;
string xpspath = Path.Combine(ReportsPath, name ".xps");
var doc = (FixedDocument) Viewer.Document;
var xpsd = new XpsDocument(xpspath, FileAccess.ReadWrite);
XpsDocumentWriter xw = XpsDocument.CreateXpsDocumentWriter(xpsd);
xw.Write(doc); //THIS IS THE LINE WHERE I GET THE ERROR
xpsd.Close();
}
Вот моя трассировка стека.
at MS.Internal.IO.Packaging.CompressStream.UpdateUncompressedDataLength(Int64 dataLength)
at MS.Internal.IO.Packaging.CompressStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at MS.Internal.IO.Zip.Crc32Calculator.CalculateStreamCrc(Stream stream)
at MS.Internal.IO.Zip.ProgressiveCrcCalculatingStream.CalculateCrc()
at MS.Internal.IO.Zip.ZipIOLocalFileBlock.UpdateReferences(Boolean closingFlag)
at MS.Internal.IO.Zip.ZipIOBlockManager.SaveContainer(Boolean closingFlag)
at MS.Internal.IO.Zip.ZipIOBlockManager.SaveStream(ZipIOLocalFileBlock blockRequestingFlush, Boolean closingFlag)
at MS.Internal.IO.Zip.ZipIOFileItemStream.Flush()
at MS.Internal.IO.Packaging.CompressStream.Flush()
at MS.Internal.IO.Packaging.CompressStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at MS.Internal.IO.Zip.ZipIOLocalFileBlock.Dispose(Boolean disposing)
at MS.Internal.IO.Zip.ZipIOBlockManager.RemoveLocalFileBlock(ZipIOLocalFileBlock localFileBlock)
at MS.Internal.IO.Zip.ZipArchive.DeleteFile(String zipFileName)
at System.IO.Packaging.ZipPackage.IgnoredItemHelper.Delete(ValidatedPartUri partUri)
at System.IO.Packaging.ZipPackage.CreatePartCore(Uri partUri, String contentType, CompressionOption compressionOption)
at System.IO.Packaging.Package.CreatePart(Uri partUri, String contentType, CompressionOption compressionOption)
at System.Windows.Xps.Packaging.XpsManager.GeneratePart(ContentType contentType, Uri partUri)
at System.Windows.Xps.Packaging.XpsManager.GenerateUniquePart(ContentType contentType)
at System.Windows.Xps.Packaging.XpsDocument.AddFixedDocumentSequence()
at System.Windows.Xps.Serialization.XpsPackagingPolicy.AcquireXmlWriterForFixedDocumentSequence()
at System.Windows.Xps.Serialization.XpsSerializationManager.AcquireXmlWriter(Type writerType)
at System.Windows.Xps.Serialization.ReachHierarchySimulator.SimulateBeginFixedDocumentSequence()
at System.Windows.Xps.Serialization.ReachHierarchySimulator.BeginConfirmToXPSStructure(Boolean mode)
at System.Windows.Xps.Serialization.XpsSerializationManager.SaveAsXaml(Object serializedObject)
at System.Windows.Xps.XpsDocumentWriter.SaveAsXaml(Object serializedObject, Boolean isSync)
at System.Windows.Xps.XpsDocumentWriter.Write(FixedDocument fixedDocument)
Я довольно смущен относительно того, в чем может заключаться проблема… Я не совсем понимаю, почему он вообще что-либо сжимает (я предполагаю, что XPS использует сжатые данные?), А тем более, почему длина данных несогласованна.
Спасибо за помощь!
Комментарии:
1. Код выглядит в основном нормально, хотя это странный способ получить это
doc
значение. Для начала убедитесь, что этоdoc
неnull
так, затем проверьте документ каким-либо другим способом (загрузите его в активный просмотрщик на экране).2. Часть 2: Я замечаю, что ошибка происходит внутри
ZipArchive.DeleteFile()
, может быть, целевой файл уже существует? И, возможно, неисправен из-за предыдущих запусков отладки? Начните с чистого листа, сначала используйтеFile.Delete()
.3. Итак, для первой части значение doc не равно null. Похоже на это, страницы и еще раз страницы. Все дочерние элементы были созданы правильно. Я проверю файл. Удалить() вещь.
4. Эта ошибка прекратилась, когда я изменил имя файла xps. Что странно, потому что там не было никакого файла, но, возможно, скрытый временный zip-файл из предыдущего запуска отладки?
5. Да, вы могли бы использовать другой filemanager (мой любимый Total COmmander), чтобы убедиться. Или настройте Explorer.