2

PDFのコンテンツを表示するjspページを作成しましたが、jspでASCIIコードになってしまいます。pdfの内容をjspで表示したい。私が見逃した部分は何ですか。読んだコンテンツを pdf に書き込もうとすると、ASCII 値のみが表示され、読み取り可能な形式では表示されません

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=${encoding}"></head>

<%@page import="java.io.File"%>
<%@page import="java.io.*"%>
<%@page import="javax.servlet.*"%>
<%@page import="com.itextpdf.text.Image"%>
<%@page import="com.itextpdf.text.Document"%>
<%@page import="com.itextpdf.text.DocumentException"%>
<%@page import="com.itextpdf.text.pdf.PdfReader"%>
<%@page import="com.itextpdf.text.pdf.PdfImportedPage"%>
<%@page import="com.itextpdf.text.pdf.PdfWriter"%>
<%@page import="com.itextpdf.text.pdf.PdfContentByte"%>
<%@ page language="java" contentType="application/pdf; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
    response.reset();
    response.setContentType("application/pdf");
    File file = new File("D:\\TNWRD_Documents\\CHAPTER_II.pdf");
    response.setHeader("Content-Type", "application/pdf");
    response.setHeader("Content-Disposition",
            "inline;filename=Saba_PhBill.pdf");
    response.setContentLength((int) file.length());
    response.setHeader("Content-Type",
            getServletContext().getMimeType(file.getName()));
    response.setHeader("Content-Length", String.valueOf(file.length()));
    //OPen an input stream to the file and post the file contents thru the
    //servlet output stream to the browser
    FileInputStream in = new FileInputStream(file);
    ServletOutputStream outs = response.getOutputStream();
    response.setContentLength(in.available());
    byte[] buf = new byte[8192];
    int c = 0;
    try {
        while ((c = in.read(buf, 0, buf.length)) > 0) {
            //System.out.println("size:"+c);
            outs.write(buf, 0, c);
            out.write(outs.toString());
        }

    } catch (IOException ioe) {
        ioe.printStackTrace(System.out);
    } finally {
        outs.flush();
        outs.close();
        in.close();
    }
%>
</html>
4

3 に答える 3

8

JSP は、ファイルのダウンロードを提供するジョブには不適切なツールです。JSP は、taglibs と EL を使用して HTML 出力を簡単に生成することを目的としたビュー テクノロジとして設計されています。<!DOCTYPE>基本的に、JSP アプローチでは、PDF ファイルが、 etc タグで雑然としている<html>ため、破損しており、有効な PDF ファイルとして認識できません。これは、スクリプトレットの使用が悪い習慣である理由の 1 つです。つまり、物事がどのように機能するかについて完全に混乱しています。この特定のケースでは、ファイル ダウンロード ジョブに通常の Java クラスを使用しています。

代わりにサーブレットを使用する必要があります。以下は、サーブレット 3.0 と Java 7 が利用可能であると仮定したキックオフの例です。

@WebServlet("/foo.pdf")
public class PdfServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        File file = new File("/absolute/path/to/foo.pdf");
        response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-Disposition", "inline; filename=\"foo.pdf\"");
        Files.copy(file.toPath(), response.getOutputStream());
    }

}

(サーブレット 3.0 が利用できない場合はweb.xml 、通常の方法でマップします。Java 7 が利用できない場合は、通常の方法で読み取り/書き込みループを使用します)

このクラス全体をプロジェクトにコピーペーストし、/contextpath/Saba_PhBill.pdf代わりに目的の PDF ファイルを開きます/contextpath/youroriginal.jsp(もちろん、パッケージに整理し、クラスで必要なインポートをオートコンプリートした後)。

たとえば、PDF をインラインで表示する JSP では次のようになります。

<object data="${pageContext.request.contextPath}/Saba_PhBill.pdf" type="application/pdf" width="500" height="300">
    <a href="${pageContext.request.contextPath}/Saba_PhBill.pdf">Download file.pdf</a>
</object>

(<a>リンクは、使用されているブラウザーが HTML ドキュメント内のコンテンツのインライン化をサポートしapplication/pdfていない場合、つまり、Adobe Reader プラグインがインストールされていない場合に、グレースフル デグラデーションを意味します)

以下も参照してください。

于 2013-04-26T18:47:25.500 に答える
2

JSP を使用しないというアドバイスを完全に無視すると仮定すると (BalusC が言うように、もっと良い方法があります)、醜く恥ずべき小さなボッジが私にとってはうまくいきました。すべての適切なヘッダーを設定するわけではありませんが、次のようになります。

<%@ page import="java.io.File" %><%@ page import="org.apache.commons.io.FileUtils" %><%
File pdfFile = (File) request.getAttribute("pdf");
byte[] pdfByteArray = FileUtils.readFileToByteArray(pdfFile);
response.setContentType("application/pdf");
response.getOutputStream().write(pdfByteArray);
response.getOutputStream().flush();
%>

スクリプトレット タグの外側に改行 (またはその他の空白) がないことを確認することが重要です。

彼らは私にそれをさせました、いいですか?

于 2013-09-27T13:05:36.703 に答える
1

私は複数の問題を見ることができました:

  • JSP の上部と下部に余分な html タグがあります。それらをそこに入れたくありません-応答出力にpdfコンテンツのみを含める必要があります。
  • コード セットのコンテンツ タイプは複数回です。それはおそらく根本的な原因ではありませんが、必ず 1 回だけ実行してください (に設定しますapplication/pdf) 。
  • while ループでは、データは最初に応答出力ストリームに書き込まれ、次に出力にtoString()書き込まれます (これは、実際には応答出力ストリームで開かれた Writer インスタンスであり、 の 1 つですouts)。ループ内では応答ストリームのみを使用してください。

    while ((c = in.read(buf, 0, buf.length)) > 0) { outs.write(buf, 0, c);
    }

于 2013-04-26T09:42:51.920 に答える