XpsDocumentWriter выдает ошибку «Сжатая часть имеет несогласованную длину данных» при записи ()

#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.