web-dev-qa-db-ja.com

新しいウィンドウでPDFストリームを表示する

サーバーで生成しているPDFドキュメントをクライアントで表示します。サーバー側は次のようになります。

ByteArrayOutputStream baos = generatePDF();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=file.pdf");
response.setContentLength(baos.size());
baos.writeTo(response.getOutputStream());

クライアントには、PDFを取得する次のコードがあります。

$.ajax({
    type: "POST",
    url: url,
    data: {"data": JSON.stringify(myData)},
    success: function(data, textStatus, jqXHR) {
        window.open("data:application/pdf," + escape(data));
    },
    error: function(jqXHR) {
        showError("...");
    }
});

見栄えがよく、新しいウィンドウが開きますが、PDFは表示されません。常に空のドキュメントが表示されます。

それでも、クライアントが次のように見える場合、正常に動作します。

var form = $("<form target='_blank'>").attr({
    action : myURL,
    method : "POST"
});
var input1 = $("<input type='hidden'>").attr({
    "name": "data",
    value: JSON.stringify(myData)
});

form.append(input1);
$("body").append(form);
form.submit();
form.remove();

しかし、エラーを管理する必要があるため、2番目の方法を使用することはできず、form.submit()を使用して実行することもできません。

PDFで何が起こっているかについてのアイデアはありますか?

13
Marc Gil Sendra

PDFストリームのbase64文字列を取得し、応答に渡すことができます。

そして、あなたの方法は変わります

$.ajax({
    type: "POST",
    url: url,
    data: {"data": JSON.stringify(myData)},
    success: function(data, textStatus, jqXHR) {
        var pdfWin= window.open("data:application/pdf;base64, " + data, '', 'height=650,width=840');
        // some actions with this win, example print...
    },
    error: function(jqXHR) {
        showError("...");
    }
});
6
Igor Semin

この非同期を行うことはできませんでしたが、このjsは添付ファイルを返します。

$('<iframe src="url"></iframe>').appendTo('body').hide();

その後、ブラウザは保存/表示ポップアップを起動しますが、これは私の要件には適しています。ただし、エラー処理はありません。

私はあなたのサーバー側で、インラインとしてそれを返したいと思うかもしれません。 response.setHeader("Content-Disposition", "inline; filename=file.pdf");

コンテンツの長さをOKに設定しています。成功コードが2回発生する可能性があります。1回目はストリームの最初で、2回目は終了です。

これが機能するかどうかをお知らせください。

0
user326608

使用してみてください:

dataType: "application/pdf",
success: function(data, textStatus, jqXHR) {
    window.open(escape(data), "Title", "");
},
0
Parkash Kumar