2011-08-02 7 views
1

私はComponentOne(C1)Silverlight PDFビューアコントロールを使用しています。 "Stream"を受け入れる "LoadDocument"メソッドがあります。PDFビューアに読み込むために、PDFファイルのオリジナルソースのbyte []をMemoryStreamに変換しますか? (コンポーネント1)

クライアントアプリケーションからHTTPドキュメントを取得するコールを行っています。 このドキュメントは、サーバー側で、File.ReadAllBytes()でストリーミングされてから、Convert.ToBase64String()を使用してbase64文字列に変換されています。 この文字列は、ワイヤを介して私のSilverlightアプリケーションに戻され、そこで逆変換され、Convert.FromBase64String(val)を持つバイト配列に逆変換されます。 次に、そのバイト配列を持つMemoryStreamを作成し、そのメモリストリームに "LoadDocument()"を渡します。

ビューアは何も描画していません。ツールバーとスクロールバーが表示されますが、内容は空白で保存ボタンはグレー表示されているため、ロードされているドキュメントがないことを示しています。 クライアント上のバイト配列のサイズがサーバー側でのバイト配列の変換前の変換と一致するため、特定のファイルを特定できます。ここで

は私のコードです:(時間/空間の利益のために、私はなど、検証の除去、切り捨てられました)

サーバーサイド

string sendingToClient = Convert.ToBase64String(File.ReadAllBytes(filePath)) 

クライアント側

byte[] image = null; 
image = Convert.FromBase64String(stringFromServerCall); 
MemoryStream stream = new MemoryStream(image); 
docViewer.LoadDocument(stream); 

edit潜在的な回避策として、私はファイルを ".pdf"拡張子の隔離されたストレージに保存しようとしました。次に、IsolatedStorageFileStreamを使用してLoadDocument()に送信します。 実際のエラーになりました。「PdfParserExceptionはユーザーコードによって処理されませんでした:無効なファイル形式(PDFヘッダーがありません)」

誰でもこのPDFヘッダーを確認できますか?

+0

なぜそれをbase64でエンコードしていますか?それはただダウンロードサイズを膨らませますが、私はそれにいかなる利益も見られません。 – AnthonyWJones

+0

既存のコードロジック。このAPIレイヤーを使用する既存のデプロイされたアプリケーションを壊す恐れがあるため、変更するのは嫌です。私は全く新しいAPIエントリポイントを作成することができます。 –

+1

新しいものを作成し、古いものを非難してください。 – AnthonyWJones

答えて

2

を行う必要がありますが、私が行ってしまうの実験です。

ボタンをXamlに追加し、OpenFileDialogをクリックしてFileInfoを取得します。そのFileInfoからそのOpenメソッドを使用してストリームを取得し、それをdocViewer.LoadDocumentに渡します。

これを実行し、ボタンをクリックして、サーバーから送信しようとしているものと同じPDFドキュメントを選択します。

成功した場合は、引き続きサーバーのストリーミング戦略を調査する必要があります。一方、同じ問題がまだ残っていれば、それ以上の生身は得られません。他のPDFファイルを試して、PDFコンポーネントの調査を開始してください。実際にそれを実際に使ったことがありますか?

+0

私は別のテストを試みました。私がしたことは、前のコメントであなたが提案したことでした。私はエンコードされた文字列ではなく、バイト[]を返すセカンダリAPIを追加しました。これはうまくいった。だから、byte []をbase64文字列にエンコードすると、何とかそれが壊れてしまったり、フォーマットが混乱したりしてしまいました。どうも。 –

+0

@ghost_mv、ここにあなたのコードを載せてください、私は同じ問題がありますか? –

0

あなたが戻って0にストリームポインタを取得する必要がありますので、これはここでトリックに

byte[] image = null; 
image = Convert.FromBase64String(stringFromServerCall); 
MemoryStream stream = new MemoryStream(image); 
stream.Position = 0; 
docViewer.LoadDocument(stream); 
+0

私は両方を試みただけでなく、stream.Seek(0、SeekOrigin.Begin);それは空白のビューアと同じ結果をもたらした... –

+0

あなたはバイト配列のサイズを述べた、ストリームについては何ですか?長さ? – Musaab

+0

File.ReadAllBytes()を使用しているため、サーバー側のストリームの長さにアクセスできません。FileStreamではなく、ブレークポイントを近くに設定しています。 –

関連する問題