2011-08-02 38 views
1

我正在使用ComponentOne(C1)Silverlight PDF查看器控件。 它有一個「LoadDocument」方法,它接受一個「Stream」。將PDF文件原始源的byte []轉換爲MemoryStream以加載到PDF查看器中? (組件1)

我正在從我的客戶端應用程序進行HTTP獲取調用以獲取PDF文檔。 該文檔在服務器端已通過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); 

編輯作爲潛在的解決方法,我試圖用「.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

您提到了字節數組大小,那麼stream.Length呢? – Musaab

+0

我沒有訪問服務器端的流長度,因爲它使用的是File.ReadAllBytes(),而不是公開給我公開的用於設置臨近斷點的FileStream。 –