0

Firefox 19 でサーブレットから PDF ファイルを出力する方法を教えてください。

PDFストリームを出力するサーブレットがあります

.....

public void doPost(HttpServletRequest request, HttpServletResponse response) {




    try {

        String namePDF = "filename.pdf";
        StringBuffer sb = new StringBuffer(request.getScheme());
        sb.append("://").append(request.getServerName());
        if (request.getServerPort() > 0) {
            sb.append(":").append(request.getServerPort());
        }
        sb.append(request.getContextPath()).append("/dirPdf/")
                .append(namePDF);

        OutputStream out = response.getOutputStream();

        Document document = new Document();
        document.setMargins(30, 30, 25, 25);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter pdfWriter = PdfWriter.getInstance(document, baos);

        PdfPageEvents events = new PdfPageEvents();
        pdfWriter.setPageEvent(events);

        // step 2: we set the ContentType and create an instance of the
        // corresponding Writer
        // writer.setEncryption(null, null, PdfWriter.ALLOW_PRINTING,
        // PdfWriter.STANDARD_ENCRYPTION_40);




        document.open();

        compiledModule(request, response, document);


        document.newPage();
        pdfWriter.setPageEmpty(false);

        // chiudo il documento
        document.close();

        int tot = pdfWriter.getPageNumber() - 1;


        PdfReader reader = new PdfReader(baos.toByteArray());
        reader.consolidateNamedDestinations();
        PdfStamper pdfStamper = new PdfStamper(reader,baos);

        //read from module
        reader = new PdfReader(sb.toString());
        reader.consolidateNamedDestinations();

        PdfContentByte cbu = pdfStamper.getUnderContent(tot);
        PdfImportedPage page = pdfStamper.getImportedPage(reader, 2);

        cbu.addTemplate(page, 1, 0, 0, 1, 0, 0);

        pdfStamper.close();

        response.setContentType("application/pdf");
        response.setContentLength(baos.size());
        response.setBufferSize(baos.size());

        baos.writeTo(out);
        out.flush();
        out.close();
    } catch (Exception e) {

        logger.error("", e);
        try {
            /*if (out != null)
                out.close();*/
            response.sendRedirect("../exception.jsp?message="
                    + e.getMessage());
        } catch (IOException ex) {
            logger.error("", ex);
        }
    }
}

....

Internet Explorer と Chrome ではファイルが正しく表示されますが、Firefox 19 では次のエラーが発生します。

「このPDF文書は正しく表示されない可能性があります」

とにかく、Firefox 19 の設定を変更することで達成できる解決策があることは知っています。アプリケーションの多くのユーザーが落胆する可能性があるため、Firefox を表示させるための実用的な回避策があるかどうかを知っておくことをお勧めします。 pdf.

それとも、回避策のないバグですか?

前もって感謝します!

--- 2013/02/28 12:52PM 更新 ---

この問題は、出力ストリームへの ByteArrayOutputStream コピーを使用しているという事実に関連しているようです。outputStream を直接使用すると、すべて正常に動作します。残念ながら、PDFの最後のページを別のページに貼り付ける必要があるため、ByteArrayOutputStreamを使用する必要があります。

4

1 に答える 1

0

私の場合の解決策は、変更して2番目のByteArrayOutputStreamを追加することでした

.....

public void doPost(HttpServletRequest request, HttpServletResponse response) {




try {

    String namePDF = "filename.pdf";
    StringBuffer sb = new StringBuffer(request.getScheme());
    sb.append("://").append(request.getServerName());
    if (request.getServerPort() > 0) {
        sb.append(":").append(request.getServerPort());
    }
    sb.append(request.getContextPath()).append("/dirPdf/")
            .append(namePDF);

    OutputStream out = response.getOutputStream();

    Document document = new Document();
    document.setMargins(30, 30, 25, 25);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
    PdfWriter pdfWriter = PdfWriter.getInstance(document, baos);

    PdfPageEvents events = new PdfPageEvents();
    pdfWriter.setPageEvent(events);

    // step 2: we set the ContentType and create an instance of the
    // corresponding Writer
    // writer.setEncryption(null, null, PdfWriter.ALLOW_PRINTING,
    // PdfWriter.STANDARD_ENCRYPTION_40);




    document.open();

    compiledModule(request, response, document);


    document.newPage();
    pdfWriter.setPageEmpty(false);

    // chiudo il documento
    document.close();

    int tot = pdfWriter.getPageNumber() - 1;


    PdfReader reader = new PdfReader(baos.toByteArray());
    reader.consolidateNamedDestinations();
    PdfStamper pdfStamper = new PdfStamper(reader,baos2);

    //read from module
    reader = new PdfReader(sb.toString());
    reader.consolidateNamedDestinations();

    PdfContentByte cbu = pdfStamper.getUnderContent(tot);
    PdfImportedPage page = pdfStamper.getImportedPage(reader, 2);

    cbu.addTemplate(page, 1, 0, 0, 1, 0, 0);

    pdfStamper.close();

    response.setContentType("application/pdf");
    response.setContentLength(baos2.size());
    response.setBufferSize(baos2.size());

    baos2.writeTo(out);
    out.flush();
    out.close();
} catch (Exception e) {

    logger.error("", e);
    try {
        /*if (out != null)
            out.close();*/
        response.sendRedirect("../exception.jsp?message="
                + e.getMessage());
    } catch (IOException ex) {
        logger.error("", ex);
    }
}

}

....

PdfStamper を使用して自分自身に byteArrayOutputStream を追加する際に問題があるようです。包が1つと2つの包の関係がわかりません。気軽に説明...

于 2013-02-28T13:20:40.267 に答える