0

サーブレットから生成された PDF を印刷しようとすると、google-chrome の印刷プレビューで問題が発生します。エラーはデフォルトの pdf プラグインでのみ表示され、Adobe pdf プラグインで動作します。サーブレットでの pdf 出力のコード:

response.setContentType("application/pdf");
        response.setHeader("Cache-Control","public");
        response.setHeader("Content-Disposition", "inline; filename=\"crreport.pdf\""); 

        /*if (byteArrayInputStream != null){
            byteArray = new byte[1024];
            while((bytesRead = byteArrayInputStream.read(byteArray)) != -1) {
                response.getOutputStream().write(byteArray, 0, bytesRead);  
            }
        }else {
            throw new Exception("byteArrayInputStream is null!");
        }*/

        if (byteArrayInputStream != null){
            byteArray = new byte[byteArrayInputStream.available()];
            byteArrayInputStream.read(byteArray);
            response.setContentLength(byteArray.length);

            response.getOutputStream().write(byteArray);

        }else {
            throw new Exception("byteArrayInputStream is null!");
        }

        System.out.println("End");
        response.getOutputStream().flush();
        response.getOutputStream().close();

生成された pdf をプレビューしようとすると、Chrome のエラー ログ: 予期しない MIME タイプ application/pdf (expected application/x-google-chrome-print-preview-pdf) でプラグインを無視する

ただし、このPDFをChromeページの右下隅にあるデフォルトの保存ボタンで保存し、ローカルマシンから開くと、プレビューが機能します。

私はgoogleitを試しましたが、chrome pdfプラグインに関する多数の質問で有用な情報が見つかりません. これを修正する方法はありますか?

4

2 に答える 2

0

最後に、私の場合の主な問題は何かを突き止めました。Crystal Report for Eclipse プラグインを使用して PDF レポートを生成しようとしました。CR4E で生成された byteArrayInputStream が、Chrome の既定の pdf プラグインでのみ動作しないように何らかの形で破損しているようです。iText ライブラリで回避できます。CR4E byteArrayInputStream に基づいて iText を使用して組み立てられた PDF は、通常、プレビューおよび印刷できます。

于 2012-05-29T13:00:05.033 に答える
0

available as file length の使用は間違っています。定義上、ブロックする (= 次の部分が読み取られるのを待つ) ことなく、すぐに読み取ることができる部分です。それはしばしば長さを与えるかもしれません。応答の出力ストリームを閉じないでください。

    if (byteArrayInputStream == null){
        throw new Exception("byteArrayInputStream is null!");
    }
    ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
    org.apache.commons.io.IOUtils.copy(byteArrayInputStream, byteArrayOS);

    byteArray = byteArrayOS.toByteArray();
    response.setContentLength(byteArray.length);
    response.getOutputStream().write(byteArray);

    System.out.println("End");
    response.getOutputStream().flush();
    //response.getOutputStream().close();

エラーの原因: 両方のプラグインのリソース使用量が異なると、使用可能な動作が異なる可能性があります。

于 2012-05-28T10:09:38.940 に答える