2016-04-19 9 views
1

AngularとPDF.jsを使用して、SQLデータベースにバイナリデータで保存されたPDFを表示しようとしています。サービスから返されたデータは、次のようになります。Angularjs Byte Array to Blob

enter image description here

は基本的に、私はそれを動作させるためにいるObjectURLを作成する必要があると信じているが、私は、BLOBに変換するかどうかはわかりません。私は、次のことを試してみました:

 .success(function (response) { 
     var fileName = response[0].FileName; 
     var fileImage = response[0].binFileImage; 
     var blob = new Blob(fileImage, { type: 'application/pdf' }); 
     var fileURL = URL.createObjectURL(blob); 

私は、画像ファイルを変換するには、次の使用:私はPDFのためにそれを使用してみましたが、それは正しい形式であれば、私はよく分からない

function base64ArrayBuffer(arrayBuffer) { 
    var base64 = '' 
    var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/' 

    var bytes = new Uint8Array(arrayBuffer) 
    var byteLength = bytes.byteLength 
    var byteRemainder = byteLength % 3 
    var mainLength = byteLength - byteRemainder 

    var a, b, c, d 
    var chunk 

    // Main loop deals with bytes in chunks of 3 
    for (var i = 0; i < mainLength; i = i + 3) { 
     // Combine the three bytes into a single integer 
     chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2] 

     // Use bitmasks to extract 6-bit segments from the triplet 
     a = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18 
     b = (chunk & 258048) >> 12 // 258048 = (2^6 - 1) << 12 
     c = (chunk & 4032) >> 6 // 4032  = (2^6 - 1) << 6 
     d = chunk & 63    // 63  = 2^6 - 1 

     // Convert the raw binary segments to the appropriate ASCII encoding 
     base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d] 
    } 

    // Deal with the remaining bytes and padding 
    if (byteRemainder == 1) { 
     chunk = bytes[mainLength] 

     a = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2 

     // Set the 4 least significant bits to zero 
     b = (chunk & 3) << 4 // 3 = 2^2 - 1 

     base64 += encodings[a] + encodings[b] + '==' 
    } else if (byteRemainder == 2) { 
     chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1] 

     a = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10 
     b = (chunk & 1008) >> 4 // 1008 = (2^6 - 1) << 4 

     // Set the 2 least significant bits to zero 
     c = (chunk & 15) << 2 // 15 = 2^4 - 1 

     base64 += encodings[a] + encodings[b] + encodings[c] + '=' 
    } 

    return base64 
} 

を。私は、私はPDFファイルを表示できるように、私は、オブジェクトのURLを作成するためにそれを使用できるようにデータを変換するために何をする必要があるか本当にわからないんだけど

JVBERi0xLjQNCiX5+prnDQo3IDAgb2JqDQo8PA0KL0UgMzU0ODENCi9IIFsgMTM3OCAxNjMgXQ0KL0wgMzc3NzkNCi9MaW5lYXJpemVkIDENCi9OIDINCi9PIDEwDQovVCAzNzU4OQ0KPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmVuZG9iag0KDQp4cmVmDQo3IDExDQowMDAwMDAwMDE3IDAwMDAwIG4NCjAwMDAwMDEyN... (shortened). 

:上記の機能はにバイト配列に変換します。どんな支援も大歓迎です!

+0

Blobの場合、配列の配列が必要です。 'var blob = new Blob([fileImage]、{type: 'application/pdf'});'。また、pdf.jsはバイナリデータ配列を入力としても使用できます。 – async5

+0

私はInvalidStateErrorをスローするようにしました。最初にfileImageを別のものに変換する必要がありますが、私は何か、または何も知らないのです。 –

答えて

6

これはおそらく簡単な方法ですが、これはIEとChromeで機能します。

  1. まず、バイト配列をbase64に変換しました。
  2. 次は、base64をUint8Arrayに変換しました。
  3. 次に、ファイルを表示します。ここで

私のために働いていたコードは次のとおりです。

lwsService.getdocument(id) 
    .success(function (response) { 
     var byteArray = new Uint8Array(response[0].binFileImage); 
     var blob = new Blob([byteArray], { type: 'application/pdf' }); 
     if (window.navigator && window.navigator.msSaveOrOpenBlob) { 
      window.navigator.msSaveOrOpenBlob(blob); 
     } else { 
      var objectUrl = URL.createObjectURL(blob); 
      window.open(objectUrl); 
     } 

私は、これは他の誰かに役立ちます願っています。

+0

新しいUint8Array(レスポンス[0] .binFileImage) 'を実行できますか? – async5

+0

はい。ありがとうございました! –

+0

私にとって、現在の答えはうまくいかなかったが、編集されたもの(すべての配列を持つ)が私をたくさん助けてくれた。ありがとう! –

0

次の例を試してください。それはFileSaverを使用しています。

var blob = new Blob([content], {type: 'application/octet-stream'}); 
saveAs(blob, "yourFile.pdf"); 
+0

ファイルを保存しようとしていません。私はそれを見ようとしている。 –