3

imageテーブルの 1 つに、XPS ドキュメントの生のバイナリ データを格納するタイプ列がある SQLCE データベースを扱っています。

このデータを に読み込みbyte[]、次のようにディスクに保存します。

File.WriteAllBytes(myPath, myByteArray);

これは機能します。でファイルをダブルクリックしmyPathて、Microsoft XPS Viewer で表示できます。ZIP ファイルとして名前を変更すると、WinZip で開くことができます。

しかし、次のように、まったく同じファイルを WPF アプリの DocumentViewer に読み込もうとすると、次のようになります。

var xpsDocument = new XpsDocument(myPath, FileAccess.Read);
var sequence = xpsDocument.GetFixedDocumentSequence();
// ...

次の例外を除いて、最初の行で失敗します。

File contains corrupted data.

A System.IO.FileFormatException occurred
   at MS.Internal.IO.Zip.ZipIOEndOfCentralDirectoryBlock.FindPosition(Stream archiveStream)
   at MS.Internal.IO.Zip.ZipIOEndOfCentralDirectoryBlock.SeekableLoad(ZipIOBlockManager blockManager)
   at MS.Internal.IO.Zip.ZipArchive..ctor(Stream archiveStream, FileMode mode, FileAccess access, Boolean streaming, Boolean ownStream)
   at MS.Internal.IO.Zip.ZipArchive.OpenOnFile(String path, FileMode mode, FileAccess access, FileShare share, Boolean streaming)
   at System.IO.Packaging.ZipPackage..ctor(String path, FileMode mode, FileAccess access, FileShare share, Boolean streaming)
   at System.IO.Packaging.Package.Open(String path, FileMode packageMode, FileAccess packageAccess, FileShare packageShare, Boolean streaming)
   at System.Windows.Xps.Packaging.XpsManager..ctor(String path, FileAccess packageAccess, CompressionOption compressionOption)
   at System.Windows.Xps.Packaging.XpsDocument..ctor(String path, FileAccess packageAccess, CompressionOption compressionOption)

ファイルが Microsoft XPS Viewer / WinZip で開く理由がわかりません (実際には破損していないことを示唆しています) が、私のコードではありません。

そしてイライラすることに、それは一貫していません。データベース内の一部の値では機能しますが、他の値では機能しません。(どの値が失敗し、どの値が失敗しないかは一貫していますが)。

誰かが以前にこの問題に遭遇したことがありますか、または理由/修正を知っていますか?

4

1 に答える 1

0

おそらく、バイトをストリームとして読み取り、xps パッケージを使用する必要があります。この解決策は私のために働いた:

var webClient = new System.Net.WebClient();
var data = webClient.DownloadData(myPath);
var package = System.IO.Packaging.Package.Open(new System.IO.MemoryStream(data));
var xpsDocument = new System.Windows.Xps.Packaging.XpsDocument(package,
                                                          System.IO.Packaging.CompressionOption.SuperFast,
                                                          myPath);
var sequence = xpsDocument.GetFixedDocumentSequence();
于 2015-07-01T10:13:06.023 に答える