2012-03-15 17 views
2

コードスニペットは、質問フライングソーサー/ iTextのPDFファイル

の一番下にある私は正常にサーブレットとフライングソーサーを使用して、クライアントのブラウザでPDFをレンダリングすることができています/ iText。しかし、私はスタイルシートをPDFレンダリングに含める方法を理解できません。

私は次のことを試してみたし、どれもこれまで働いていない:

  • のgetServletContext()getRealPath( "/ PDFservlet.css")とWebのルートディレクトリ
  • で "PDFservlet.css" を入れています。
  • buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>")を入れ、webルートディレクトリに "PDFservlet.css"を入れてください。サーブレットクラスファイルがあり、 "classes"ディレクトリの直下にあるディレクトリ
  • href='\PDFservlet.css'を除いて上記と同じですし、 "PDFservlet.css"私のウェブのルートディレクトリの下に

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

ここで間違っていることを教えていただけますか?

また、私はjava.io.IOException: Stream closedを取得しています。なぜなら、PDFがレンダリングされた後、どこから来たのかわからないからです。

これはローカルで実行中のWebLogic Server 10.3.3をテストしています。代替として私のために働いている文字列の中に、サーバー側のコードのCSSファイルの内容を読み込む

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

は(readFile方法はでジョンスキートの記事をベースにしていHow do I create a Java string from the contents of a file?):

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

これは、代替としてOKのアプローチのように見えるのか?

編集II

私はあなたのいくつかは、すべて一度しばらくの間でで見てみること望んでいるiTextのためのチャットルームを作成しました。 iText/flying-saucerにはいくつかの問題がありましたが、あなたの専門家の助けを借りて解決するのが簡単かもしれないと思います。チャンスがあり、iTextの問題に役立つ可能性のある資料を投稿してください。http://chat.stackoverflow.com/rooms/8945/itext

答えて

1

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

readFile方法がHow do I create a Java string from the contents of a file?のジョンスキートのポストのオフに基づいています):

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

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

1:のURLを設定しますあなたの文書renderer.setDocument(doc, null);と呼びます.2番目のパラメータはベースURLで、リソースはそれに関連して配置されます。

例:あなたの文書が<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);でそれを設定します

  • +0

    "2番目のパラメータはドキュメントのURLです" - 私のドキュメントはOutputStreamでレンダリングされるので、これが何であるか分かりません。今は、サーブレットからiframeにOutputStreamが返されています。 –

    +0

    Flying Saucerには、相対URLを特定するためのベースURLとして何を使用するかを伝えています。 (私はこの情報で私の答えを更新しました) – Adam