3

コードスニペットは質問の下部にあります

サーブレットと空飛ぶ円盤/iText を使用して、クライアントのブラウザーで PDF を正常にレンダリングできます。ただし、PDF レンダリングに含まれるスタイル シートを取得する方法がわかりません。

私は次のことを試しましたが、これまでのところ何も機能していません:

  • getServletContext().getRealPath("/PDFservlet.css") および "PDFservlet.css" を Web ルート ディレクトリに置く
  • buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>")「PDFservlet.css」をWebルートディレクトリ、サーブレットクラスファイルがあるディレクトリ、「classes」ディレクトリのすぐ下に配置します
  • href='\PDFservlet.css'Webルートディレクトリの下のさまざまな場所に「PDFservlet.css」を配置することを除いて、上記と同じです

ここで他に何を試すべきか、クライアントのブラウザーで PDF がレンダリングされるときにこの CSS シートを認識させる方法がわかりません。

ここで私が間違っていることを教えてもらえますか?

また、java.io.IOException: Stream closedPDF がレンダリングされた後、それがどこから来ているのかわかりません。

これをローカルでテストし、WebLogic Server 10.3.3 を実行しています。

public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws javax.servlet.ServletException, java.io.IOException
{
    resp.setContentType("application/pdf");
    
    StringBuffer buf = new StringBuffer();
    buf.append("<html>");
    
    // put in some style
    buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>");
    
    // generate the rest of the HTML...
    buf.append("<body>");
    buf.append("    <div id='container'>");
    buf.append("        <div id='check_num'>1000</div>");
    buf.append("        <div id='address'><b>Estate Of JAMES SMITH</b><br />35 Addison Avenue<br />New York, NY 00000<br />(123)456-7890</div>");
    buf.append("        <div id='date'><i>Date</i>&#160;<u>02/08/2012</u></div>");
    buf.append("        <div id='void_message'><b>VOID 180 DAYS FROM CHECK DATE</b></div>");
    buf.append("        <div id='pay_line_container'>");
    buf.append("            <div id='pay_line_message'><i>Pay To The Order Of:</i></div>");
    buf.append("            <div id='pay_line'></div>");
    buf.append("            <div id='pay_line_pay_to'>Richard Richards XXIII</div>");
    buf.append("            <div id='pay_line_amount'>$&#160;5.00</div>");
    buf.append("        </div>");
    buf.append("        <div id='pay_line2_container'>");
    buf.append("            <div id='pay_line2'></div>");
    buf.append("            <div id='pay_line2_amount_description'>Five and 00/100</div>");
    buf.append("            <div id='pay_line2_dollars'>DOLLARS</div>");
    buf.append("        </div>");
    buf.append("        <div id='void_stamp'><b>VOID</b></div>");
    buf.append("        <div id='for_line'><i>For:</i>&#160;<u>test</u></div>");
    buf.append("        <div id='bank_info'><b>TD BANKNORTH</b><br />MAINE</div>");
    buf.append("        <div id='signature_line'></div>");
    buf.append("        <div id='bank_numbers'><b>c1000c a123456789a 987654321c</b></div>");
    buf.append("    </div>");
    buf.append("</body>");
    buf.append("</html>");
    
    System.out.println(buf.toString());
    
    // parse our markup into an xml Document
    try {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(new StringBufferInputStream(buf.toString()));
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(doc, null);
        renderer.layout();
        OutputStream os = resp.getOutputStream();
        renderer.createPDF(os);
        os.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

編集 I

サーバー側コードの CSS ファイルの内容を文字列に読み取ることは、代替手段として機能しています (この方法は、ファイルの内容から Java 文字列を作成するにはどうすればよいですか?readFileでの Jon Skeet の投稿に基づいています)。

buf.append("<head><style>");
buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8"));
buf.append("</style></head>");

これは、代替手段として適切なアプローチのように思えますか?

編集Ⅱ

私は iText 用のチャット ルームを作成しました。iText/flying-saucer でいくつかの問題が発生しましたが、専門家の助けを借りて簡単に解決できると思います。機会があれば見てみて、iText の問題に役立つ可能性のある資料を投稿してください: https://chat.stackoverflow.com/rooms/8945/itext

4

2 に答える 2

4

これを解決するには複数の方法があります。1 つはあなたのもので、他は次のとおりです。

1: ドキュメントの URL を設定します。2 番目のパラメータをベース URLと呼びrenderer.setDocument(doc, null);ます。リソースはそれに関連して配置されます。

例:

  • あなたの文書には<link href="my.css" ..
  • css は次の場所にあります。http://example.com/something/my.css
  • あなたは電話するべきですrenderer.setDocument(doc, "http://example.com/something/page.html");

2: UserAgentCallbackインターフェイスを実装し、次のように設定します。renderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);

于 2012-03-16T17:47:25.810 に答える
1

サーバー側のCSSファイルを文字列に読み込むだけで決定しました。

このメソッドは、ファイルのコンテンツから Java 文字列を作成するにはどうすればよいですか?readFileでの Jon Skeet の投稿に基づいています。):

buf.append("<head><style>");
buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8"));
buf.append("</style></head>");
于 2012-03-16T13:10:30.423 に答える