56

だからここで私の問題:私はサーバーから取得しているbase64文字列としてpdfファイルを持っています。この文字列を使用して、PDF をブラウザに直接表示するか、リンクをクリックしたときに「名前を付けて保存...」のオプションを提供したいと思います。ここで私が使用しているコード:

<!doctype>
<html>
<head>
   <title>jsPDF</title>
   <script type="text/javascript" src="../libs/base64.js"></script>
   <script type="text/javascript" src="../libs/sprintf.js"></script>
   <script type="text/javascript" src="../jspdf.js"></script>

       <script type="text/javascript">

        function demo1() {
            jsPDF.init();
            jsPDF.addPage();
            jsPDF.text(20, 20, 'Hello world!');
            jsPDF.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');

            // Making Data URI
            var out = jsPDF.output();
            var url = 'data:application/pdf;base64,' + Base64.encode(out);

            document.location.href = url;
         }
    </script>
</head>
<body>

<a href="javascript:demo1()">Run Code</a>

</body>
</html>

Chrome と Safari で問題なく動作します。Firefox は pdf を認識しますが、FF には拡張機能が存在する必要があるため表示されませんが、この場合、data-URI には何もありません。私がここで主張している理由は、クロムとサファリがそれを機能させるなら、FFとIEの解決策がなければならないということです

これに関連する質問がいくつかあることは知っていますが、実際には正確なものではなく、少し古いものもあります。サーバー側でPDFを生成することで回避できることはわかっていますが、クライアント側で生成したいと思います。

賢い人たちにお願いします。いくつかのハックまたは追加の JS ダウンロード プラグインによって可能ですか?

4

6 に答える 6

23

を使用してファイルをダウンロードできるはずです

window.open("data:application/pdf;base64," + Base64.encode(out));
于 2012-07-10T14:51:40.427 に答える
17

この質問は古いことは知っていますが、これを達成したいと思っていて、見ているうちに出くわしました。Internet Explorerの場合、ここのコードを使用して Blob を保存しました。base64 文字列からブロブを作成するには、このサイトに多くの結果があったため、特定のソースを思い出せない私のコードではありません。

function b64toBlob(b64Data, contentType) {
    contentType = contentType || '';
    var sliceSize = 512;
    b64Data = b64Data.replace(/^[^,]+,/, '');
    b64Data = b64Data.replace(/\s/g, '');
    var byteCharacters = window.atob(b64Data);
    var byteArrays = [];

    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        var slice = byteCharacters.slice(offset, offset + sliceSize);

        var byteNumbers = new Array(slice.length);
        for (var i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        var byteArray = new Uint8Array(byteNumbers);

        byteArrays.push(byteArray);
    }

    var blob = new Blob(byteArrays, {type: contentType});
    return blob;

リンクされたファイルセーバーを使用する:

if (window.saveAs) { window.saveAs(blob, name); }
    else { navigator.saveBlob(blob, name); }
于 2015-02-17T10:18:04.467 に答える